You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:25:56