Javascript <;Redux>;状态已更新但未重新渲染

Javascript <;Redux>;状态已更新但未重新渲染,javascript,reactjs,react-native,redux,Javascript,Reactjs,React Native,Redux,我刚开始学习React Native+Redux。看起来我成功地更新了状态,但是视图没有改变(没有重新渲染)。谁能给我一个建议来解决这个 我尝试使用console.log进行调试并点击屏幕 “SelectedEnumap”:对象{ “第2项”:正确, “第3项”:错误, "}, 这只是日志的一部分,我可以看到状态实际上发生了变化 Reducer.js 从'/actions.js'导入{SELECT_MENU}; 常量初始状态={ 菜单: [ {键:'item1',标题:'AAA', 详情:[ {

我刚开始学习React Native+Redux。看起来我成功地更新了状态,但是视图没有改变(没有重新渲染)。谁能给我一个建议来解决这个

我尝试使用console.log进行调试并点击屏幕

“SelectedEnumap”:对象{ “第2项”:正确, “第3项”:错误, "}, 这只是日志的一部分,我可以看到状态实际上发生了变化

Reducer.js
从'/actions.js'导入{SELECT_MENU};
常量初始状态={
菜单:
[
{键:'item1',标题:'AAA',
详情:[
{key:'detail_item1',title:'AA',price:'1000',time:'30'},
{键:'detail_item2',标题:'AB',价格:'1100',时间:'35'},
{key:'detail_item3',title:'AC',price:'1200',time:'40'},
]},
{键:'item2',标题:'BBB',
详情:[
{key:'detail_item1',title:'BA',price:'1000',time:'30'},
{键:'detail_item2',标题:'BB',价格:'1100',时间:'35'},
{key:'detail_item3',title:'BC',price:'1200',time:'40'},
]},
{键:'item3',标题:'CCC',
详情:[
{key:'detail_item1',title:'CA',price:'1000',time:'30'},
{键:'detail_item2',标题:'CB',价格:'1100',时间:'35'},
{键:'detail_item3',标题:'CC',价格:'1200',时间:'40'},
]},
],
SelectedEnumap:{}
};
函数菜单列表(状态=初始状态,操作){
开关(动作类型){
案例选择菜单:
console.log('state');
让newState=Object.assign({},state);
newState.selectedMenuMap[action.key]=!state.selectedMenuMap[action.key];
console.log(newState==state);
返回新闻状态;
违约:
返回状态;
}
}
导出默认菜单列表;
Object.assign()
只执行浅层复制。因此,此语句无法按预期工作

  let newState = Object.assign({}, state);
虽然
newState
state
是不同的对象,但嵌套的
newState.selectedEnumap
指向与
state.selectedEnumap
相同的对象。如果不同时对两者进行变异,则无法对其中一个对象进行变异

相反,请确保不修改原始状态。类似的操作应该可以正常工作

const newState = { ...state,
  selectedMenuMap: { ...state.selectedMenuMap,
    [action.key]: !state.selectedMenuMap[action.key]
  }
}
每个排列操作
{…foo}
执行的操作与
对象相同。分配({},foo)
,因此我们创建了
状态
状态的浅层副本。SelectedEnumap
。现在是
状态。SelectedEnumap
新闻状态。SelectedEnumap
指向不同的对象,redux将知道连接到状态树这一部分的组件应该被重新引用

这看起来有点复杂,可能不太清楚原始状态是否在这里发生了变异

在更新嵌套状态片时,避免改变现有状态的一种方法是使用诸如Ramda.js之类的库,它从不改变作为参数传入的对象

const newState = R.over(R.lensPath(['selectedMenuMap', action.key]), R.not, state)

您还可以为MenuList组件添加代码吗?redux代码似乎是correct@dentemm谢谢你的帮助!成功了!