Reactjs immer推入数组如何触发redux中的更新

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在执行draft.list.push()时没有创建新数组

为什么这是一个建议的方法,而这不适用于redux?spread operator是唯一的解决方案吗?这样做的实际好处是我们确信数组对象不会发生变异


我对这个动作的实际目的有点困惑

如果没有看到任何代码,就不可能说出什么问题,但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')) );
    
    
    你完全正确!非常感谢您的详细解释!你完全正确!非常感谢您的详细解释!