我想使用mobx而不用装饰器。通常我使用mobx包中的decorate,但在这种特殊情况下,我无法找到使其工作的方法。
原始代码:
import { observable } from 'mobx'
import { create, persist } from 'mobx-persist'
class Order {
@persist('object')
@observable
currentOrder = null
}我试过的是:
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,告诉序列化器没有正确使用。你知道为什么这和上面的不同,不起作用吗?
发布于 2018-07-20 00:41:06
TL;DR
属性解码器需要非常具体的组合实现。
解决方案演示:
全答
属性装饰器基本上是表单的一个功能:
(target, prop, descriptor) => modifiedDescriptor
因此,为了组成两个属性装饰器,需要将1装饰器的结果作为第二装饰器(以及target和prop)的第三个参数传递。
Recompose.compose (与lodash.flowRight一样)将函数从右向左应用,并将结果作为单个参数传递给下一个函数。
因此,您不能使用Recompose.compose来组合装饰器,但是您可以轻松地为装饰器创建一个作曲家:
/* compose.js */
export default (...decorators) => (target, key, descriptor) =>
decorators.reduce(
(accDescriptor, decorator) => decorator(target, key, accDescriptor),
descriptor
);然后用它来组成observable和persist("object")。
/* 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中获得:
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
})https://stackoverflow.com/questions/51259934
复制相似问题