跳至主要内容

疑难解答

#redux 频道Reactiflux Discord 社区 中所有与学习和使用 Redux 相关问题的官方资源。Reactiflux 是一个很棒的地方,可以在这里闲逛、提问和学习 - 加入我们吧!

您也可以在 Stack Overflow 上使用 #redux 标签 提问。

我的视图没有更新!

简而言之,

  • Reducer 永远不应该改变状态,它们必须返回新的对象,否则 React Redux 将无法看到更新。
  • 确保您确实在派发动作。例如,如果您有一个像 addTodo 这样的动作创建器,仅仅调用导入的 addTodo() 函数本身不会有任何作用,因为它只是返回一个动作,但不会派发它。您需要调用 dispatch(addTodo())(如果使用钩子 API)或 props.addTodo()(如果使用 connect + mapDispatch)。

在上下文或 props 中都找不到“store”

如果您遇到上下文问题,

  1. 确保页面上没有重复的 React 实例
  2. 确保项目中没有多个 React Redux 实例/副本。
  3. 确保您没有忘记将根组件或其他祖先组件包裹在 <Provider> 中。
  4. 确保您正在运行最新版本的 React 和 React Redux。

Invariant Violation: addComponentAsRefTo(...): 只有 ReactOwner 可以拥有 refs。这通常意味着您试图将 ref 添加到没有所有者的组件

如果您在 Web 上使用 React,这通常意味着您有一个 重复的 React。按照链接中的说明解决此问题。

我在单元测试中收到有关 useLayoutEffect 的警告

如果在“服务器”上使用 useLayoutEffect,ReactDOM 会发出此警告。React Redux 试图通过检测它是否在浏览器上下文中运行来解决此问题。默认情况下,Jest 定义了足够的浏览器环境,使 React Redux 认为它在浏览器中运行,从而导致这些警告。

您可以通过为单个测试文件设置 @jest-environment 来防止警告

// my.test.jsx
/**
* @jest-environment node
*/

或者通过全局设置它

// package.json
{
"name": "my-project",
"jest": {
"testEnvironment": "node"
}
}

参见 https://github.com/facebook/react/issues/14927#issuecomment-490426131