javascript - Mobx - runInAction() 用法。为什么我们需要它?
问题描述
我已经阅读了有关此主题的各种网站,但我还没有弄清楚为什么我们需要该runInAction
方法以及它是如何工作的。
有人可以向我解释runInAction
功能吗?
谢谢。
解决方案
简短的回答是:你真的不需要 runInAction
. 您可以编写一个应用程序而不使用它,它应该可以正常工作。
但是,如果您正在处理更大的代码库,并且想要强制执行一些最佳实践,则可以使用 mobx 功能“强制操作/严格模式”,它基本上强制对状态的任何修改都必须发生在操作内部。这很有用,因为动作可以很明显地说明状态发生变化的原因,并且它们在 mobx 开发工具中提供了有用的调试信息。
通过使用这个配置标志,如果你试图在一个动作之外修改状态,mobx 会抛出一个错误。
好吧,什么是runInAction
?
这是一个没有的例子runInAction
:
loadWeather = city => {
fetch(
`https://abnormal-weather-api.herokuapp.com/cities/search?city=${city}`
)
.then(response => response.json())
.then(data => {
this.setWeatherData(data); // <==== here
});
};
@action
setWeatherData = data => {
this.weatherData = data;
};
由于我们使用的是严格模式,我们必须定义一个新动作来设置 weatherData。
当必须定义一个动作只使用一次时,这很快就会变得乏味。
这里runInAction
让它变得更短:
loadWeatherRunInThen = city => {
fetch(`https://abnormal-weather-api.herokuapp.com/cities/search?city=${city}`)
.then(response => response.json())
.then(data => {
runInAction(() => {
this.weatherData = data; // <====== We dont have to define an action
});
});
};
因此,基本上,runInAction
获取一段代码并在匿名操作中执行它,而不必手动为其创建操作。
有关更多信息,请查看以下链接:
- https://github.com/mobxjs/mobx/blob/mobx4and5/docs/refguide/action.md#runinactionname-thunk
- https://github.com/mobxjs/mobx/blob/mobx4and5/docs/refguide/api.md#configure
- https://www.leighhalliday.com/mobx-async-actions
编辑:
上面的答案是在 Mobx 4 时代左右。
对于 Mobx 6:
默认情况下,MobX 6 及更高版本要求您使用操作来更改状态。但是,您可以配置 MobX 以禁用此行为。
新文档的链接:
https://mobx.js.org/actions.html#runinaction
https://mobx.js.org/actions.html#disabling-mandatory-actions-
推荐阅读
- python - Python:为什么我们在函数中使用布尔值在我们的主程序中返回打印语句?
- node.js - Express Web API https 服务器在第一次请求时崩溃
- awk - 从使用 sed 获得的部分获取上面的 N 行
- python - 从异常中提取属性?
- pine-script - 创建看涨吞没蜡烛脚本
- python - 关于python 3中格式化的问题
- javascript - 反应状态是未定义的,即使 console.log 显示它
- node.js - 多租户架构实现与部署
- java - 保存成功但更新失败 - 多对多 Spring JPA 与额外列使用 Jointable
- php - 表单验证无法使用 php 和 mysql