面试题答案
一键面试readable store在Svelte响应式系统中的角色
- 数据存储与订阅: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使用提升应用性能的策略
- 大数据量场景:
- 分页加载:将大数据分成多个部分加载,减少一次性处理的数据量。例如:
<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>
- 频繁更新场景:
- 防抖(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 }