В моем приложении React mobx @action не запускается - mobx, mobx-react-lite

Я впервые использую mobx & mobx-react-lite и вижу, что @action не запускает никаких событий.

Пожалуйста, найдите URL-адрес Code SandBox здесь

Я намерен, когда я нажимаю кнопку, имя CHAN должно измениться на XIAN. Но этого не происходит. Не могли бы вы сообщить мне, в чем я ошибся? Заранее спасибо.


person METALHEAD    schedule 14.10.2020    source источник


Ответы (2)


Вам не хватает makeObservable в конструкторе myStore.

Codesandbox

Документация

import { observable, action, makeObservable } from "mobx";

export class myStore {
  @observable name: string = "CHAN";

  constructor() {
    makeObservable(this)
  }

  @action
  setName(newName: string) {
    this.name = newName;
  }
}
person Chris    schedule 14.10.2020
comment
Первые несколько минут это не позволяло мне принять ответ. Я принял это сейчас. Большое вам спасибо за ваше время. - person METALHEAD; 14.10.2020
comment
У меня есть еще один базовый вопрос. Достаточно ли одного обертывания observer вокруг кода в app.tsx, чтобы все приложение стало реактивным? - person METALHEAD; 14.10.2020
comment
Нет, вы должны заключить каждый компонент, который должен реагировать, с помощью observer. Это потому, что observer подписывается только на потребляемые свойства в своей собственной функции рендеринга. Например. если вы передадите полное хранилище дочернему компоненту, он не будет повторно визуализировать, потому что само хранилище не изменится. - person Chris; 15.10.2020

В дополнение к ответу @Christiaan вы также можете использовать makeAutoObservable и вообще отбрасывать декораторы!

import { observable, action, makeAutoObservable } from "mobx";

export class myStore {
  name: string = "CHAN";

  constructor() {
    makeAutoObservable(this)
  }

  setName(newName: string) {
    this.name = newName;
  }
}

Дополнительная информация: https://mobx.js.org/react-integration.html

person Danila    schedule 14.10.2020
comment
Я запишу это. Большое спасибо. - person METALHEAD; 14.10.2020
comment
У меня есть еще один базовый вопрос. Достаточно ли однократного обертывания наблюдателя вокруг кода в app.tsx, чтобы все приложение стало реактивным? - person METALHEAD; 14.10.2020
comment
Нет, вам нужно обернуть каждый компонент, который использует любое наблюдаемое или вычисленное значение. Честно говоря, проще все завернуть. - person Danila; 15.10.2020