@AleDv

Как отловить изменение пропсов в реакте?

Изучаю реакт. В одном скринкасте советуют отлавливать изменения пропсов в хуке componentWillReceiveProps, однако он теперь депрекейтед и рекомендуют использовать статический метод getDerivedStateFromProps, который должен менять стейт.

Однако, метод вызывается, условие срабатывает, но стейт не меняется.

static getDerivedStateFromProps(props, state) {
        if (props.isOpened !== state.isOpened) {
            return {
                isOpened: props.isOpened
            };
        }

        return null;
    }


Что делаю не так?

UPD. Полный класс компонента

import React, { Component } from 'react';
import './style.sass';

class Article extends Component {
    constructor(props) {
        super(props);

        this.state = {
            isOpened: props.isOpened,
        };

        this.article = props.article;
    }

    // componentWillReceiveProps(nextProps) {
    //     console.log(nextProps.isOpened, this.props.isOpened);
    //
    //     if (nextProps.isOpened !== this.props.isOpened) {
    //         this.setState({
    //             isOpened: nextProps.isOpened
    //         });
    //     }
    // }

    static getDerivedStateFromProps(props, state) {
        if (props.isOpened !== state.isOpened) {
            console.log('getDerivedStateFromProps', props.isOpened, state);

            return {
                isOpened: props.isOpened
            };
        }

        return null;
    }

    handleClick = () => {
        this.setState({
            isOpened: ! this.state.isOpened,
        });
    };

    getDescription = () => {
        return (
            <p>{ this.props.article.description }</p>
        )
    };

    render() {
        return (
            <div className='card article'>
                <div className='card-header'>
                    <h6>{ this.props.article.title }</h6>
                    <button onClick={this.handleClick}
                            className='btn btn-primary btn-sm float-right'>
                        { this.state.isOpened ? 'Закрыть' : 'Открыть' }
                    </button>
                </div>

                <div className='card-body'>
                    { this.state.isOpened ? this.getDescription() : '' }
                </div>
            </div>
        );
    }
}

export default Article;


UPD. Ссылка на песочницу. Нужно, чтобы при реверсе списка статей, описание первой статьи всегда было открыто.
  • Вопрос задан
  • 645 просмотров
Пригласить эксперта
Ответы на вопрос 2
Вы создаёте стейт на основе пропсов, когда можно просто использовать пропсы
Ответ написан
@tervizator
Если ты находишься в class компоненте, то для изменения локальных данных используй setState(), в документации по Реакта он есть
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы