Mobx 中的动作装饰器在严格模式下不起作用

Action decorator in Mobx does not function with strict-mode

我刚开始学习 Mobx 以在我的项目中实现它,我遇到了一个大问题:我似乎不明白操作是如何工作的。

我一直在学习这个不错的教程:https://hackernoon.com/how-to-build-your-first-app-with-mobx-and-react-aea54fbb3265 (the complete code of the tutorial is located here: https://codesandbox.io/s/2z2r43k9vj?from-embed),它运行得很顺利。我试图在我这边做一个小的 React 应用程序,尝试做与提到的教程相同的事情,但它失败了。我确定有一些我没有看到的小细节(因为该应用程序非常简单),因此我将不胜感激。

我也找过和我类似的案例,但是我快速搜索没有找到任何东西(这让我更加认为这个问题无关紧要......)

我的代码是这样的:

import React, { Component } from 'react';
import { decorate, observable, action, configure } from 'mobx';
import { observer } from 'mobx-react';

configure({ enforceActions: 'always' });

class Store {
    my_number = 1;

    addNumber() {
        this.my_number += 1;
    }

    removeNumber() {
        this.my_number -= 1;
    }
}

decorate(Store, {
    my_number: observable,
    addNumber: action,
    removeNumber: action
})

const my_store = new Store();

const Button = (props) => {
    if (props.store.my_number === 1) {
        return (
            <div>
                <button onClick={props.store.addNumber}>+</button>
            </div>
        )
    } else if (props.store.my_number === 4) {
        return (
            <div>
                <button onClick={props.store.removeNumber}>-</button>
            </div>
        )
    } else {
        return (
            <div>
                <button onClick={props.store.addNumber}>+</button>
                <button onClick={props.store.removeNumber}>-</button>
            </div>
        )
    }
}

const ObserverButton = observer(Button);

const DisplayNumber = (props) => {
    return (
        <h1>My number is: {props.store.my_number}</h1>
    )
}

const ObserverDisplayNumber = observer(DisplayNumber);

export class SimpleMobxStore extends Component {
    render() {
        return (
            <div>
                <ObserverButton store={my_store} />
                <ObserverDisplayNumber store={my_store} />
            </div>
        )
    }
}

我开发它的想法是(如果它不好,我也很感激关于如何改进我的想法的建议):

我想要在屏幕上显示一个介于 1 和 4 之间的数字的文本。在这个文本上方我想要一个按钮,允许我通过每次添加或减去一个单位来增加或减少这个数字。我希望将此变量(当前编号)存储在单独的存储区中。该商店将包括:

此外,我将创建两个组件:一个根据当前数字呈现我的按钮的按钮组件,以及一个显示组件。

我的 observable 将是商店中的数字,而这两个方法必须被装饰为动作,因为它们正在改变观察到的变量。

我的按钮和显示组件将成为观察者,因为一旦数字改变它们就必须重新渲染。

通过这个简单的推理和代码,我期望它能够运行,但我得到的是:

错误:[mobx] 由于启用了严格模式,因此不允许在操作之外更改观察到的可观察值。如果需要进行此更改,请将代码包装在 action 中。尝试修改:Store@4.my_number

当我定义 const my_store = new Store(); 时,日志似乎指向了,但这是在教程中完成的,它在那里工作。

知道失败的地方和原因吗?

谢谢

我认为您对商店的操作是直接来自 render() 的。准确地说是标签。尝试在渲染之外使用方法并尝试从那里更改存储状态。