【发布时间】:2021-06-07 14:04:42
【问题描述】:
我已经阅读了一些关于状态变化监听器的文章,因为我是一个非常初学者的 svelte 环境,所以我不知道什么是最有效的监听状态变化的方法。
让我们将状态变量设为X 和Y
方法一:
$: if (X||Y) {
console.log("yes");
}
方法二:
使用afterUpdate 和onDestroy 的组合
回复:https://svelte.dev/repl/300c16ee38af49e98261eef02a9b04a8?version=3.38.2
import { afterUpdate, onDestroy } from 'svelte';
export function useEffect(cb, deps) {
let cleanup;
function apply() {
if (cleanup) cleanup();
cleanup = cb();
}
if (deps) {
let values = [];
afterUpdate(() => {
const new_values = deps();
if (new_values.some((value, i) => value !== values[i])) {
apply();
values = new_values;
}
});
} else {
// no deps = always run
afterUpdate(apply);
}
onDestroy(() => {
if (cleanup) cleanup();
});
}
方法三:
使用writable 和subscribe
<script>
import { writable } from 'svelte/store';
const X = writable(0);
const Y = writable(0);
X.subscribe(value => {
console.log("X was changed", value);
});
Y.subscribe(value => {
console.log("Y was changed", value);
});
</script>
<button on:click={(e)=>{
X.update((val)=>val++)
}}>Change X</button>
<button on:click={(e)=>{
Y.update((val)=>val++)
}}>Change Y</button>
【问题讨论】:
-
最有效的方法取决于您的用例。对此没有万能的解决方案。
-
常用的方法是方法一,为什么要复杂一些?
-
当我尝试使用方法 1 时,它并不总是触发。 svelte.dev/repl/3cb4c229c334488883db49383656ec26?version=3.38.2
-
您链接的代码有一个错误,因为它使用了未定义的变量
name -
是的,它总是触发不是吗?
标签: state use-effect svelte