Чтобы решить эту проблему, обратитесь к старой стандартной практике программирования: индексирование.Вместо того, чтобы хранить карту с полными значениями элементов, дублированными в геттере, вы можете сохранить карту с индексом элемента в state.all
.Затем вы можете создать новый метод получения, который возвращает функцию для доступа к одному элементу.По моему опыту, индексные функции получения всегда работают быстрее, чем старые функции получения, и их вывод занимает намного меньше места в памяти (в среднем на 80% меньше в моем приложении).
Пример нового модуля магазина
export default {
state: () => ({
all: [
{ id: 1, tags: ['tag1', 'tag2'] },
...
],
...
}),
...
getters: {
indexById: (state) => {
return state.all.reduce((map, item, index) => {
// Store the `index` instead of the `item`
map[item.id] = index
return map
}, {})
},
byId: (state, getters) => (id) => {
return state.all[getters.indexById[id]]
},
indexByTags: (state) => {
return state.all.reduce((map, item, index) => {
for (let i = 0; i < item.tags.length; i++) {
map[item.tags[i]] = map[item.tags[i]] || []
// Again, store the `index` not the `item`
map[item.tags[i]].push(index)
}
return map
}, {})
},
byTag: (state, getters) => (tag) => {
return (getters.indexByTags[tag] || []).map(index => state.all[index])
}
}
}
Пример нового компонента
export default {
...,
data () {
return {
itemId: 1
}
},
computed: {
item () {
return this.$store.getters['path/to/byId'](this.itemId)
},
relatedItems () {
return this.item && this.item.tags.length
? this.$store.getters['path/to/byTag'](this.item.tags[0])
: []
}
}
}
Изменение кажется небольшим, но оно имеет огромное значение с точки зрения производительности и эффективности памяти.Он по-прежнему полностью реагирует, как и раньше, но вы больше не дублируете все объекты ресурсов в памяти.В моей реализации я абстрагировал различные методологии индексации и методологии расширения индекса, чтобы сделать код очень удобным для сопровождения.
Вы можете ознакомиться с полным доказательством концепции github, здесь: https://github.com/aidangarza/vuex-indexed-getters