useReducer 未同步更新状态的问题

2024-05-01

根据React docs :

当你有复杂的情况时,useReducer 通常比 useState 更好 涉及多个子值或下一个状态时的状态逻辑 取决于前一个。

1.有人可以解释一下为什么吗useReducer不是同步更新状态吗?

const reducer = (state, action) => {
    if( action.type === 'ADD_VALUE') {
        console.log(`STATE IN REDUCER`, [...state, action.path]) // => ["1.1"]
        return [...state, action.path]
    }   
}

const [state, dispatch] = useReducer(reducer, [])

<input type="button" onClick={() => {
    dispatch({ type: 'ADD_VALUE', path: "1.1"})
    console.log(`STATE`, state) // => []
    // here i want to do some stuff based on the lastest updated state (["1.1"] and not [])
    // for example dispatch an action with redux
}}/>

2.我如何根据最新更新的状态(调度 redux 操作)做一些事情(["1.1"]并不是[]) ?


Use useEffect正确访问状态。如果您想要在满足某个条件时调用某些内容,您可以添加一些保护措施。

如果你想跨组件访问你的reducer,你可以使用Context API来存储reducer。请看下面的示例。您可以看到reducer 被注入到父组件的Context 中,然后两个子组件a) 调度一个action b) 接收来自该action 的更新。

1. 跨多个组件使用上下文缩减器的示例

import React from "react";
import ReactDOM from "react-dom";

const Application = React.createContext({
  state: null,
  dispatch: null
});

function ActionComponent() {
  const { dispatch } = React.useContext(Application);
  return (
      <div>
          <div>Action Component</div>
          <button onClick={() => dispatch("lol")}>Do something</button>
      </div>
  );
}

function ListenerComponent() {
  const { state } = React.useContext(Application);
  React.useEffect(
    () => {
      console.log(state);
    },
    [state]
  );
  return <div>Listener Component</div>;
}

