Redux createStore() 已弃用 - 无法在 Redux 操作中从 getState() 获取状态

2024-03-30

So, the createStore()Redux 现已弃用,并且configureStore()推荐自@reduxjs/工具包 https://redux-toolkit.js.org/.

我很确定这与无法获得有关userInfo状态使用getState()在我的行动中。

getState() of userLogin回报undefined。但是当我删除getState(),该动作有效。

STORE:

import { configureStore } from '@reduxjs/toolkit'
import thunk from 'redux-thunk'
import {
  productAddReducer,
  productDeleteReducer,
  productDetailsReducer,
  productListReducer,
  productUpdateReducer,
} from './reducers/productReducers'
import { composeWithDevTools } from 'redux-devtools-extension'
import {
  userLoginReducer,
  userRegisterReducer,
  userDetailsReducer,
  userListReducer,
  userDeleteReducer,
  userUpdateReducer,
} from './reducers/userReducers'

const reducer = {
  // User
  userLogin: userLoginReducer,
  userRegister: userRegisterReducer,
  userDetails: userDetailsReducer,
  userList: userListReducer,
  userDelete: userDeleteReducer,
  userUpdate: userUpdateReducer,
  // Product
  productAdd: productAddReducer,
  productList: productListReducer,
  productDetails: productDetailsReducer,
  productUpdate: productUpdateReducer,
  productDelete: productDeleteReducer,
}

const userInfoFromStorage = localStorage.getItem('userInfo')
  ? JSON.parse(localStorage.getItem('userInfo'))
  : null

const preLoadedState = {
  userLogin: { userInfo: userInfoFromStorage },
}

const middleware = [thunk]

const store = configureStore({
  reducer,
  preLoadedState,
  middleware,
})

export default store

ACTION:

import axios from 'axios'
import {
  PRODUCT_ADD_FAIL,
  PRODUCT_ADD_REQUEST,
  PRODUCT_ADD_SUCCESS,
  PRODUCT_DELETE_FAIL,
  PRODUCT_DELETE_REQUEST,
  PRODUCT_DELETE_SUCCESS,
  PRODUCT_DETAILS_FAIL,
  PRODUCT_DETAILS_REQUEST,
  PRODUCT_DETAILS_SUCCESS,
  PRODUCT_LIST_FAIL,
  PRODUCT_LIST_REQUEST,
  PRODUCT_LIST_SUCCESS,
  PRODUCT_UPDATE_FAIL,
  PRODUCT_UPDATE_REQUEST,
  PRODUCT_UPDATE_SUCCESS,
} from '../constants/productConstants'

export const addProduct = product => async (dispatch, getState) => {
  try {
    dispatch({ type: PRODUCT_ADD_REQUEST })

    const {
      userLogin: { userInfo },
    } = getState()

// USER INFO IS 'UNDEFINED' - ERROR: CANNOT READ PROPERTY OF DATA
// ACTION WORKS WHEN REMOVING USERINFO FROM THE ACTION

    const config = {
      headers: {
        'Content-Type': 'application/json',
        Authorization: `Bearer ${userInfo.token}`,
      },
    }

    const { data } = await axios.post('/product', product, config)

    dispatch({
      type: PRODUCT_ADD_SUCCESS,
      payload: data,
    })
  } catch (error) {
    dispatch({
      type: PRODUCT_ADD_FAIL,
      payload:
        error.message && error.response.data.message
          ? error.response.data.message
          : error.message,
    })
  }
}

export const listProducts = () => async dispatch => {
  try {
    dispatch({ type: PRODUCT_LIST_REQUEST })

    const { data } = await axios.get('/product')

    dispatch({
      type: PRODUCT_LIST_SUCCESS,
      payload: data,
    })
  } catch (error) {
    dispatch({
      type: PRODUCT_LIST_FAIL,
      payload:
        error.message && error.response.data.message
          ? error.response.data.message
          : error.message,
    })
  }
}

export const listProductDetails = id => async dispatch => {
  try {
    dispatch({ type: PRODUCT_DETAILS_REQUEST })

    const { data } = await axios.get(`/product/${id}`)

    dispatch({
      type: PRODUCT_DETAILS_SUCCESS,
      payload: data,
    })
  } catch (error) {
    dispatch({
      type: PRODUCT_DETAILS_FAIL,
      payload:
        error.message && error.response.data.message
          ? error.response.data.message
          : error.message,
    })
  }
}

