MST
星途 面试题库

面试题:Svelte readable store与响应式系统及优化策略

Svelte的readable store是其响应式系统的一部分。请深入分析readable store在Svelte响应式系统中的角色,以及如何通过优化readable store的使用来提升应用性能,例如在大数据量或频繁更新场景下,你会采取哪些策略?并结合实际代码案例说明。
13.9万 热度难度
前端开发Svelte

知识考点

AI 面试

面试题答案

一键面试

readable store在Svelte响应式系统中的角色

  1. 数据存储与订阅:readable store用于存储数据,并允许组件订阅该数据的变化。当store中的数据发生变化时,所有订阅该store的组件都会自动更新。例如:
<script>
    import { readable } from'svelte/store';

    const count = readable(0);

    let value;
    const unsubscribe = count.subscribe((v) => {
        value = v;
    });
</script>

{value}

在上述代码中,count 是一个 readable store,通过 subscribe 方法订阅该store,每当 count 的值发生变化,value 也会相应更新,进而影响到模板中 {value} 的显示。 2. 封装数据逻辑:它可以封装数据获取逻辑,使得数据的获取和管理与组件逻辑分离。比如从API获取数据:

<script>
    import { readable } from'svelte/store';

    const fetchData = async () => {
        const response = await fetch('https://example.com/api/data');
        return response.json();
    };

    const dataStore = readable(null, (set) => {
        fetchData().then((data) => {
            set(data);
        });
    });
</script>

{#if $dataStore}
    {#each $dataStore as item}
        {item.name}
    {/each}
{/if}

这里 dataStore 封装了从API获取数据的逻辑,组件只需要订阅 dataStore 即可使用数据,而无需关心具体的获取过程。

优化readable store使用提升应用性能的策略

  1. 大数据量场景
    • 分页加载:将大数据分成多个部分加载,减少一次性处理的数据量。例如:
<script>
    import { readable } from'svelte/store';

    const pageSize = 10;
    let currentPage = 1;

    const fetchPageData = async (page) => {
        const response = await fetch(`https://example.com/api/data?page=${page}&limit=${pageSize}`);
        return response.json();
    };

    const dataStore = readable([], (set) => {
        const loadPage = async () => {
            const data = await fetchPageData(currentPage);
            set(data);
        };
        loadPage();
    });
</script>

{#each $dataStore as item}
    {item.name}
{/each}

<button on:click={() => { currentPage++; $dataStore.update(() => fetchPageData(currentPage)); }}>Next Page</button>
- **虚拟列表**:只渲染可见部分的数据,减少DOM操作。可以使用第三方库如 `svelte-virtual-list`。例如:
<script>
    import VirtualList from'svelte-virtual-list';
    import { readable } from'svelte/store';

    const largeData = Array.from({ length: 1000 }, (_, i) => ({ id: i, name: `Item ${i}` }));
    const dataStore = readable(largeData);
</script>

<VirtualList {items:$dataStore} height={200} itemHeight={30}>
    {({ item }) => <div>{item.name}</div>}
</VirtualList>
  1. 频繁更新场景
    • 防抖(Debounce):在一定时间内,多次触发更新只执行一次。例如:
<script>
    import { readable } from'svelte/store';
    import { onMount } from'svelte';

    const valueStore = readable(0);
    let timeout;

    onMount(() => {
        const handleUpdate = () => {
            clearTimeout(timeout);
            timeout = setTimeout(() => {
                valueStore.update((v) => v + 1);
            }, 300);
        };

        document.addEventListener('scroll', handleUpdate);

        return () => {
            document.removeEventListener('scroll', handleUpdate);
            clearTimeout(timeout);
        };
    });
</script>

{ $valueStore }
- **节流(Throttle)**:规定时间内只允许触发一次更新。例如:
<script>
    import { readable } from'svelte/store';
    import { onMount } from'svelte';

    const valueStore = readable(0);
    let lastUpdate = 0;
    const throttleTime = 300;

    onMount(() => {
        const handleUpdate = () => {
            const now = Date.now();
            if (now - lastUpdate >= throttleTime) {
                valueStore.update((v) => v + 1);
                lastUpdate = now;
            }
        };

        document.addEventListener('scroll', handleUpdate);

        return () => {
            document.removeEventListener('scroll', handleUpdate);
        };
    });
</script>

{ $valueStore }