Как изменить родительское состояние из дочернего дерева состояний Mobx?

Я пытаюсь создать Nav в reactjs с помощью Mobx State Tree.

Прямо сейчас у меня тонкая вертикальная панель навигации со списком значков. Теперь я хочу добавить к определенным пунктам подменю. При щелчке по ним Nav переходит от тонкого к широкому (т. Е. Расширяется), и отображаются элементы подменю. Как только пользователь нажимает на одну из них, Nav возвращается к уменьшенной версии.

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

import { types } from "mobx-state-tree";
import NavItem from "./NavItem.js";
const NavStore = types
  .model("NavStore", {
    expanded: false,
    nav_items: types.array(NavItem)
  })
  .actions(self => ({}))
  .views(self => ({}))
  .create({

  });

export default NavStore;


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

const NavItem = types
  .model("NavItem", {
     expands: false,
     title: types.string
  })
  .actions(self => ({
    itemClicked() {

    }
  }))
  .views(self => ({}));

export default NavItem

person chobo2    schedule 04.06.2018    source источник


Ответы (1)


Вам необходимо импортировать функции getParent и (необязательно) hasParent:

import { types, getParent, hasParent } from ‘mobx-state-tree’

Затем в своем действии вызовите действие родителя:

if (hasParent(self)) {
  getParent(self).someAction(someParams);
}
person Petr Lazarev    schedule 06.06.2018
comment
Я видел, как люди действительно получают getParent (self, #). В чем разница с чем-то вроде getParent (self, 1) - person chobo2; 07.06.2018
comment
Второй параметр - глубина (по умолчанию 1). Итак, вы можете написать getParent (self, 2), чтобы получить родителя родителя. Я думаю, что нет смысла писать # для глубины, потому что это должно быть число. - person Petr Lazarev; 08.06.2018
comment
Я проверил исходный код (github.com/mobxjs/mobx-state-tree/blob/master/packages/) и кажется, что getParent должен вызвать исключение, если второй аргумент не является числом. - person Petr Lazarev; 08.06.2018