Можно ли наблюдать события mobx-state-tree для конкретной записи карты

#mobx #mobx-state-tree

#mobx #mobx-state-tree

Вопрос:

Можно ли сделать что-то вроде этого:

 observe(props.store.zone.players[props.socket_id], (change) => {

  ...

})
 

Я хочу прослушивать события для каждого конкретного экземпляра компонента.

Вот хранилище зон:

 const ZoneState = types
  .model({
    name: types.optional(types.string, ""),
    players: types.map(PlayerState),
  })
  .actions((self) => ({
    syncPlayer(params) {
      const player = self.players.get(params.id);
      const oldPlayerData = toJS(player);
      self.players.put(params);
    },

  }));
 

И хранилище игроков

 import { types } from "mobx-state-tree";

const PlayerState = types
  .model({
    id: types.identifier,
    socket_id: types.optional(types.string, ""),
    x: types.integer,
    z: types.integer,
    name: types.optional(types.string, "Unknown One"),
  })
  .actions((self) => ({
    sync(params) {
      self.x = params.x;
      self.z = params.z;
    },
  }));

export default PlayerState;
 

Комментарии:

1. Да, вы могли бы, например, использовать либо observe или autorun для запуска некоторого кода при изменении конкретной записи карты .

Ответ №1:

Вы можете, например, использовать либо observe или autorun для запуска некоторого кода при изменении конкретной записи карты.

Пример

 // ...

const zoneState = ZoneState.create();

zoneState.syncPlayer({ id: "1", socket_id: "1", x: 1, z: 2, name: "test" });

observe(zoneState.players.get("1"), (change) => {
  console.log("observe", change);
});

autorun(() => {
  console.log("autorun", zoneState.players.get("1"));
});

zoneState.syncPlayer({ id: "1", socket_id: "1", x: 1, z: 2, name: "test 2" });