为啥reducer函数只返回代理?还原/工具包

Posted

技术标签:

【中文标题】为啥reducer函数只返回代理?还原/工具包【英文标题】:Why reducer function return only proxy? redux/toolkit为什么reducer函数只返回代理?还原/工具包 【发布时间】:2021-04-22 03:48:06 【问题描述】:

状态参数(payload)中我的reducer函数返回唯一的代理:

Proxy i: 0, A: …, P: false, I: false, D: …, …
[[Handler]]: null
[[Target]]: null
[[IsRevoked]]: true

我的切片在哪里是状态代理:

import  createSlice  from "@reduxjs/toolkit";

export const userSlice = createSlice(
  name: "user",
  initialState: 
    currentUser: 
      loggined: false,
      isAdmin: false,
      jwt: false,
    ,
  ,
  reducers: 
    setUser: (state, payload) => 
      console.log(state); // here is problem, but payload works very well
    ,
    clearUser: (state) => ,
  ,
);
export const  setUser, clearUser  = userSlice.actions;

export const currentUser = (state) => state.user.currentUser;

export default userSlice.reducer;

这里是 redux 商店

import  configureStore  from "@reduxjs/toolkit";
import userReducer from "../features/user/userSlice";

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

【问题讨论】:

您的 reducer 不会对状态做任何事情,它们不会返回新状态或(根据 redux 工具包的建议)“改变”状态 immer 草案。 这能回答你的问题吗? Redux Toolkit - I can't update Slice state? 谢谢,伙计们,你能读一下吗:***.com/questions/65765280/… 【参考方案1】:

代理对象

Redux Toolkit 允许您通过使用 Immer 包来“改变”状态,以创建状态的代理草稿版本。你可以在你的 reducer 函数中安全地改变 state 变量,因为它是一个代理对象而不是真实状态。在幕后,您对代理的突变用于返回反映您的更改的状态的新副本。

当您console.log state 变量时,您会看到此代理。您需要使用Immer current function 即included in Redux Toolkit 来记录真实值。

import  createSlice, current  from "@reduxjs/toolkit"; 
reducers: 
  setUser: (state, action) => 
      console.log(action);
      console.log(current(state));
      state.currentUser = action.payload;
  ,

动作与负载

请注意,reducer 的第二个参数是整个 action,而不仅仅是 payload。该操作是具有属性typepayload 的对象。此操作对象是在使用有效负载调用 setUser 时自动创建的。

setUser(loggined: true, isAdmin: false, jwt: "some string")

返回动作


  type: "user/setUser",
  payload: 
    loggined: true,
    isAdmin: false,
    jwt: "some string",
  

您可以将减速器函数编写为setUser: (state, action) => 并访问action.payload,或者您可以将其解构为setUser: (state, payload) => 以获得payload 变量。

【讨论】:

以上是关于为啥reducer函数只返回代理?还原/工具包的主要内容,如果未能解决你的问题,请参考以下文章

Python学习:映射函数(map)和函数式编程工具(filter和reduce)

为啥我创建的MFC工具栏按钮都是灰的

为啥 Redux reducer 被称为 reducer?

compose函数

为啥即使对于“写入时复制”的 const 成员函数也返回代理类?

Charles设置代理之后,为啥电脑和手机都不能上网?