不确定如何正确更新 Redux 中的状态

Posted

技术标签:

【中文标题】不确定如何正确更新 Redux 中的状态【英文标题】:Not sure how to update State in Redux properly 【发布时间】:2018-04-03 05:31:06 【问题描述】:

我不确定如何在redux 中正确更新state。我得到重复的条目。

state 是这样的

const STATE = 
    windowOne:  ... 
    windwoTwo:  ... 
    windowThree:  ... 

这是我的减速机之一

export default function reducer(state = STATE, action) 
    switch (action.type) 
        case type.WINDOW_ONE: 
            return 
                ...state,
                windowOne: 
                    ...state.windowOne,
                    foo: action.bar,
                
            
        
    

我将状态映射到我的组件的道具

function mapDispatchToProps(dispatch) 
    return bindActionCreators(combinedActions, dispatch);


const mapStateToProps = state => 
    const  windowOne  = state.windowOne;

    return 
        windowOne,
    ;


export default connect(mapStateToProps, mapDispatchToProps)(SomeComponent);

我在这里结合了各种减速器

export default combineReducers(
    windowOne,
    windowTwo,
    windowThree
);

当我使用redux-logger 时,我看到在windowOne 中复制了整个state。在那里,触发action 后,我找到windowTwowindowThree。我也不确定为什么我必须在这些行中指定windowOne

    const  windowOne  = state.windowOne;

const windowOne = state 还不够吗?这可能是相关的......

【问题讨论】:

【参考方案1】:

检查docs 是否为combineReducers;它负责向每个 reducer 发送适当的状态切片并合并结果。对于所示的 reducer,这意味着您应该只将 windowOne 的初始状态传递给它,并只返回 windowOne 的更新状态:

export default function reducer(state = STATE.windowOne, action) 
    switch (action.type) 
        case type.WINDOW_ONE: 
            return 
                ...state,
                foo: action.bar,
            
        
    

在此之后,mapStateToProps 中的 const windowOne = state 应该可以工作。另请注意,每个reducer 都需要一个默认情况,因为所有reducer 都会接收所有操作,并且STATE 可能更适合命名为initialState

【讨论】:

嗯,我以前也是这样。但是我把它改成了我写的代码,因为我需要在windowOnewindowTwowindowThree之间交换数据。我以为我通过了我的reducer 整个STATE 然后只返回windowOne 部分。这更新了state,并且新创建的数据可以在另一个reducer 中访问,我也通过STATE。用STATE.windowOne,不过,我应该能够访问更新的数据?! 如果使用combineReducers,传入并返回整个状态将在每个***状态属性中创建一个嵌套副本。您可能想要使用单个减速器或使用像 reduce-reducers 这样的包,如 Beyond combineReducers 中所述。

以上是关于不确定如何正确更新 Redux 中的状态的主要内容,如果未能解决你的问题,请参考以下文章

Redux (with React) Reducer switch 语句不更新状态

动作调度不更新 Redux/React 中的状态

使用输入更新 redux 状态

在 Redux 中更新递归对象状态

如何更新 LocalStorage 中持久化的 Redux 状态结构

如何以正确的方式读取组件内的 redux 状态?