Реагировать на модель mobx-state-tree как на массив модели

Сценарий

У меня две модели: одна - Expense, а другая - DailyExpense (которая содержит массив Expense), поскольку название предполагает, что Expense - это просто отдельный элемент Expense, в то время как DailyExpense содержит кучу Expense.

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


/**
 * Expense model which holds individual item
 */
export const Expense = types.model({
    name:types.string,
    price:types.number,
    quantity:types.number,    
}).actions(self => ({
    changeName(newName) {
        self.name = newName
    },
    changePrice(newPrice) {
        self.price = newPrice
    },
    changeQuantity(newQuant) {
        self.quantity = newQuant
    },
})).views(self => ({
    get totalPrice () {
        return self.price * self.quantity
    }
}))


/**
 * DailyExpense model which have arrays of Expense 
 * Also have date as unique identifier
 */
export const DailyExpense = types.model({
    date:types.string,
    items:types.optional(types.array(Expense),[])
}).actions(self => ({
    changeDate (newDate) {
        self.date = newDate
    },    
    addItem (newItem) {
        self.items.push(newItem)
    },
    removeItem (name) {
        const index = self.items.findIndex(e => {
            if (e.name === name) 
                return e
        })
        self.items.splice(index,1)
    }
})).views(self => ({
    get totalPrice () {
        return self.items.reduce((sum,entry) => sum+(entry.price * entry.quantity),0)
    }
}))

Вопрос

Можно ли создать модель для отслеживания всего моего DailyExpense

Я знаю, что могу создать еще одну модель, в которой я могу сделать что-то вроде этого

export const ExpenseList = types.model({
    list:types.array(DailyExpense)
})

Но могу ли я создать модель без указания в ней какой-либо переменной, как здесь, без списка, что-то вроде этого? (Я знаю, что это не сработает, я пробовал это)

export const ExpenseList = types.model(types.array(DailyExpense))

Я пробовал создать следующую модель

export const ExpenseList = types.model(types.array(DailyExpense))
.actions(self => ({
    add (s) {
        self.push(s);
    }
}))

И я запустил следующий тестовый пример, но он дал мне ошибку [mobx-state-tree] Functions are not supported as properties, use views instead

it ('can add in list', () => {
  const dailyExpense = DailyExpense.create ({
    date: today,    
    items: [
      {name: 'First Item', price: 20, quantity: 4},
      {name: 'Second Item', price: 10, quantity: 2},
      {name: 'Third Item', price: 5, quantity: 1}
    ],
  });
  const expenseList = ExpenseList.create(dailyExpense);

  expect(expenseList.length).toBe(1);
});
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
0
1 631
1

Ответы 1

Нет, на данный момент это не поддерживается :)

Другие вопросы по теме