我试图将mobx
塞入我用React 360制作的vr应用程序中。我尝试使用装饰器语法,但是在浪费大量时间尝试实现它之后,决定使用nondecorator语法。这是我遇到问题的mobx文档中遇到的一个示例。这是代码:
import {observer} from "mobx-react";
var timerData = observable({
secondsPassed: 0
});
setInterval(() => {
timerData.secondsPassed++;
}, 1000);
@observer class Timer extends React.Component {
render() {
return (<span>Seconds passed: { this.props.timerData.secondsPassed } </span> )
}
};
ReactDOM.render(<Timer timerData={timerData} />, document.body);
请注意observer
类上的Timer
声明。文档指出了这一点。
请注意,使用@observer作为装饰器是可选的,observer(类Timer ... {})的实现是完全相同的。
这是实现Timer
的正确方法吗?
observer(class Timer extends React.Component {
render() {
return (<span>Seconds passed: { this.props.timerData.secondsPassed } </span> )
}
})
答案 0 :(得分:3)
关于您添加的代码片段,我不知道这是否有效,但是这是我在应用程序项目中使用不带装饰符语法的MobX的方法:
创建您的MobX商店,像下面这样说MyStore.js
:
import {observable, action, computed, decorate} from 'mobx';
export default class MyStore {
storeMap = observable(new Map());
storeArray = observable([]);
storeBoolean = false
get storeMapSize() {
return this.storeMap.size;
}
setStoreBoolean(value) {
this.storeBoolean = value;
}
}
decorate(MyStore, {
storeMap: observable,
storeArray: observable,
storeBoolean: observable
storeMapSize: computed,
setStoreBoolean: action
});
然后在组件Timer.js
中:
import {inject, observer} from "mobx-react";
class Timer extends React.Component {
render() {
return (<span>value from store: { this.props.myStore.storeMap.get('any_key') } </span> )
}
}
export default inject('myStore')(observer(Timer));
,您可以根据需要创建任意数量的商店,并使用相同的inject
方法将它们全部注入到组件中,并通过this.props
以相同的方式使用它们,例如
export default inject('myStore', 'anotherStore', 'anotherNewStore')(observer(Timer));