MST

星途 面试题库

面试题:Svelte derived store在动态依赖场景下的优化

在一个Svelte应用中,有一个derived store依赖于多个其他store,而这些store中的部分依赖是动态变化的(例如根据用户交互添加或移除某些依赖store)。请阐述如何确保derived store在动态依赖变化时能正确更新,并且尽量优化性能,避免不必要的计算。同时给出相关的代码实现框架。
36.9万 热度难度
前端开发Svelte

知识考点

AI 面试

面试题答案

一键面试
  1. 确保正确更新及性能优化思路

    • 响应式追踪:Svelte 的响应式系统会自动追踪依赖。对于动态变化的依赖,我们需要通过合适的方式将这些变化纳入响应式追踪范围。
    • 避免重复计算:可以使用 set 方法在依赖变化时,有条件地更新 derived store,而不是每次都重新计算整个值。
  2. 代码实现框架

<script>
    import { writable, derived } from'svelte/store';

    // 定义一些基础的 writable stores
    const store1 = writable(1);
    const store2 = writable(2);
    const dynamicStores = writable([]);

    // 用于添加动态 store 的函数
    function addDynamicStore(newStore) {
        dynamicStores.update(stores => {
            stores.push(newStore);
            return stores;
        });
    }

    // 用于移除动态 store 的函数
    function removeDynamicStore(storeToRemove) {
        dynamicStores.update(stores => stores.filter(store => store!== storeToRemove));
    }

    // 定义 derived store
    const myDerivedStore = derived([store1, store2, dynamicStores], ([$store1, $store2, $dynamicStores]) => {
        let result = $store1 + $store2;
        $dynamicStores.forEach(store => {
            result += store.get();
        });
        return result;
    });
</script>

{#if $myDerivedStore}
    <p>The value of derived store is: {$myDerivedStore}</p>
{/if}

<button on:click={() => addDynamicStore(writable(3))}>Add dynamic store</button>
<button on:click={() => {
    const stores = $dynamicStores;
    if (stores.length > 0) {
        removeDynamicStore(stores[0]);
    }
}}>Remove dynamic store</button>

在上述代码中:

  • 我们使用 writable 创建了一些基础的 store,包括动态变化的 dynamicStores
  • addDynamicStoreremoveDynamicStore 函数用于添加和移除动态 store。
  • myDerivedStore 通过 derived 依赖多个 store,包括动态变化的 dynamicStores。当 dynamicStores 中的 store 有添加或移除时,myDerivedStore 会自动更新,并且通过合理的计算方式避免了不必要的重复计算。