Декоратор действий в Mobx не работает в строгом режиме - PullRequest
0 голосов
/ 29 апреля 2019

Я только начал изучать Mobx для его реализации в своих проектах, и я столкнулся с большой проблемой: мне кажется, я не понимаю, как работают действия.

Я следовал этому хорошему учебнику: https://hackernoon.com/how-to-build-your-first-app-with-mobx-and-react-aea54fbb3265 (полный код учебника находится здесь: 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. Над этим текстом я хочу иметь кнопку, которая позволяет мне увеличивать или уменьшать это число, добавляя или вычитая единицу каждый раз. Я хочу, чтобы эта переменная (текущий номер) была сохранена в отдельном хранилище. Этот магазин будет включать в себя:

  • Мой номер
  • Способ увеличения числа
  • Метод уменьшения числа

Кроме того, я создам два компонента: компонент кнопки, который отображает мою кнопку в зависимости от текущего номера, и компонент отображения.

Моим наблюдаемым будет число в магазине, тогда как два метода должны быть оформлены как действия, так как они изменяют наблюдаемую переменную.

Мои компоненты кнопок и дисплея будут наблюдателями, так как они должны быть перерисованы после изменения номера.

С этим простым рассуждением и кодом я ожидал, что он заработает, но вместо этого я получаю:

Ошибка: [mobx] Так как строгий режим включен, изменение наблюдаемых наблюдаемых значений вне действий не допускается. Пожалуйста, оберните код в action, если это изменение предназначено. Пытался изменить: Store@4.my_number

Журнал, кажется, указывает, когда я определяю const my_store = new Store();, но это сделано в учебнике, и оно работает там.

Есть идеи, где это терпит неудачу и почему?

Спасибо

1 Ответ

0 голосов
/ 29 апреля 2019

Я думаю, что ваше действие в магазине напрямую из render (). Тег, чтобы быть точным. Попробуйте использовать метод вне рендера и попробуйте изменить состояние хранилища.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...