面试题答案
一键面试1. 策略
- 细粒度状态管理:将状态尽可能拆分成最小的、独立的部分。这样,只有依赖于变化状态的组件会重新渲染。例如,在一个电商应用中,商品列表的展示和购物车的状态应该分开管理,当购物车数量变化时,不影响商品列表的渲染。
- $: 块与派生状态:使用
$:
块创建派生状态。派生状态只有在其依赖的原始状态变化时才会更新,并且依赖于派生状态的组件也只有在派生状态变化时才会重新渲染。 bind:this
与手动控制:通过bind:this
获取组件实例,在必要时手动控制组件的更新,而不是依赖自动的响应式更新。{#if}
与{#each}
优化:在{#if}
块中,只有当条件为真时,块内的组件才会渲染和响应式更新。在{#each}
块中,通过提供唯一的key
,Svelte 可以更高效地跟踪列表项的变化,避免不必要的重新渲染。
2. 代码示例
细粒度状态管理
<script>
// 独立的状态
let userInfo = { name: 'John', age: 30 };
let cartItems = [];
function updateUserAge() {
userInfo.age++;
}
function addToCart() {
cartItems.push({ name: 'Product 1', price: 10 });
}
</script>
{#if userInfo}
<div>
<p>Name: {userInfo.name}</p>
<p>Age: {userInfo.age}</p>
<button on:click={updateUserAge}>Increment Age</button>
</div>
{/if}
{#if cartItems.length > 0}
<div>
<p>Cart Items:</p>
<ul>
{#each cartItems as item}
<li>{item.name} - ${item.price}</li>
{/each}
</ul>
<button on:click={addToCart}>Add to Cart</button>
</div>
{/if}
在这个示例中,userInfo
和 cartItems
是独立的状态。更新 userInfo
不会导致购物车相关组件重新渲染,反之亦然。
派生状态
<script>
let count = 0;
// 派生状态
$: doubleCount = count * 2;
function incrementCount() {
count++;
}
</script>
<p>Count: {count}</p>
<p>Double Count: {doubleCount}</p>
<button on:click={incrementCount}>Increment Count</button>
这里 doubleCount
是基于 count
的派生状态。只有 count
变化时,doubleCount
才会更新,并且依赖 doubleCount
的 <p>Double Count: {doubleCount}</p>
组件才会重新渲染。
bind:this
与手动控制
<script>
let myComponent;
let data = { value: 'initial' };
function updateData() {
data.value = 'updated';
// 手动更新组件
myComponent.$set(data);
}
</script>
<MyComponent bind:this={myComponent} {data} />
<button on:click={updateData}>Update Data</button>
<script>
function MyComponent({ data }) {
return (
<div>
<p>{data.value}</p>
</div>
);
}
</script>
在这个例子中,通过 bind:this
获取 MyComponent
的实例,在 updateData
函数中手动调用 $set
方法来更新组件,而不是让 Svelte 自动响应式更新,从而更精准地控制重新渲染。
{#if}
与 {#each}
优化
<script>
let showComponent = false;
let items = [1, 2, 3, 4, 5];
function toggleComponent() {
showComponent =!showComponent;
}
function updateItems() {
items = items.map(item => item + 1);
}
</script>
<button on:click={toggleComponent}>Toggle Component</button>
<button on:click={updateItems}>Update Items</button>
{#if showComponent}
<ul>
{#each items as item, index}
<li key={index}>{item}</li>
{/each}
</ul>
{/if}
在 {#if}
块中,只有 showComponent
为 true
时,列表组件才会渲染和响应更新。在 {#each}
块中,通过 key={index}
提供唯一标识,Svelte 可以更高效地跟踪 items
的变化,避免不必要的重新渲染。