Machez
@Machez
Бу!

Как правильно получать обновленный Store в React Reduxe?

В методе render() компоненты происходит запись данных в Redux Store и сразу после записи сотответствующий объект остается неизмененным. При этом метод componentWillReceiveProps не отрабатывает. Что я делаю не так? Как правильно получать в компоненте измененный Store? Сразу скажу, что ошибок в консоле нет, редьюсер данные получает и возвращает обновленный state!

Отрывок из метода render компоненты ActionsReducers
console.log( this.props.men ); // Изначально UNDEFINED

this.props.addMan( [ { name: 'Альберт', family: 'Эйнштейн' } ] ); // Запись в хранилище

console.log( this.props.men ); // Все равно UNDEFINED


Весь код компоненты ActionsReducers
import React from 'react';
import { connect } from 'react-redux';

import { add as addMan } from './../actions/men';

class ActionsReducers extends React.Component {

    constructor( props ) {

        super( props );

    }

    componentWillReceiveProps( nextProps ) {

        console.log( nextProps );

    }

    render() {

        console.log( this.props.men );

        this.props.addMan( [ { name: 'Альберт', family: 'Эйнштейн' } ] );

        console.log( this.props.men );

        return (
            <div>
                <main>
                    <h1>Действия и редьюсеры</h1>
                    <div>
                        <div className='pure-g'>
                            <div className="pure-u-1-2">
                                <h2>Люди</h2>
                            </div>
                            <div className="pure-u-1-2">
                                <h2>Животные</h2>
                            </div>
                        </div>
                    </div>
                </main>
            </div>
        );
    }

}

function mapStateToProps( store ) {

    return {
        men: store.men,
    }

}

const mapDispatchToProps = {

    addMan

};

export default connect( mapStateToProps, mapDispatchToProps )( ActionsReducers );
  • Вопрос задан
  • 724 просмотра
Решения вопроса 1
rockon404
@rockon404 Куратор тега React
Frontend Developer
В render такие действия выполнять нельзя. Хоть dispatch и выполняется синхронно, свойства получаемые компонентом иммутабельны, а это значит, что компонент получит новые свойства, выполнит все функции жизненного цикла и получит новый массив men, только в следующий render.

Для добавления вашей сущности можно использовать хандлер:
class ActionsReducers extends React.Component {
  handleAddMan = () => {
    this.props.addMan({ name: 'Альберт', family: 'Эйнштейн' });
  };
  
  render() {
    const { men } = this.props;

    return (
      <Wrapper>
        <List>
          {men.map(man => <Man key={man.id} man={man} />)}
          {!men.length && <Empty>No data in list.</Empty>}
        </List>
        <Button onClick={this.handleAddMan}>Add man</Button>
      </Wrapper>
    );
  }
}


Или один из методов жизненного цикла:
class ActionsReducers extends React.Component {
  componentDidMount() {
    this.props.addMan({ name: 'Альберт', family: 'Эйнштейн' });
  }

  render() {
    const { men } = this.props;

    return (
      <Wrapper>
        <List>
          {men.map(man => <Man key={man.id} man={man} />)}
          {!men.length && <Empty>No data in list.</Empty>}
        </List>
      </Wrapper>
    );
  }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы