Svelte store не срабатывает, когда значение изменяется, только когда префикс $: - PullRequest
0 голосов
/ 30 апреля 2020

Как я понимаю, при использовании хранилища Svelte с префиксом $ оно автоматически подписывается на изменения значений.

Имея следующий код, всякий раз, когда изменяется значение хранилища users.name, он должен вызывать один из двух операторов.

 <script>
    if (!$userS.name) {
        list = Promise.reject({message:'You are not allowed to view this section!'});
    } else {
        list = getList('api/carousel/' + escape(term));
    }
 </script>

Но предыдущий код работает только тогда, когда к оператору if добавляется префикс " $: ".

$: if (!$userS.name) { ...

Так зачем нужен дополнительный реактивный знак доллара, если он уже подписан на изменения стоимости магазина?

1 Ответ

1 голос
/ 30 апреля 2020

Ваш скрипт инициализации компонента, то есть код внутри тега <script>, не реактивен. Он запускается один раз, когда ваш компонент создан, и все. Думайте конструктор класса.

Только код в реактивных блоках $: сохраняется в syn c и перезапускается, когда (реактивные) переменные, которые они содержат, изменяются.

Префикс $ дает вам значение внутри магазина. В вашем примере переменная user - это само хранилище. console.log это, вы увидите, что это объект с subscribe методом et c. Переменная с префиксом дает вам значение внутри магазина. За кулисами Svelte делает подписку на хранилище (т.е. вызывает его метод subscribe), когда ваш компонент создается, и отписывается, когда он уничтожается.

Между тем, если значение изменяется, переменная с префиксом $ будет реактивной. Но это будет иметь эффект, только если он находится в реактивном контексте. То есть либо реактивное выражение / оператор $:, либо в разметке. Это верно для любого реактивного источника (реквизит, переменные верхнего уровня ...).

...