首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在没有装饰器的情况下重写这个js类

如何在没有装饰器的情况下重写这个js类
EN

Stack Overflow用户
提问于 2018-07-10 07:57:24
回答 1查看 402关注 0票数 4

我想使用mobx而不用装饰器。通常我使用mobx包中的decorate,但在这种特殊情况下,我无法找到使其工作的方法。

原始代码:

代码语言:javascript
复制
import { observable } from 'mobx'
import { create, persist } from 'mobx-persist'

class Order {
  @persist('object')
  @observable
  currentOrder = null
}

我试过的是:

代码语言:javascript
复制
import { observable, decorate } from 'mobx'
import { create, persist } from 'mobx-persist'
import { compose } from 'recompose'

class Order {
  currentOrder = null
}

decorate(Order, {
    currentOrder: compose(persist('object'), observable),
})

该错误来自于persist,告诉序列化器没有正确使用。你知道为什么这和上面的不同,不起作用吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-20 00:41:06

TL;DR

属性解码器需要非常具体的组合实现。

解决方案演示:

全答

属性装饰器基本上是表单的一个功能:

(target, prop, descriptor) => modifiedDescriptor

因此,为了组成两个属性装饰器,需要将1装饰器的结果作为第二装饰器(以及targetprop)的第三个参数传递。

Recompose.compose (与lodash.flowRight一样)将函数从右向左应用,并将结果作为单个参数传递给下一个函数。

因此,您不能使用Recompose.compose来组合装饰器,但是您可以轻松地为装饰器创建一个作曲家:

代码语言:javascript
复制
/* compose.js */

export default (...decorators) => (target, key, descriptor) =>
  decorators.reduce(
    (accDescriptor, decorator) => decorator(target, key, accDescriptor),
    descriptor
  );

然后用它来组成observablepersist("object")

代码语言:javascript
复制
/* Order.js */

import { observable, decorate, action } from "mobx";
import { persist } from "mobx-persist";
import compose from "./compose";

class Order {
  currentOrder = null;
}

export default decorate(Order, {
  currentOrder: compose(
    observable,
    persist("object")
  )
});

21/8/18 MobX >=4.3.2 & >=5.0.4更新

我为MobX5 & MobX4打开了PRs (已经合并),以便在decorate实用程序函数中支持多个装饰器OOB。

因此,这可以在MobX >=4.3.2 &>= 5.0.4中获得:

代码语言:javascript
复制
import { decorate, observable } from 'mobx'
import { serializable, primitive } from 'serializr'
import persist from 'mobx-persist';

class Todo {
    id = Math.random();
    title = "";
    finished = false;
}
decorate(Todo, {
    title: [serializable(primitive), persist('object'), observable],
    finished: observable
})
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51259934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档