Я пытаюсь обновить свойство объекта, вложенного в массив моего состояния редуктора. Редуктор получает хорошую полезную нагрузку, но, на мой взгляд, не обновляется.
Вот отрывок из того, что я пытаюсь сделать:
//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 редуктор получает полезную нагрузку, но никогда не обновляется, поэтому текст тоже не обновляется.
Я сделал много console.infos, я не вижу никаких проблем. На самом деле, если бы была проблема с соответствием формы, я бы получил ошибку. Вот почему я не могу определить проблему
Хм, верно одно из двух. 1) Реквизиты, получаемые вашим компонентом, неверны. 2) Состояние, получаемое mapStateToProps, не соответствует вашим ожиданиям. Если у вас нет проблемы (2), но у вас есть проблема (1), то либо ваш mapStateToProps работает неправильно (не извлекает нужные данные из состояния), либо он не вызывается / не подключен к компоненту. Консольный журнал this.props в верхней части вашего метода render сообщит вам, когда вы получите новые реквизиты и какие они есть. Консольный журнал mapStateToProps сообщит вам, когда он вызывается.
Одна простая ошибка (которую я делаю постоянно) - это забыть использовать подключенный компонент контейнера и вместо этого импортировать компонент представления. Но в этом случае mapStateToProps вообще не будет вызван.





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