Я использую Redux в своем приложении, и сначала он работает так, как я хочу. Когда я добавляю что-то в свое состояние через редьюсер, мой компонент перерисовывается так, как я хочу. Но когда я только изменяю значение свойства внутри состояния, мой компонент не перерисовывается.
Если вам нужен код, я могу загрузить его (или некоторые части), но я думаю, что проблема скорее в образе мышления.
Пример моего состояния
state = {
"BaliseSeen": {
"Marseille": [
{
"id": "5566",
"nom": "Notre dame de La Garde",
"type": "Monument",
"vue": true,
},
],
"Toulon": [
{
"id": "1122",
"nom": "Isen Yncrea Méditerranée",
"type": "Monument",
"vue": true,
},
{
"id": "3344",
"nom": "Appartement n°69",
"type": "Monument",
"vue": true,
},
{
"id": "6677",
"nom": "Mairie",
"type": "Info",
"vue": false,
},
],
},
"Medailles": [
{
"ville": "Toulon",
},
],
"User": [],
}
Когда я добавляю что-то новое, оно работает и перерисовывается:
nextState = {...state,
BaliseSeen: {
...state.BaliseSeen, [city]: [...state.BaliseSeen[city], { id: action.value.id, type: action.value.type, nom: action.value.nom, vue: action.value.vue }]
}
}
Но когда я хочу только изменить свойство vue с false на true вот так, это работает (когда я проверяю состояние в приложении, модификация применяется, но мой компонент не перерисовывается:
BaliseSeenIndex = state.BaliseSeen[city].findIndex(item => item.id === action.value.id)
nextState = state
nextState.BaliseSeen[city][BaliseSeenIndex].vue = true
(Я также пытался удалить элемент из своего состояния и добавить его после, но, как и раньше, он работает без рендеринга моего компонента). Поэтому я не знаю, как сказать, что состояние изменено.
nextState = {...state}
должен решить вашу проблему redux.js.org/faq/immutable-data stackoverflow.com/a/48819216/5793132 Если вы действительно хотите изменить состояние, вам не следует использовать избыточность, вместо этого используйте mobX mobx.js.org/the-gist-of-mobx.html - person Uğur Eren   schedule 11.06.2021really
хочет использовать мутации, а также его преимущества и недостатки. Но вы также правы, используя immer op, вы можете просто написать изменяемый код в своем редюсере, но результат все равно будет неизменным. - person Uğur Eren   schedule 11.06.2021