В JS-выходе вашего REPL вы можете увидеть следующее:
function instance($$self, $$props, $$invalidate) {
let $state;
component_subscribe($$self, state, $$value => $$invalidate(0, $state = $$value));
set_store_value(state, $state.a = 1, $state); // changes the value of state?!
set_store_value(state, $state = { d: 0 }); // ''
state.set({ c: 0 }); // no effect, as expected
return [$state];
}
При использовании сокращенного реактивного присваивания $<store>
компилируется в set_store_value()
вызовы, которые представляют собой компактный внутренний метод, определенный таким образом:
export function set_store_value(store, ret, value = ret) {
store.set(value);
return ret;
}
Таким образом, назначенное значение фактически передается функции set
вашего магазина, как и следовало ожидать.
Однако вы можете видеть в выходных данных JS выше, что в конечном итоге возвращается локальная переменная с именем $state
(знак $
там не реактивный модификатор, просто часть имени). Во время этих вызовов set_store_value()
вы можете видеть, что этой локальной переменной присваивается то же значение, которое передается методу set
вашего магазина (фактически, локальной переменной присваивается это значение, а затем она сама передается методу set_store_value()
):
set_store_value(state, $state.a = 1, $state); // changes the value of state?!
set_store_value(state, $state = { d: 0 }); // ''
Я ожидаю, что такое поведение будет своего рода оптимистичным прогнозом / разрешением.
Возможно, в контракте магазина Svelte подразумевается, что значение, переданное set
методу магазина , должно на самом деле измените хранилище соответствующим образом, и в каком случае подход оптимистичного разрешения всегда будет давать согласованные результаты?
Надеюсь, Рич Харрис (или другой участник Svelte) увидит ваш вопрос и предоставит более точный ответ.
person
Thomas Hennes
schedule
22.07.2020