function App() {
  const [state, dispatch] = React.useReducer(function(state = [], action) {
    return [...state, action];
  });
  return (
    <Application.Provider value={{ state, dispatch }}>
      <div className="App">
        <ActionComponent />
        <ListenerComponent />
      </div>
    </Application.Provider>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

2. 不使用Application Context的本地reducer示例

const reducer = (state, action) => {
    if( action.type === 'ADD_VALUE') {
        return [...state, action.path]
    }   
}

const [state, dispatch] = useReducer(reducer, [])

React.useEffect(() => {
    console.log(state);
}, [state]);

<input type="button" onClick={() => {
    dispatch({ type: 'ADD_VALUE', path: "1.1"})
}}/>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

useReducer 未同步更新状态的问题 的相关文章

  • Vue.js 中计算属性和普通数据的区别

    我观察到 当一个正常的财产来自data 和从它派生的计算属性通过事件传递 前者保持其反应性 而后者失去它 我为其设置了以下测试用例 也作为 JSFiddle https jsfiddle net christophfriedrich b27
  • 使用 jquery .find() 获取子项

    我有以下标记 div div class item div class item box div class one div div div div class item div class item box div class one d
  • 在 React 中切换 css 类

    如何使用布尔值切换 React 中元素上 css 类的存在 在 Angular 2 中我可以这样做 class red isRed 如何在 React 中做熟悉的事情 在 React 中 元素使用如下语法获取它们的类 div div 但请注
  • 使用 JavaScript 比较两个日期未按预期工作[重复]

    这个问题在这里已经有答案了 这是我的 JavaScript 代码 var prevDate new Date 1 25 2011 the string contains a date which comes from a server si
  • 如何通过 npm 安装包而不设置 package.json

    As per this https stackoverflow com questions 29276345 npm save installed packages as dependencies发布可以先安装 npm 包然后再创建包 js
  • 如何在不使用变换或顶部/左侧的情况下转换列表中项目的位置

    有一天我偶然发现一个例子 https codepen io itslit pen gvKrMY它使用 Vue js 但我的问题更多是关于 Vue 用于实现状态之间转换的 CSS 和 HTML 卡片暂时获得等级 shuffleMedium m
  • 当焦点/单击[重复]时选择 contenteditable div 中的所有文本

    这个问题在这里已经有答案了 我有 contenteditable div 如下 div style border solid 1px D31444 12 some text div 我需要的是 当我点击 div 时 所有文本都会自动被选中
  • 颜色逻辑算法

    我们正在构建一个体育应用程序 并希望将团队颜色融入到应用程序的各个部分 现在 每个团队都可以使用几种不同的颜色来表示 我想做的是执行检查以验证两个团队颜色是否在彼此一定的范围内 这样我就不会显示两个相似的颜色 因此 如果团队 1 的主要团队
  • 使用 JS 在 Angular 中创建删除按钮的确认警报

    我有一个带有删除按钮的表单 我想创建一个单击删除按钮时弹出的确认框 删除按钮当前有效 我在 javascript 中尝试了一些方法 但没有成功 我正在使用角度 这是最好的方法吗 另外 有谁知道这方面的任何例子 我还没有找到任何有效的例子 d
  • 将鼠标悬停时的鼠标光标更改为锚状样式

    如果我将鼠标悬停在div鼠标光标将更改为 HTML 锚点中的光标 我怎样才能做到这一点 假设你的div has an id myDiv 将以下内容添加到您的 CSS 中 这cursor pointer指定光标应与用于锚点 超链接 的手形图标
  • Javascript 函数查找数字的倍数

    创建一个名为的函数multiplesOf 它将接受两个参数 第一个参数是数字数组 第二个参数是数字 该函数应返回一个新数组 该数组由参数数组中的每个数字组成 该数字是参数数字的倍数 So multiplesOf 5 6 7 8 9 10 3
  • 以编程方式填写reactjs表单

    我正在编写一个用户脚本 但无法填写由reactjs制作的表单 我的代码 document querySelector id username value email protected cdn cgi l email protection
  • 如何在react-bootstrap中禁用表单提交的

    在下面的代码片段中 我有许多文本类型的输入表单 如果用户点击 我似乎会得到相同的合成事件 就像他们按下提交按钮一样 我想忽略作为表单提交 只允许一个人按下 提交 按钮 我删除了一些表单组以减少示例 在所有情况下 按钮或 ENTER 键 e
  • 可以在初始 DOM 解析期间/之前修改 DOM 吗?

    是否可以在初始 DOM 解析期间或之前修改 DOM 或者我是否必须等到 DOM 被解析和构建之后才能与其交互 更具体地说 是否有可能阻止 DOM 中的脚本元素使用用户脚本 内容脚本或 Chrome 或 Firefox 中的类似脚本运行 在解
  • 在打字稿中导入 json

    我是 typescript 的新手 在我的项目中 我们使用 typescript2 在我的要求之一中 我需要导入 json 文件 所以我创建了 d ts 文件如下 test d ts declare module json const va
  • 隐藏 Div 的父级

    我只是想隐藏父divcomments section div class content content green div div div 我试过这个 document getElementById comments section pa
  • Bootstrap按钮加载+Ajax

    我正在使用 Twitter Bootstrap 的按钮加载状态 http twitter github com bootstrap javascript html buttons http twitter github com bootst
  • 防止 iOS 键盘在 cordova 3.5 中滚动页面

    我正在使用 Cordova 3 5 和 jQuery mobile 构建 iOS 应用程序 我在大部分应用程序中禁用了滚动功能 但是 当我选择输入字段时 iOS 键盘会打开并向上滚动页面 我不想要这个功能 由于输入足够高 键盘不会覆盖它 我
  • 如何纠正流警告:解构(缺少注释)

    我正在编写一个小型 React Native 应用程序 并且正在尝试使用 Flow 但我无法在任何地方真正获得有关它的正确教程 我不断收到错误 destructuring Missing annotation 有关 station 这段代码
  • 设置 cookie 时中断 JavaScript 执行

    当设置 cookie 时 是否可以始终中断浏览器开发人员工具中的 javascript 执行 无需显式设置 JS 断点 document cookie 在 html head 块的开头添加此代码片段效果很好

随机推荐

  • OCI 已弃用 Helm Chart 导出命令

    Helm 最近删除了命令 helm Chart Export 有谁知道它的替代品是什么 我们曾经将它用于 ACR 注册表 helm registry login reponame login pass helm chart pull rep
  • 以编程方式设置文本后,自动链接检测在 NSTextView 中不起作用

    我有一个启用了自动链接检测的 NSTextView 当我以编程方式设置文本时 myTextView setString http google com 它不会自动显示链接 如果我在文本视图中输入任何内容 它将添加链接 我希望它添加链接 不得
  • Moq-ing 类或接口有什么区别?

    我一直在使用moq http code google com p moq 在我的单元测试中模拟对象 我在关于最小起订量的网站上看到它能够模拟类和接口 有一天 我与我的一位同事进行了讨论 他们表示没有理由模拟类 我应该只模拟接口 我对此并没有
  • 使用 Vagrant 配置机器并在脚本停止处拾取时是否可以重新启动机器?

    我正在阅读 bash 中的教程 其中他们说重新启动机器 没有直接重新启动服务的选项 这是重新启动机器的问题 然后还有更多命令在配置时仍然需要运行 那么有没有办法在配置过程中重新启动盒子 然后从上次中断的地方继续进行呢 据我所知 如果尝试重新
  • 棒棒糖中的 takePicture 失败

    以下代码正在使用 可在后台拍照 它对于棒棒糖以下的所有版本都工作正常 但在以下版本中给出运行时异常takePicture null null mcall 有任何想法吗 public void takePictures final int d
  • 是否可以强制 Visual Studio 2010 使用 Visual Basic 10?

    要重现我收到的错误 在 Visual Basic 中创建一个新的 Visual Studio 2010 ASP NET 网站 面向 NET 2 0 输入 公共财产测试作为字符串 请注意 Visual Basic 9 0 不支持自动实现的属性
  • C++ 中的类型作为返回类型

    是否有可能从函数返回一个类型作为返回类型 并将其用作成员变量 如下所示 constexpr type myFunction int a int b if a b 8 return int 8t if a b 16 return int 16
  • jQuery UI - 可拖动在放置后无法立即工作

    HTML div class character list div class character list container div img class 1 src http ahna web44 net img charas 13 p
  • 如何从 CGImage 获取原始像素数据[重复]

    这个问题在这里已经有答案了 如何在缩放和移动后获取UIimage的像素数据 我想获取CGImage像素数据 然后从CGImage像素数据中获取UIImage 我们该怎么做 您可以通过调用获取原始数据 CFDataRef rawData CG
  • 如何使用 VueJS router-link 活动样式

    我的页面当前有 Navigation vue 组件 我想让每个导航悬停并处于活动状态 这hover有效但是active没有 这是 Navigation vue 文件的样子
  • 在项目中管理多种语言的良好解决方案

    我们需要为我们的应用程序管理大量 大约 20 多种 语言 对于之前需要较少语言 3 4 的项目 我们使用了一个简单的 Excel 电子表格 并将其发送给各个翻译人员 由他们填写字符串的翻译 面对如此多的语言以及需要多名翻译人员的参与 是否有
  • 如何在 C# 正则表达式中获取捕获组的名称?

    有没有办法在 C 中获取捕获组的名称 string line No 123456789 04 09 2009 999 Regex regex new Regex
  • 警告:从不兼容的指针类型为链接列表数组赋值

    我正在执行一个 C 程序 但收到警告 警告 来自不兼容指针类型的赋值 我在这里复制相关代码 Structure I am using typedef struct graph node int id int weight struct no
  • 如何将 DataTable/DataSet 转换为 ObjectDataSource

    我有一个与 ObjectDataSource 绑定的 GridView 我有一个返回数据表的方法 如何将 DataTable 提供给 ObjectDataSource 以便在代码中更新 GridView Example protected
  • 如何从 JSF 表单中进行 Spring Security 身份验证

    我创建了一个简单的 JSF 登录页面 并尝试将其与 spring security 集成 这是来自的表单元素登录 xhtml
  • Python Popen grep

    我希望 Popen 执行 grep i line buffered grave data txt 当从 shell 运行时 这给了我想要的结果 如果我开始 在我测试的同一目录中grep 一个 python repl 并遵循文档中的说明 ht
  • Linux 上的 Chrome - 查询浏览器以查看打开了哪些选项卡?

    我在 Ubuntu Linux 上运行 Chromium 开源 chrome 版本 我可以编写一个程序来查看我打开了哪些选项卡吗 我想编写一个程序来监控我在事情上花费了多少时间 是否有命令行程序 某种调用 chromium browser
  • postgres 中简单更新查询出现死锁

    我正在使用 postgres 9 1 并在过度执行简单更新方法时出现死锁异常 根据日志 死锁是由于同时执行两个相同的更新而发生的 更新 public vm action info 设置last on demand task id 1 ver
  • php.ini 更改,但在 Ubuntu 上无效

    我想更改 PHP 上传文件大小的限制 这是我的输出的一些信息phpinfo https www php net manual en function phpinfo php Configuration File php ini Path e
  • useReducer 未同步更新状态的问题

    根据React docs 当你有复杂的情况时 useReducer 通常比 useState 更好 涉及多个子值或下一个状态时的状态逻辑 取决于前一个 1 有人可以解释一下为什么吗useReducer不是同步更新状态吗 const redu