Лучший способ сгруппировать разные магазины в главном объекте - Svelte
Так что я пробовал немного Svelte на прошлой неделе. Я хотел иметь какой-то простой компонент, скажем, счетчик, которым будет управлять магазин (так же, как это показано в документации API). У меня также будет компонент для списка задач с его собственным хранилищем, и еще один, который снова будет выдавать случайные факты в своем собственном магазине.
Теперь я хочу иметь большой главный объект, что-то вроде:
const bigObject = {
counter,
todos,
randomFact
}
Я могу получить этот объект с начальными значениями из моих компонентов, но не могу сделать его реактивным, то есть, если я обновлю значение счетчика или запросю другой случайный факт, я хочу, чтобы bigObject обновлялся с этими значениями новостей...
Как вы, ребята, подходите к этой ситуации?
Спасибо,
2 ответа
Ответ довольно прост. Предположим, у нас есть два файла:
bigObject.js
который определяет ваш объект магазина,MyComponent.svelte
который является компонентом Svelte, который используетbigObject
.
Тогда вы можете добиться желаемого таким образом:
// bigObject.js
import { writable } from 'svelte/store'
export const bigObject = writable({
counter: 0,
todos: [],
randomFact: "Svelte can be easy",
})
<!-- MyComponent.svelte -->
<script>
import { bigObject } from './bigObject'
</script>
<p>
count is : {$bigObject.counter}
</p>
<button on:click={() => $bigObject.counter++}>
Increment
</button>
Пока что нет ничего проще. Обновление из любого компонента будет запускаться в каждом компоненте, который используетbigObject
.
Все становится немного сложнее, когда вам нужно определить методы хранилища, которые изменяют bigObject
. Предположим, мы хотим создать функциюsetCounter
которые устанавливают счетчик на заданное значение:
// bigObject.js
import { writable } from 'svelte/store'
const { subscribe, set, update } = writable({
counter: 0,
todos: [],
randomFact: "Svelte can be easy",
})
export const bigObject = {
subscribe,
set,
update,
setCounter: value => update(self => {
// ... write all your function's code here
// self is a reference to your object
self.counter = value
return self //!\\ this is important! Don't forget it
})
})
<!-- MyComponent.svelte -->
<script>
import { bigObject } from './bigObject'
</script>
<p>
count is : {$bigObject.counter}
</p>
<button on:click={() => bigObject.setCounter(42)}>
Set to 42
</button>
В заключение, имейте в виду, что когда вы изменяете какое-либо свойство объекта магазина, все компоненты, которые ссылаются на этот объект, будут обновлены, потому что Svelte не будет считать, что "это единственное свойство было изменено", а скорее "весь этот объект изменился. ".
ТЛ; др; Склады Svelte отлично подходят для небольших частей с реагирующим состоянием, но не являются заменой для крупных решений по управлению состоянием, таких как Redux.
Природа магазинов sveltes больше ориентирована на более мелкие элементы государственного управления. Я считаю, что такой пакет, как redux, будет лучше подходить для более масштабного управления состоянием.
Если у вас есть значения, которые составлены из нескольких частей состояния, вы можете использовать производное состояние. Я верю, что вы могли бы создать собственное хранилище для обработки больших состояний, но я не верю, что это действительно то, о чем вы просите, и это станет более сложным, чем решение, подобное избыточному.
Вы можете попробовать использовать Svelte Store. Подробнее об этом:
Документы: https://svelte.dev/docs
Учебное пособие: https://svelte.dev/tutorial/writable-stores
Я знаю, что это не полный ответ, и это должно быть указано в комментарии, но я пока не могу комментировать.