export const updateProduct = product => async (dispatch, getState) => {
  try {
    dispatch({ type: PRODUCT_UPDATE_REQUEST })

    const {
      userLogin: { userInfo },
    } = getState()

    const config = {
      headers: {
        'Content-Type': 'application/json',
        Authorization: `Bearer ${userInfo.token}`,
      },
    }

    const { data } = await axios.put(`/product/${product._id}`, product, config)

    dispatch({
      type: PRODUCT_UPDATE_SUCCESS,
      payload: data,
    })
  } catch (error) {
    dispatch({
      type: PRODUCT_UPDATE_FAIL,
      payload:
        error.message && error.response.data.message
          ? error.response.data.message
          : error.message,
    })
  }
}

export const deleteProduct = id => async (dispatch, getState) => {
  try {
    dispatch({ type: PRODUCT_DELETE_REQUEST })

    const {
      userLogin: { userInfo },
    } = getState()

    const config = {
      headers: {
        'Content-Type': 'application/json',
        Authorization: `Bearer ${userInfo.token}`,
      },
    }

    const { data } = await axios.delete(`/product/${id}`, config)

    dispatch({
      type: PRODUCT_DELETE_SUCCESS,
      payload: data,
    })
  } catch (error) {
    dispatch({
      type: PRODUCT_DELETE_FAIL,
      payload:
        error.message && error.response.data.message
          ? error.response.data.message
          : error.message,
    })
  }
}

我是 Redux 维护者,也是添加这句话的人”createStore已弃用”消息:)

根据记录,这与您的实际应用程序代码无关。它is特别是向像您这样使用“plain Redux”的用户传达的消息 - 它试图告诉您,您正在遵循更难使用的模式,我们希望您改用 Redux Toolkit,因为它会让您的生活变得更轻松:)

You'll note that this isn't even a runtime warning being printed in the console - it's literally just a visual indicator in your editor, like createStore.

请参阅这些 Redux 文档页面,了解更多关于为什么我们希望人们使用 Redux Toolkit 编写 Redux 代码以及如何这样做的详细信息:

  • 为什么 Redux Toolkit 就是今天如何使用 Redux https://redux.js.org/introduction/why-rtk-is-redux-today
  • 迁移到现代 Redux https://redux.js.org/usage/migrating-to-modern-redux
  • Redux 基础知识,第 8 部分:使用 Redux 工具包的现代 Redux https://redux.js.org/tutorials/fundamentals/part-8-modern-redux
  • Redux 要点,第 2 部分:Redux 应用程序结构 https://redux.js.org/tutorials/essentials/part-2-app-structure
  • Redux 4.2.0 发行说明 https://github.com/reduxjs/redux/releases/tag/v4.2.0
  • 讨论:关于更改 Redux 包以合并“Redux”和 RTK”的争论(来自我的大量评论) https://github.com/reduxjs/redux/discussions/4326#discussioncomment-6075581
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redux createStore() 已弃用 - 无法在 Redux 操作中从 getState() 获取状态 的相关文章

