如果您查看 Svelte 为此生成的代码,您可以看到当您传递存储值时,它会在每次单击时重新生成节流函数。这会在每次点击时重置油门计时器。
dispose = listen(button, "click", function () {
if (is_function(throttle(click_handler, 1000)))
throttle(click_handler, 1000).apply(this, arguments);
});
无论出于何种原因,当您传递常规字符串时都不会发生这种情况。
dispose = listen(button, "click", throttle(click_handler, 1000));
这可能是 Svelte 中的一个错误,但我不确定。在GitHub 存储库上打开一个问题可能是值得的。
我能够通过提前生成节流函数来解决它:
<script>
import throttle from 'lodash.throttle';
import { writable } from 'svelte/store';
const arr = writable(['A', 'B', 'C']);
function foo(val) {
console.log('foo: ', val);
}
$: throttledFns = $arr.map(val => getThrottled(val));
function getThrottled(val) {
console.log('getting throttled');
return throttle(() => { foo(val); }, 1000);
}
</script>
{#each $arr as a, idx}
<button on:click={throttledFns[idx]}>
Button {a}
</button>
{/each}
这将在存储数组更改时重新生成受限制的函数,但不是在每次单击时。
您也可以一次生成 foo 的限制版本并使用它,但这会限制对按钮的所有点击(例如,如果您点击 A 然后点击 B,对 B 的点击将被限制)。
<script>
// as before
const throttledFoo = throttle(foo, 1000);
</script>
{#each $arr as a, idx}
<button on:click={() => throttledFoo(a)}, 1000)}>
Button {a}
</button>
{/each}