#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" });