官术网_书友最值得收藏!

  • MobX Quick Start Guide
  • Pavan Podila Michel Weststrate
  • 134字
  • 2021-08-05 10:34:25

Decorating actions

The use of decorators is pervasive in MobX. Actions also get special treatment with the @action decorator to mark class methods as actions. With decorators, the Cart class can be written as shown here:

class Cart {
@observable modified = new Date();
@observable.shallow items = [];

@action
addItem(name, quantity) {
this.items.push({ name, quantity });
this.modified = new Date();
}

@action.bound
removeItem(name) {
const item = this.items.find(x => x.name === name);
if (item) {
item.quantity -= 1;

if (item.quantity <= 0) {
this.items.remove(item);
}
}
}
}

In the preceding snippet, we used @action.bound for the removeItem() action. This is a special form that pre-binds the instance of the class to the method. This means you can pass around the reference to removeItem() and be assured that the this value always points to the instance of the Cart.

A different way of declaring the removeItem action with a pre-bound this is with the use of class properties and arrow-functions. This can be seen in the following code:

class Cart {
/* ... */
@action removeItem = (name) => {
const item = this.items.find(x => x.name === name);
if (item) {
item.quantity -= 1;

if (item.quantity <= 0) {
this.items.remove(item);
}
}
}
}

Here, removeItem is a class-property whose value is an arrow-function. Because of the arrow-function, it binds to the lexical this, which is the instance of the Cart.

主站蜘蛛池模板: 黄陵县| 交城县| 鸡西市| 新田县| 原阳县| 霞浦县| 大兴区| 临洮县| 德江县| 定陶县| 峨山| 大方县| 泰州市| 雅安市| 北宁市| 景洪市| 凉城县| 保靖县| 孟村| 滁州市| 丹凤县| 孝感市| 宁陕县| 睢宁县| 确山县| 府谷县| 商南县| 伊通| 合江县| 凉山| 通化县| 灵石县| 慈利县| 远安县| 枣阳市| 江都市| 镇江市| 军事| 北宁市| 耿马| 岳池县|