Задать вопрос
@AVasiliev322

Почему не ререндерится компонент react-redux?

Не могу найти ошибку. Создал простейший компонент, при нажатии на кнопку action выстреливает, store меняется, но в компоненте props остаются не измененные. Почему так происходит?

/**Text.js
class Text extends Component {

  render () {
    return(
      <div>
        <p>{this.props.state.date}</p>
        <button onClick={this.props.onSelect}></button>
      </div>
    )
  }
}

export default connect(
  state => ({state: state.text}),
  dispatch => ({
    onSelect(date) {
        dispatch({type: 'SELECT__DATE', payload: '1'});
      }
    })
)(Text);


/**reducer
const innitialState = {
  date: '1'
}
export default function (state = innitialState, action) {
  var newState = Object.assign(state);
  switch (action.type) {
    case 'SELECT__DATE':
      newState.date += action.payload;
      break;
  }
  return newState;
}

/**reducers
export default combineReducers({
  text
});


/**index.js
const middleware = [thunk];
let store = createStore(reducers, applyMiddleware(...middleware));
ReactDOM.render(
  <Provider store = {store}>
    <Text />
  </Provider>,
  document.getElementById('root'));
  • Вопрос задан
  • 172 просмотра
Подписаться 1 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • beONmax
    Профессия Frontend разработчик
    12 месяцев
    Далее
  • beONmax
    Профессия Веб разработчик
    10 месяцев
    Далее
  • Нетология
    Frontend-разработка на React
    10 недель
    Далее
Решения вопроса 1
@davidnum95
Потому что Object.assign первым аргументом принимает целевой объект, а не то что вы подумали. Нужно так:
export default function (state = innitialState, action) {
  switch (action.type) {
    case 'SELECT__DATE':
      return Object.assign({}, state, {
         date: state.date + action.payload,
       });
      break;
  }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
ITK academy Нижний Новгород
от 50 000 до 90 000 ₽
ITK academy Воронеж
от 50 000 до 90 000 ₽