- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
{ this.props.mySynchronousAction-6ren">
所以我们有一个 redux(带有 thunk 中间件)/react 环境。我们有以下代码:
onMyClick = () => {
this.props.mySynchronousActionWhichWillCreateNewReducerState();
this.setState(...my state change which wants to see the new reducer state...);
}
由于代码是同步的,因此不会以这种形式工作。这意味着 React 生命周期永远不会用新的 Prop 更新自己。然而,如果我们这样改变它:
onMyClick = () => {
Promise.resolve(this.props.myActionWichWillCreateNewReducerState())
.then(
() => this.setState(...my state change which want to see the new reducer state...)
);
}
它现在按“预期”工作(调度触发新的 reducer 状态,组件更新,然后 setState 运行)。首先,我认为这个解决方案容易出错并且有效,因为我们通过异步性“赢得”了一点时间,允许更新在 setState 之前启动。但它永远不会失败,(你可以让代码在 Action 中变慢,或者在 reducer 中,在中间件中,在组件更新中,在你想要的任何地方,它仍然有效)。
为什么?
一些解释可能是合理的,为什么我很难理解这一点。更多的是“为什么它会这样工作”而不是“它是如何工作的”
所以首先让我们看看这两段代码,就像普通的 javascript 一样。在这种情况下 - 至少对我来说 - 第一个应该有效,第二个不应该。或者至少第二个应该是模糊的。
首先: 我进行了同步调用(调度->操作创建->存储更改),然后我进行了另一个调用,但第二个无法预期第一个所做的更改。我必须知道 redux 和 react 如何非常密切地运作才能知道如何以及为什么。顺便说一句,你甚至可以改变 redux 存储(大不,不),而不是从 reducer 返回一个新对象来保留引用,但它仍然不起作用。令人难以置信的是,你同步地改变一个对象,然后无法访问之后的变化......
第二个: 在这种情况下(就像 Jaromanda X 评论的那样)我“似乎”告诉代码“嘿,并行运行这两段代码”。现在它起作用了,而且一直起作用。哇。将我对 React 生命周期的理解(看起来很肤浅)添加到组合中会使它更加自相矛盾。因为这意味着更多的逻辑 - react 生命周期更新 - 将不得不“超过”setState 调用才能工作。
如果这不是背后有所有支持和智能的 redux/react 环境,我会说这种代码行为闻起来像 hell ,闻起来像黑魔法和 go-to :)。
最佳答案
当您将一段代码包装在一个 promise 中时,您实际上是在将其执行延迟至少 1 个 tick。对于您的代码,这段时间足以让 reducer dispatch
完成更新。因此,当 then
中的代码被执行时,它获得了更新的值,因为 this.state
是一个对象,即使在闭包中它也总是指向一个内存引用,这将是已更新。
也就是说,redux 中的 reducer update 或 React 中的 setState
都不会返回 promise。您的代码相当于:
Promise.resolve(console.log("dummy")).then(() => console.log("second"));
console.log("first")
first
将始终在 second
之前打印,因为 promisified 片段在事件队列的下一个 tick 中执行。
你的代码目前不容易出错,因为 React 决定 1 个 tick 足以更新状态。但不要依赖于它,因为对于其他一些代码或 React 的更高版本,更新所需的时间可能会改变。
关于javascript - 为什么将 redux 调用包装到 promise 中允许访问结果 "immediately",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59209329/
正在尝试创建一个 python 包。似乎有效,但我收到警告。我的 setup.py 是: #! /usr/bin/env python from distutils.core import setup
我导入了一个数据类型 X ,定义为 data X a = X a 在本地,我定义了一个通用量化的数据类型,Y type Y = forall a. X a 现在我需要定义两个函数, toY 和 fro
我似乎无法让编译器让我包装 Tokio AsyncRead: use std::io::Result; use core::pin::Pin; use core::task::{Context, Po
我有两个函数“a”和“b”。当用户上传文件时,“b”被调用。 “b”重命名文件并返回新文件名。之后应该编辑该文件。像这样: def a(): edits file def b(): r
我使用 Entity Framework 作为我的 ORM,我的每个类都实现了一个接口(interface),该接口(interface)基本上表示表结构(每个字段一个只读属性)。这些接口(inter
有没有办法打开一个程序,通常会打开一个新的jframe,进入一个现有的jframe? 这里是解释,我下载了一个java游戏,其中一个是反射游戏,它在一个jframe中打开,框架内有一堆子面板,我想要做
我想要下面的布局 | AA BBBBBBB | 除非没有足够的空间,在这种情况下 | AA | | BBBBBBB | 在这种情况下,A 是复选框,B 是复选框旁边的 Text
我正在尝试以不同的方式包装我的网站,以便将背景分为 2 部分。灰色部分是主要背景,还有白色部分,它较小并包装主要内容。 基本上我想要this看起来像this . 我不太确定如何添加图像来创建阴影效果,
我正在使用 : 读取整数文件 int len = (int)(new File(file).length()); FileInputStream fis = new FileInputStream(f
我使用 maven 和 OpenJDK 1.8 打包了一个 JavaFX 应用程序我的 pom.xml 中的相关部分: maven-assembly-plugin
我正在使用两个不同的 ItemsControl 来生成一个按钮列表。
我有一个情况,有一个变量会很方便,to , 可以是 TimerOutput或 nothing .我有兴趣提供一个采用与 @timeit 相同参数的宏来自 TimerOutputs(例如 @timeit
我正在尝试包装一个名为 content 的 div与另一个具有不同背景的 div。 但是,当将“margin-top”与 content 一起使用时div,似乎包装 DIV 获得了边距顶部而不是 co
文档不清楚,它似乎允许包装 dll 和 csproj 以在 Asp.Net Core 5 应用程序中使用。它是否允许您在 .Net Core 5 网站中使用针对 .Net Framework 4.6
我被要求开发一个层,该层将充当通用总线,而不直接引用 NServiceBus。到目前为止,由于支持不引人注目的消息,这并不太难。除了现在,我被要求为 IHandleMessages 提供我们自己的定义
我正在尝试包装 getServersideProps使用身份验证处理程序函数,但不断收到此错误:TypeError: getServerSideProps is not a function我的包装看
我有一个项目,它在特定位置(不是/src/resources)包含资源(模板文件)。我希望在运行 package-bin 时将这些资源打包。 我看到了 package-options 和 packag
我正在寻找打印从一系列对象中绘制的 div。我可以通过使用下面的管道语法来实现这一点。 each i, key in faq if (key == 0) |
我在 Meteor.js“main.js - Server”中有这个方法。 Meteor.methods({ messageSent: function (message) { var a
我注意到,如果我的自定义Polymer 1.x元素的宽度比纸张输入元素上的验证错误消息的宽度窄,那么错误将超出自定义元素的右边界。参见下图: 有没有一种机制可以防止溢出,例如在到达自定义元素的边界时自
我是一名优秀的程序员,十分优秀!