如何在没有装饰器语法的情况下使用mobx反应的“观察者”?

Dan*_*bio 4 javascript reactjs mobx mobx-react

我试图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);
Run Code Online (Sandbox Code Playgroud)

注意类observer上的声明Timer。文档指出了这一点。

请注意,使用@observer作为装饰器是可选的,observer(class Timer ... {})实现的效果完全相同。

这是实现的正确方法Timer吗?

observer(class Timer extends React.Component {
  render() {
    return (<span>Seconds passed: { this.props.timerData.secondsPassed } </span> )
  }
}) 
Run Code Online (Sandbox Code Playgroud)

Mis*_*s94 7

关于您添加的代码片段,我不知道这是否有效,但是这是我在应用程序项目中使用不带装饰符语法的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
});
Run Code Online (Sandbox Code Playgroud)

然后在您的组件中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));
Run Code Online (Sandbox Code Playgroud)

并且您可以根据需要创建任意数量的商店,并使用相同的inject方法将它们全部注入到组件中,并通过来以相同的方式使用它们this.props,例如

export default inject('myStore', 'anotherStore', 'anotherNewStore')(observer(Timer));