redux reducers 中的函数可以吗?

Is functions in redux reducers ok?

我正在用 Redux-Sagas 编写一些 reducer,我对此很陌生,我们现在拥有的所有 reducer 都没有我即将要做的事情。开始质疑自己这样做对不对。

在这种情况下,我有一个 INITIAL_STATE,它包含一个 dataProp,这个数据有一个 prop,它是一个用户数组。现在我创建一个 editUser 表单,当用户更新时,我会取回更新后的用户。在 ReactView 中更新该用户,我这样做:

const updateUser = (users, user) => {
                //Update user and return array
               };

   [actions.updateUserSuccess]: (state, payload) => ({
            ...state,
            viewData: {
                ...state.viewData,
                users: updateUser(...state.viewData.Users, payload)
            },
            loadingUser: false,
        }),

问题是,在 reducer 文件之上放置一个方法来处理这样的事情是否可以?

当然,这完全没问题,事实上 we have a docs page on "SplittingReducer Logic" 甚至谈到了这一点。

也就是说,您确实应该使用our official Redux Toolkit package来编写您的 Redux 逻辑。它将极大地简化 all 你的 Redux 代码。特别是,它使用 Immer 让您在 reducer 中编写“可变”语法,并将其转换为安全且正确的不可变更新。没有更多的对象传播!

您可以创建任何辅助函数并在您的 reducer 中使用它们。

只要您 DON'T mutate 直接在您的 reducer 或那些函数中声明,就可以了。

在传统的 switch..case reducer 中使用类似函数时,您必须始终非常注意这些函数是否“安全”,这意味着它们不能修改任何内容并且必须 return 修改后的副本原来的。

我建议将该缩减器重构为 "modern Redux" createSlice 缩减器,因为在这些缩减器中,您可以毫无问题地修改所有对象——而且这种缩减器样式是自 2019 年以来所有 Redux 代码的官方推荐。在这样的reducer中你可以使用所有的功能而不必太在意。

当然你还是应该避免副作用,这对所有的 reducer 都是一样的。