Редуктор не обновляется

Я пытаюсь обновить свойство объекта, вложенного в массив моего состояния редуктора. Редуктор получает хорошую полезную нагрузку, но, на мой взгляд, не обновляется.

Вот отрывок из того, что я пытаюсь сделать:

//reducers.js

case UPDATE_ROOM_TMP: {
  const roomIndex = state.config.rooms.findIndex(room => room.id === action.payload.id);
  return { 
    ...state, 
    rooms: state.config.rooms.map(
      (room, i) => i === roomIndex ? { ...room, tmp : action.payload.tmp} : room
    )
  }
}

Вот структура состояния редуктора:

config: {
  ...
  rooms: [
    {
      ...,
      tmp: 22
    }
  ]
}

Действие по обновлению редуктора:

export const updateRoomTmp = ({ targetTmp, roomId }) => {
  return {
    type: UPDATE_ROOM_TMP,
    payload: { targetTmp, roomId },
  };
};

Функция, вызывающая действие:

  increaseTmp = () => {
    const tmp = this.props.config.rooms[this.roomIndex].targetTmp + 1
    this.props.updateRoomTmp({targetTmp: tmp, roomId: this.props.room.id});
  }

Текст, представляющий новое значение

  <Text>{this.props.config.rooms[this.roomIndex].targetTmp}</Text>

Как я подключаюсь к конфигу:

const mapStateToProp = ({ allConfig }, props) => {
  const { config } = allConfig;
  return { config };
 };

Таким образом, проблема в том, что при вызове extensionTmp редуктор получает полезную нагрузку, но никогда не обновляется, поэтому текст тоже не обновляется.

Проблемы такого типа часто можно решить с помощью нескольких журналов консоли. В вашем редукторе зарегистрируйте, что вы собираетесь вернуть из функции. В mapStateToProps зарегистрируйте состояние. Используйте JSON.stringify() или util.inspect(), чтобы показать вам все содержимое этих двух объектов. Это скажет вам, соответствует ли ваша форма редуктора ожидаемой форме состояния.

stone 15.11.2018 07:16

Я сделал много console.infos, я не вижу никаких проблем. На самом деле, если бы была проблема с соответствием формы, я бы получил ошибку. Вот почему я не могу определить проблему

rn-dev 15.11.2018 07:31

Хм, верно одно из двух. 1) Реквизиты, получаемые вашим компонентом, неверны. 2) Состояние, получаемое mapStateToProps, не соответствует вашим ожиданиям. Если у вас нет проблемы (2), но у вас есть проблема (1), то либо ваш mapStateToProps работает неправильно (не извлекает нужные данные из состояния), либо он не вызывается / не подключен к компоненту. Консольный журнал this.props в верхней части вашего метода render сообщит вам, когда вы получите новые реквизиты и какие они есть. Консольный журнал mapStateToProps сообщит вам, когда он вызывается.

stone 16.11.2018 01:10

Одна простая ошибка (которую я делаю постоянно) - это забыть использовать подключенный компонент контейнера и вместо этого импортировать компонент представления. Но в этом случае mapStateToProps вообще не будет вызван.

stone 16.11.2018 01:12
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
4
23
1

Ответы 1

Попробуйте сменить reducers.js, например,

case UPDATE_ROOM_TMP: {
const roomIndex = state.config.rooms.findIndex(room => room.id ===action.payload.id);
    return { 
            ...state, 
            config:{
            ...config,
            rooms: state.config.rooms.map( (room, i) => i === roomIndex ? { ...room, tmp : action.payload.tmp} : room)
            }
    }
}

получение конфигурации не определено, пытаюсь выяснить, почему

rn-dev 15.11.2018 06:27

Другие вопросы по теме