Reactjs immer推入数组如何触发redux中的更新
我注意到immer在执行draft.list.push()时没有创建新数组 为什么这是一个建议的方法,而这不适用于redux?spread operator是唯一的解决方案吗?这样做的实际好处是我们确信数组对象不会发生变异Reactjs immer推入数组如何触发redux中的更新,reactjs,react-redux,immutability,immer.js,Reactjs,React Redux,Immutability,Immer.js,我注意到immer在执行draft.list.push()时没有创建新数组 为什么这是一个建议的方法,而这不适用于redux?spread operator是唯一的解决方案吗?这样做的实际好处是我们确信数组对象不会发生变异 我对这个动作的实际目的有点困惑如果没有看到任何代码,就不可能说出什么问题,但immer使用push没有什么问题: const{Provider,useDispatch,useSelector}=ReactRedux; const{createStore,applyMiddl
我对这个动作的实际目的有点困惑如果没有看到任何代码,就不可能说出什么问题,但immer使用push没有什么问题:
const{Provider,useDispatch,useSelector}=ReactRedux;
const{createStore,applyMiddleware,compose}=Redux;
const{createSelector}=重新选择;
const{product}=immer;
常量id=((id)=>()=>id++)(4);
常量初始状态={
数据:{
计数器:[
{id:1,计数:0},
{id:2,计数:0},
{id:3,计数:0},
],
},
};
//动作类型
常数增加=‘增加’;
常量ADD='ADD';
//动作创造者
常数增加=(id)=>({
类型:增加,
有效载荷:id,
});
常量添加=()=>({
类型:添加,
});
常数减速机=(
状态=初始状态,
{type,payload}
) => {
如果(类型===增加){
常量索引=state.data.counters.findIndex(
({id})=>id==payload
);
//你确定要回来吗?
返回产品(状态,(草稿)=>{
++draft.data.counters[index].count;
});
}
如果(类型===添加){
//回归新状态
返回产品(状态,(草稿)=>{
//使用arry push on immer draft
draft.data.counters.push({id:id(),count:0});
});
}
返回状态;
};
//选择器
const selectCounters=(state)=>state.data.counters;
const createSelectCounterById=(counterId)=>
createSelector([selectCounters],(计数器)=>
counters.find(({id})=>id==counterId)
);
//使用redux开发工具创建存储
康斯特康塞恩汉斯酒店=
窗口。uuu REDUX_vtools_uextension_uuucompose_uu124; COMPOSE;
const store=createStore(
减速器,
初始状态,
复合致癌物(
applyMiddleware(()=>(下一步)=>(操作)=>
下一步(行动)
)
)
);
常量计数器=React.memo(函数计数器({id}){
const dispatch=usedpatch();
const selectCounter=React.usemo(
()=>createSelectCounterById(id),
[id]
);
常量计数器=使用选择器(selectCounter);
log('rendering:',id);
返回(
{id}:{'}
调度(增加(id))}>
{counter.count}
);
});
常量应用=()=>{
常量计数器=使用选择器(selectCounters);
const dispatch=usedpatch();
返回(
分派(添加())}>
添加计数器
{counters.map((计数器)=>(
))}
);
};
ReactDOM.render(
,
document.getElementById('root'))
);代码>
如果看不到任何代码,就不可能说出问题所在,但immer使用push并没有什么问题:
const{Provider,useDispatch,useSelector}=ReactRedux;
const{createStore,applyMiddleware,compose}=Redux;
const{createSelector}=重新选择;
const{product}=immer;
常量id=((id)=>()=>id++)(4);
常量初始状态={
数据:{
计数器:[
{id:1,计数:0},
{id:2,计数:0},
{id:3,计数:0},
],
},
};
//动作类型
常数增加=‘增加’;
常量ADD='ADD';
//动作创造者
常数增加=(id)=>({
类型:增加,
有效载荷:id,
});
常量添加=()=>({
类型:添加,
});
常数减速机=(
状态=初始状态,
{type,payload}
) => {
如果(类型===增加){
常量索引=state.data.counters.findIndex(
({id})=>id==payload
);
//你确定要回来吗?
返回产品(状态,(草稿)=>{
++draft.data.counters[index].count;
});
}
如果(类型===添加){
//回归新状态
返回产品(状态,(草稿)=>{
//使用arry push on immer draft
draft.data.counters.push({id:id(),count:0});
});
}
返回状态;
};
//选择器
const selectCounters=(state)=>state.data.counters;
const createSelectCounterById=(counterId)=>
createSelector([selectCounters],(计数器)=>
counters.find(({id})=>id==counterId)
);
//使用redux开发工具创建存储
康斯特康塞恩汉斯酒店=
窗口。uuu REDUX_vtools_uextension_uuucompose_uu124; COMPOSE;
const store=createStore(
减速器,
初始状态,
复合致癌物(
applyMiddleware(()=>(下一步)=>(操作)=>
下一步(行动)
)
)
);
常量计数器=React.memo(函数计数器({id}){
const dispatch=usedpatch();
const selectCounter=React.usemo(
()=>createSelectCounterById(id),
[id]
);
常量计数器=使用选择器(selectCounter);
log('rendering:',id);
返回(
{id}:{'}
调度(增加(id))}>
{counter.count}
);
});
常量应用=()=>{
常量计数器=使用选择器(selectCounters);
const dispatch=usedpatch();
返回(
分派(添加())}>
添加计数器
{counters.map((计数器)=>(
))}
);
};
ReactDOM.render(
,
document.getElementById('root'))
);代码>
你完全正确!非常感谢您的详细解释!你完全正确!非常感谢您的详细解释!