[Mobx] Use MobX actions to change and guard state

This lesson explains how actions can be used to control and modify the state of your application. They help you to structure your code base and integrate well with the MobX React Devtools. Actions automatically create transactions, which group changes together.

const {observable, computed} = mobx;
const {observer} = mobxReact;
const {Component} = React;
const DevTools = mobxDevtools.default;

const t = new class Temperature {
  @observable unit = "C";
  @observable temperatureCelsius = 25;

  @computed get temperatureKelvin() {
    console.log("calculating Kelvin")
    return this.temperatureCelsius * (9/5) + 32
  }

  @computed get temperatureFahrenheit() {
    console.log("calculating Fahrenheit")
    return this.temperatureCelsius + 273.15
  }

  @computed get temperature() {
    console.log("calculating temperature")
    switch(this.unit) {
      case "K": return this.temperatureKelvin + "ºK"
      case "F": return this.temperatureFahrenheit + "ºF"
      case "C": return this.temperatureCelsius + "ºC"
    }
  }
}

const App = observer(({ temperature }) => (
  <div>
    {temperature.temperature}
    <DevTools />
  </div>
))

ReactDOM.render(
  <App temperature={t} />,
  document.getElementById("app")
)

We have @Observable and @Computed defined, once we change any @Observable value, we can get new value in the @Computed.

But currently, the way we changing the value is though directly object mutation, such as:

t.unit = "F"

Of course, it is not good enough, what we can do is using @action to change the value:

const {observable, computed, action, transaction, useStrict} = mobx;
const {observer} = mobxReact;
const {Component} = React;
const DevTools = mobxDevtools.default;

useStrict(true);

const t = new class Temperature {
  @observable unit = "C";
  @observable temperatureCelsius = 25;

  @computed get temperatureKelvin() {
    console.log("calculating Kelvin")
    return this.temperatureCelsius * (9/5) + 32
  }

  @computed get temperatureFahrenheit() {
    console.log("calculating Fahrenheit")
    return this.temperatureCelsius + 273.15
  }

  @computed get temperature() {
    console.log("calculating temperature")
    switch(this.unit) {
      case "K": return this.temperatureKelvin + "ºK"
      case "F": return this.temperatureFahrenheit + "ºF"
      case "C": return this.temperatureCelsius + "ºC"
    }
  }

  @action setUnit(newUnit) {
    this.unit = newUnit;
  }

  @action setCelsius(degrees) {
    this.temperatureCelsius = degrees;
  }

  @action("update temperature and unit")
  setTemperatureAndUnit(degrees, unit) {
    this.setCelsius(degrees);
    this.setUnit(unit);
  }
}

const App = observer(({ temperature }) => (
  <div>
    {temperature.temperature}
    <DevTools />
  </div>
))

ReactDOM.render(
  <App temperature={t} />,
  document.getElementById("app")
)

Action can be anynomous action or named action:

@action setCelsius(degrees)
@action("update temperature and unit") // named
时间: 2024-10-14 17:13:22

[Mobx] Use MobX actions to change and guard state的相关文章

mobx

原文地址:https://mobxjs.github.io/mobx/getting-started.html 写在前面:本人英语水平有限,主要是写给自己看的,若有哪位同学看到了有问题的地方,请为我指出,非常感谢: mobx是一个比redux更好的状态管理包,代码量更少,思路更清晰,没有像redux那样复杂的reducer,action (ps: redux的作者也推荐mobx,某大大告诉我的,并没有原话链接) 1.mobx 反应流程 2.the core idea State 是每一个应用程序

【译】Redux 还是 Mobx,让我来解决你的困惑!

原文地址:Redux or MobX: An attempt to dissolve the Confusion 原文作者:rwieruch 我在去年大量的使用了 Redux,但我最近都在使用 Mobx 来做状态(state)管理.似乎现在社区里关于该选什么来替代 Redux 很自然地成为了一件困惑的事.开发者不确定该选择哪种解决方案.这个问题并不只是出现在 Redux 与 Mobx 上.无论何时,只要存在选择,人们就会好奇最好的解决问题的方式是什么.我现在写的这些是为了解决 Redux 和 M

umi + react+ mobx+ typescript项目

umi官网 :https://umijs.org/  支付宝当家大牛云谦搞得框架,不用自己配webpack babel那一堆烦人的东西.而且它约定了路由的规则.非常简单容易上手. mobx  的官网:https://cn.mobx.js.org/   用mobx而不用dva主要是因为 dva的state是一个对象,项目过大对象会巨长 ,而mobx则更灵活.本项目中主要用到了mobx 的如下api 项目目录结构: 原文地址:https://www.cnblogs.com/misswho/p/915

前端随心记---------简单.可扩展的状态管理工具MobX

Mobx是一个功能强大,上手非常容易的状态管理工具.就连redux的作者也曾经向大家推荐过它,在不少情况下你的确可以使用Mobx来替代掉redux. MobX: MobX 是一个经过战火洗礼的库,它通过透明的函数响应式编程(transparently applying functional reactive programming - TFRP)使得状态管理变得简单和可扩展.Mobx 就是一个集中化管理数据的库,类似之前学习的 vuex 和 redux. 为什么要使用它呢? 在单页项目中,实现组

Mobx总结以及mobx和redux区别

Mobx解决的问题 传统react使用的数据管理库为Redux.Redux要解决的问题是统一数据流,数据流完全可控并可追踪.要实现该目标,便需要进行相关的约束 Redux由此引出dispatch action reducer等概念,对state的概念进行强约束,然而对于一些项目来说,太过强,便失去了灵活性.Mobx便是填补此空缺的 这里对Redux和Mobx进行简单的对比: 1.Redux的编程范式是函数式的而Mox是面向对象的: 2.因此数据上来说Redux理想的是immutable,每次都返

Entity Framework Code First - Change Tracking

In this post we will be discussing about change tracking feature of Entity Framework Code First. Change tracking allows Entity framework to keep track of all the changes in entities' data. It might involve adding new entities to entities collection o

RFID 基础/分类/编码/调制/传输

不同频段的RFID产品会有不同的特性,本文详细介绍了无源的感应器在不同工作频率产品的特性以及主要的应用. 目前定义RFID产品的工作频率有低频.高频和甚高频的频率范围内的符合不同标准的不同的产品,而且不同频段的RFID产品会有不同的特性. 其中感应器有无源和有源两种方式,下面详细介绍无源的感应器在不同工作频率产品的特性以及主要的应用. 1. 低频(从125KHz到134KHz)   其实RFID技术首先在低频得到广泛的应用和推广.该频率主要是通过电感耦合的方式进行工作, 也就是在读写器线圈和感应

Redux入门

Redux入门 本文转载自:众成翻译 译者:miaoYu 链接:http://www.zcfy.cc/article/4728 原文:https://bumbu.github.io/simple-redux 本文尝试解释Redux是如何运作的.我们将用Redux创建一个小案列.如果你正在找靠谱的Redux文档,可以去看官方文档. 什么是Redux 来自官方文档的描述:Redux是一个可预测的JavaScript状态容器.换句话说,Redux就是用来处理和管理应用的状态/数据. 如下: 更多图解

[MST] Derive Information from Models Using Views

Redundant data or caching data is a constant source of bugs. MST adheres to the philosophy that no data that can be derived should ever get stored. In this lesson, you will learn how to introduce views that declaratively derive data and which cache d