【问题标题】:react redux createSlice or createReducer [closed]反应 redux createSlice 或 createReducer [关闭]
【发布时间】:2021-02-21 21:26:41
【问题描述】:

我是初学者,不知道createSlice和createReducer有什么区别。

我应该选择哪个?

其次,我今天看了一个教程。这家伙刚刚制作了一个 store.js 文件和一个 userslice.js 文件。 非常简单。

但他使它与 redux 文档有点不同。他在 userSlice.js 的末尾导出了三个 CONST,而不是文档中的两个。 (我已发表评论) 如果我把 state.user.user 改成 state.user.wtf……过一会我会运行出错,因为有些组件已经无法访问用户对象了。

用户切片

import { createSlice } from '@reduxjs/toolkit';



export const userSlice = createSlice({
  name: "user",
  initialState: {
    user: null,
  },
  reducers: {
    login: (state, action) => {

      state.user = action.payload;
    },

    logout: (state) => {
      state.user = null;
    },
  },
});

export const { login, logout } = userSlice.actions;

export const selectUser = (state) => state.user.user; // What is that ? and why is it state.user and then a third user Object ???

export default userSlice.reducer;

在应用程序中。 js他发出了那个命令

 const user = useSelector(selectUser);

instead 

  const user = useSelector(state => state.user.user);

我真的不明白其中的区别

store.js 文件

import { configureStore } from '@reduxjs/toolkit';
import userReducer from '../features/userSlice'

export default configureStore({
  reducer: {
    user: userReducer,
  },
});

有人可以解释一下吗。我很困惑

【问题讨论】:

  • 既然你是新手,那么你想要createSlice——这是最简单的方法!像selectUser 这样的选择器函数从整个状态 中选择值,而不仅仅是从这个切片中。在store.js 文件中,这部分reducer: { user: userReducer, }(称为“reducer 映射对象”)意味着整个状态是一个具有user 属性的对象,该属性由userReducer 控制。所以state.user 为您获取用户切片的值。但是我们想要该切片中的user 属性,所以它是state.user.user

标签: redux react-redux redux-toolkit


【解决方案1】:

在您关于createSlicecreateReducer 的问题的第一部分之后:

不知道createSlice和createReducer有什么区别。

阅读 Redux Toolkit 文档是一个很好的帮助来源,它说:

createSlice:一个函数,接受一个初始状态、一个充满reducer函数的对象和一个“切片名称”,并自动生成对应于reducer和状态的动作创建者和动作类型。

createReducer:一个简化创建 Redux reducer 函数的实用程序。它在内部使用 Immer 通过在您的 reducer 中编写“可变”代码来大幅简化不可变更新逻辑,并支持直接将特定操作类型映射到 case reducer 函数,这些函数将在调度该操作时更新状态。

重要声明:

在内部,createSlice 使用 createActioncreateReducer,[...]

您可以将createSlice 理解为一个使用createReducer 的函数或一个助手来绑定东西。

关于你问题的第二部分:

export const selectUser = (state) => state.user.user; // What is that ? and why is it state.user and then a third user Object ???

Selectors 是您在使用 Redux 查看应用程序时发现的一种非常常见的模式。

“选择器”只是一个函数,它接受 Redux 状态作为参数并返回从该状态派生的数据。砰!结束。

你的选择器正在做的是访问你的状态并从那里得到一些东西,可能在 React 组件中使用:

import { useSelector } from 'react-redux';
const App => () => {
  const user = useSelector(selectUser); 
  return <div>My name is {user.name}</div>
}

【讨论】:

  • 谢谢,但为什么是 state.user.user 而不是 state.user (我只是没有得到第三个用户变量)
  • @danielragimov 当他们配置存储并创建“root reducer”时,用户reducer被命名为“user”,即user: userReducer,所以从root状态它是state.user.user user 对象的 user reducer 状态区域。
  • 这意味着我可以在 story.js 文件中做同样的声明并从那里导出对吧?
  • 是的,但我认为没有理由这样做。相同上下文的选择器、动作和归约器放在一起看起来更好。
  • 我认为你应该在对你(你的项目)有意义的地方定义和组织你的选择器。状态选择器必须知道整体状态树结构,而归约器/切片。无论您在何处/如何组织它们,请注意这一点。
猜你喜欢
  • 2021-01-12
  • 1970-01-01
  • 2021-04-14
  • 2019-05-07
  • 2020-01-05
  • 2020-03-26
  • 2019-12-02
  • 2020-07-14
相关资源
最近更新 更多