Общая модель в дереве состояний Mobx? - PullRequest
0 голосов
/ 06 сентября 2018

У меня будет несколько «продуктов» с разными «характеристиками»

Примеры

Продукты

  • Камера
  • Ноутбук

Характеристики камеры

  • Мегапиксели цифровой камеры
  • марка
  • Оптический зум

ноутбук Sepcs

  • Марка
  • Размер барана
  • Операционная система
  • Количество ядер процессора
  • Размер дисплея
  • Размер жесткого диска

У меня будет 2 компонента

  1. Компонент фильтра
  2. Результаты поиска

Компонент фильтра будет список всех доступных фильтров для этого продукта.

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

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

Я мог бы предположить, может быть, сделать модель для каждого типа

  .model({
    id: types.identifierNumber,
    Brand: types.string,
    OpticalZoom: types.string,
    MegaPixels: types.string,
  })

  .model({
    id: types.identifierNumber,
    Brand: types.string,
    RamSize: types.string,
    Os: types.string,
    Cores: types.string,
    Display: types.string,
   HarddriveSize: types.string,
  })

но теперь я не знаю, как получить доступ к 2 различным моделям в моих компонентах, так как они будут привязаны к этим моделям.

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

Еще одна вещь, которую я должен учитывать, - это то, что пользователь может нажать на один из результатов, который перейдет на другую страницу и покажет все детали. Я бы, вероятно, воспользовался ссылкой MST, чтобы получить к ней доступ, чего я не смог бы сделать, если сделаю все отдельные модели.

Любые предложения, мне кажется, мне нужно больше json или что-то более динамичное, поэтому я не уверен, является ли MST правильным решением для этого, но я не эксперт в этом, поэтому я хочу посмотреть, может ли это использоваться.

1 Ответ

0 голосов
/ 25 ноября 2018

используйте types.union(Camera, Laptop). ключ типа (или типа) для каждого типа. Затем используйте представления, чтобы получить определенный тип.

const Camera = model({
  type: literal('camera')
});
const Laptop = model({
  type: literal('laptop')
});

const Data = model({
  products = array(union(Camera, Laptop))
})
.views( self => ({
  get cameras() {
    return self.products.filter( p => p.type === 'camera');
  },
  get laptops() {
    return self.products.filter( p => p.type === 'laptop');
  }
}))
...