3

我正在从我的 React Native 应用程序中删除装饰器(babel 问题太多)并且我的操作不起作用(包含的函数不运行)。

我正在翻译集体诉讼,例如

class MyStore {
  //...

  @action 
  myAction(param) {
    //...
  }
}

class MyStore {
  //...

  myAction(param) {
    action("Perform action with param", (param) => {
      //...
    })
  }
}

将类@action 转换为非装饰器形式的正确方法是什么?

4

2 回答 2

5

您可以将操作定义为

class MyStore {
  //...

  myAction = action(param => {
    //...
  });
}

或使用runInAction()

class MyStore {
  //...

  myAction(param) {
    runInAction(() => {
      //...
    })
  }
}
于 2017-01-17T21:25:07.883 回答
1

将类@action 转换为非装饰器形式的正确方法是什么?

装饰器在运行时评估函数调用,因此简单地手动调用它们将是最直接的事情。@action是一个方法装饰器,方法装饰器在运行时采用以下参数:

  1. 实例方法的类原型(静态方法的构造函数)
  2. 方法名称(属性键)
  3. 方法的属性描述符

考虑到这一点,您可以简单地执行以下操作:

class MyStore {
    myAction(param) {
        // ...
    }
}

// Apply the @action decorator manually:
action(MyStore.prototype, "myAction");

或者:

action(MyStore.prototype, "myAction", Object.getOwnPropertyDescriptor(MyStore.prototype, "myAction"));

如果在类声明之后立即执行此操作,则结果应该与使用装饰器的结果完全相同,而不必使用装饰器语法。

于 2017-01-17T21:41:02.613 回答