Redux状态变更未触发React组件重渲染问题求助
问题:Redux状态变更未触发React组件重渲染
我遇到了Redux状态变更未触发React组件重渲染的问题,以下是实现代码及场景说明:
1. Pairings实体适配器代码
这是名为pairings的适配器
import { createEntityAdapter } from '@reduxjs/toolkit'; // 目前使用行ID作为Pairing_ID(因原ID不存在) export const pairingsAdapter = createEntityAdapter({ selectId: (pairing) => pairing.Pairing_ID.Pairing_ID }); export const { selectAll: selectAllPairings, selectById: selectPairingById, } = pairingsAdapter.getSelectors(state => state.pairing);
2. Pairings切片代码
这是对应的slice
import { createSlice } from '@reduxjs/toolkit'; import { pairingsAdapter } from './pairingsAdapter.js'; const initialState = pairingsAdapter.getInitialState({ // 可在此添加额外属性 }); const pairingsSlice = createSlice({ name: 'pairings', initialState, reducers: { addPairing: pairingsAdapter.addOne, addManyPairings: pairingsAdapter.addMany, removePairing: pairingsAdapter.removeOne, }, }); export const { addPairing, addManyPairings, removePairing } = pairingsSlice.actions; export default pairingsSlice.reducer;
3. 组件实现逻辑
通过遍历pairings数据渲染包含两个拖拽卡片的行,Pairings组件代码如下:
const Pairings = () => { // REDUX状态队列 const boxMakerQueue = useSelector(selectAllBoxMakers) const productWrapperQueue = useSelector(selectAllProductWrappers) const pairingsQueue = useSelector(selectAllPairings) return( <> {pairingsQueue.map((pairing, index) => { const rowID = pairing.Pairing_ID.Pairing_ID; // 查找对应的boxMaker(如果存在) const boxMaker = pairing.BoxErector_WorkCenter ? boxMakerQueue.find(bm => bm.WorkCenter.WorkCenter_ID === pairing.BoxErector_WorkCenter.WorkCenter_ID) : null; // 查找对应的productWrapper(如果存在) const productWrapper = pairing.ProductWrapper_WorkCenter ? productWrapperQueue.find(pw => pw.WorkCenter.WorkCenter_ID === pairing.ProductWrapper_WorkCenter.WorkCenter_ID) : null; // 设置卡片属性 let rightCardProps, leftCardProps; // 如果boxMaker存在,赋值右侧卡片属性 if (boxMaker) { rightCardProps = [ <HorizontalCard type={'BoxMaker'} object={boxMaker}/>, boxMaker.WorkCenter.WorkCenter_ID ]; } // 否则赋值空值 else { rightCardProps = [null, null]; } // 如果productWrapper存在,赋值左侧卡片属性 if (productWrapper) { leftCardProps = [ <HorizontalCard type={'ProductWrapper'} object={productWrapper}/>, productWrapper.WorkCenter.WorkCenter_ID ]; } // 否则赋值空值 else { leftCardProps = [null, null]; } return ( <WorkCenterAssignmentEditRow key={index} rowID={rowID} leftCardProps={leftCardProps} rightCardProps={rightCardProps} /> ); })} </> ) }
行组件的核心结构如下:
<DroppableArea onDrop={handleCardDrop} type={itemType} area={rowID}> <Grid container spacing={2}> <Grid item xs={6}> <DraggableCardWrapper type={itemType} cardID={leftCardID} sourceRowID={rowID}> {leftCard} </DraggableCardWrapper> </Grid> <Grid item xs={6}> <DraggableCardWrapper type={itemType} cardID={rightCardID} sourceRowID={rowID}> {rightCard} </DraggableCardWrapper> </Grid> {isRowEmpty && <EmptyRowPlaceholder />} </Grid> <DashedHorizontalLine/> </DroppableArea>
4. 问题触发场景
卡片拖拽完成时,调用dispatch(removePairing(sourceRowID))从Redux中移除对应的pairing,通过console.log可确认Redux状态已成功修改,但Pairings组件并未触发重渲染。后续计划用reselect优化性能,但当前需先解决组件不重渲染的问题,请求帮助。
内容的提问来源于stack exchange,提问作者RedRum69
相关产品推荐
相关产品推荐