随机推荐

  • python:防止丢弃函数返回值

    代码中有一个常见错误 人们会这样写 if id query filter row id id 代替 if id query query filter row id id 该代码看起来 有效 并且很难用手识别它们 在 C 中有 nodisca
  • CSS 上的 base64,iVBORw0K.... 是什么? [复制]

    这个问题在这里已经有答案了 我是一个非常新的学习者 我正在学习 php mysql 和 css 我正在阅读许多源代码来了解真正的程序员是如何工作的 在一个网站上 我看到一个源代码 其中有人在 css 上写了以下行 background ur
  • 使用条形码阅读器防止在 Chrome 中打开下载窗口

    我的网站 MVC3 C 和条形码阅读器有这个问题 在我的表格中 我有这样的内容
  • Typescript 类型和 .bind

    我开始深入研究泛型并拥有一个如下所示的通用事件类 export interface Listener lt T gt event T any export class EventTyped lt T gt Array of listener
  • CommonJS 规范中概述的 Define() 协议给我带来了什么?

    我明白事情是怎样的正确的名称间距 https stackoverflow com questions 881515 javascript namespace declaration和模块模式 http www adequatelygood
  • 如何在 JQuery $.each 函数中编辑全局变量?

    好吧 所以这个标题可能不能很好地解释我的问题 希望这是有道理的 这也是我第一个使用 jQuery 的应用程序 所以如果我做了一些愚蠢的事情 请原谅我 我有以下功能 function getRandomImages limit imagesA
  • SQL Server 2005 中“创建用户”所需的权限?

    我正在尝试从我的应用程序中创建 SQL Server 登录名和数据库用户 以及自定义应用程序用户行 我希望这些用户能够创建其他用户 即应用程序将控制谁可以 不能创建用户 但我需要所有用户都具有创建 SQL Server 登录名和数据库用户的
  • 使用 sudo:false 在 Travis-ci 上安装软件包 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何使用 travis yml 中的 sudo false 在 Travis ci 上安装软件包 我有我的 travis yml sudo
  • 使用 CoreBluetooth CBL2CAPChannel 移动数据

    我已经设置了一些数据传输功能 使用CoreBluetooth CBL2CAPChannel in a Swift iOS应用程序 这是发送数据的函数 func sendData outStream OutputStream gt Bool
  • Pyspark DF:如何添加文字空字典“{}”列

    我有 json 文件 其中每一行都是一个 json 对象 其中包含多个字符串和一个字典 str a blah str b blah dict obj 字典对象通常是 dict obj 偶尔包含值 并且很少会从所有 json 行中丢失 例如
  • ng-reflect-model 显示正确的值但未反映在输入中

    遇到一个非常奇怪的问题 我的应用程序在非常特定的用户案例中行为不当 我有一个门户 用户可以在其中添加问题和答案 然后进行编辑 在这种情况下 当我删除一个集合 q a 然后尝试添加它时 模型正在更新 但我的视图从占位符中获取值并自行更新 这里
  • 使用 opencv 调整视频大小并保存

    我正在尝试使用 opencv 重新调整视频大小 然后将其保存回我的系统 代码有效并且不会给出任何错误 但输出视频文件已损坏 我使用的 fourcc 是 mp4v 与 mp4 配合良好 但输出视频仍然损坏 需要帮忙 import numpy
  • 我可以阻止 Blazor 中的导航吗?

    在 Blazor 服务器端应用程序中 是否涉及一些执行实际导航的 javascript 例如当用户点击链接时 我的意思是像window history pushState 理论上是否可以覆盖该 javascript 以防止在某些情况下 当页
  • 当文本发生变化并满足一定条件时更改文本框的前景色

    当文本框中的文本发生变化并满足特定条件时 我需要设置文本颜色 我可以从代码后面实现这个文本框 文本已更改事件和设置笔刷颜色到所需的颜色 但我无法使用 xaml wpf 方法来实现这一点 我是 wpf 新手 我不确定当文本框中的文本更改时如何
  • 如何在 ASP.NET MVC 5 中实现自定义身份验证

    我正在开发 ASP NET MVC 5 应用程序 我有一个现有的数据库 我从中创建了 ADO NET 实体数据模型 我在该数据库中有一个表 其中包含 用户名 和 密码 列 我想使用它们在我的 Web 应用程序中实现身份验证和授权 由于客户的
  • 如何将对齐按钮添加到 Quill 的工具栏?

    我正在尝试将对齐按钮添加到 Quill 编辑器工具栏 工具栏文档 https quilljs com docs modules toolbar 不是很详细 它展示了如何选择对齐选项 但我想要一组并排的切换按钮 这可能吗 你可以做align
  • 在@SpringBootTest中测试@Async注释的方法

    我有一个服务 SomeService 它有一种方法来执行一些逻辑 Override public CompletableFuture
  • 使用 TFS 标签(例如 SourceSafe 标签)

    我们有一个相当标准的发布程序 使用 Visual Source Safe 在发布之前标记构建 这允许我们在出现任何问题时从该标签中获取数据 并在需要更改时使用它进行分支 我们有几个不同的项目 并且总是使用构建版本号进行标记 例如 V1 0
  • KnockoutJS JQuery 组合框绑定

    我想为淘汰赛制作一个绑定 它使用JQuery 自动完成组合框 http jqueryui com demos autocomplete combobox并允许 2 路绑定 http jsfiddle net rniemeyer PPsRC
  • Redux createStore() 已弃用 - 无法在 Redux 操作中从 getState() 获取状态

    So the createStore Redux 现已弃用 并且configureStore 推荐自 reduxjs 工具包 https redux toolkit js org 我很确定这与无法获得有关userInfo状态使用getSta