【问题标题】:Redux Reducer: Is this an acceptable way to toggle a Boolean from the initial state?Redux Reducer:这是从初始状态切换布尔值的可接受方式吗?
【发布时间】:2020-03-27 07:45:00
【问题描述】:

我有一个对象数组作为初始状态。该数组保存用户问题/响应数据。在 HTML 页面上有一个 material-ui 切换开关来控制问题应该是公开的还是私有的。我知道 redux 建议在 action 中保留逻辑而不是 reducer,但这是我想出的解决方案。 “toggleSwitch reducer”是一个可接受的解决方案还是我创建了一个反模式?

请注意,我使用“reducer helper”而不是“switch 语句”来减少样板代码。 先感谢您。我对 redux 很陌生。

// ACTION
export const toggleQuestion = (questionId) => {
    return {
        type: TOGGLE_QUESTION,
        payload: {
            questionId
        }
    }
}




//REDUCER 
const initialState = [{
        id: '1',
        firstName: 'James',
        lastName: 'Smith',
        question: 'Ask a question here?',
        response: 'This is an answer to the question',
        public: true,
        created: '2019-23-11T01:50:00+00:00',
        modified: null
    },
    {
        id: '2',
        firstName: 'Taylor',
        lastName: 'Johnson',
        question: 'Ask another question here?',
        response: 'Here is another answer to another question',
        public: true,
        created: '2019-23-11T01:50:00+00:00',
        modified: null
    }
];


const toggleSwitch = (state, payload) => {
    return [
        ...state.map((item) => {
            if (item.id === payload.questionId) {
                return Object.assign(item, {
                    public: !item.public
                })
            }
            return item
        })
    ]
}

export default createReducer(initialState, {
    [CREATE_QUESTION]: createQuestion,
    [UPDATE_QUESTION]: updateQuestion,
    [DELETE_QUESTION]: deleteQuestion,
    [TOGGLE_QUESTION]: toggleQuestion
});




// HELPER TO CREATE THE REDUCER
export const createReducer = (initialState, fnMap) => {
    return (state = initialState, {
        type,
        payload
    }) => {
        const handler = fnMap[type];

        return handler ? handler(state, payload) : state
    }

}

【问题讨论】:

  • 旁注:您正在使用 Object.assign 改变状态。应该是Object.assign({}, item, { public: !item.public })。另外,我认为使用[ ...state.map(---) ] 是多余的。您可以删除括号并使用state.map(---)

标签: reactjs redux react-redux reducers


【解决方案1】:

简单的答案是如果你连续 10 次做同样的事情,你会得到同样的结果吗?

reducer 应该是纯净的,没有任何副作用,意味着相同的输入,每次都产生相同的输出。

根据您的示例,在我看来,针对相同状态的相同操作应该会产生相同的输出,所以我会说是的,我认为这没有任何问题。

但是,您可以将该逻辑提取到一个效果,即简单地指示状态作为更新的一部分,新值应该是什么。

尚不清楚您使用的是什么框架,但 React 有 Saga 和 Thunks,Angular 有 NgRX,它为您提供了一个“安全”的地方,可以在 reducer 之外应用副作用。

我经常使用normalizr 创建数据模式,就像数据库一样。然后我使用selectors 从我的商店为我的组件做很多繁重的工作。这让我可以保持我的 reducer 非常简单,并且只真正关心它们处理的 props 的变化。

【讨论】:

  • 谢谢!很有帮助
猜你喜欢
  • 2013-09-02
  • 1970-01-01
  • 2021-01-02
  • 2019-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 2016-02-18
相关资源
最近更新 更多