面试题答案
一键面试1. Svelte 插槽嵌套组件生命周期钩子函数协同工作
- 父组件生命周期钩子:
onMount
:在组件首次插入到 DOM 后运行。当父组件挂载时,会执行其onMount
钩子。beforeUpdate
:在组件更新(例如数据变化导致重新渲染)之前运行。afterUpdate
:在组件更新完成后运行。onDestroy
:在组件从 DOM 中移除时运行。
- 子嵌套组件(通过插槽插入)生命周期钩子:
- 同样具有
onMount
、beforeUpdate
、afterUpdate
和onDestroy
钩子。当子嵌套组件通过插槽插入到父组件的 DOM 中时,它的onMount
钩子会被触发;当子嵌套组件自身数据或从父组件接收到的数据变化导致重新渲染时,beforeUpdate
和afterUpdate
钩子会按顺序执行;当子嵌套组件从 DOM 中移除时,onDestroy
钩子会被触发。 - 父组件先于子嵌套组件挂载和销毁。例如,父组件
onMount
执行后,子嵌套组件的onMount
才会执行;父组件onDestroy
执行前,子嵌套组件的onDestroy
会先执行。
- 同样具有
2. 确保子嵌套组件正确响应数据更新并避免不必要重渲染
- 使用
$:
进行响应式声明:在子嵌套组件中,使用$:
标记对依赖于父组件传递数据的变量进行声明,Svelte 会自动追踪这些依赖,并在依赖数据变化时更新组件。 {#if}
条件渲染控制:通过{#if}
条件渲染来避免不必要的重渲染。只有当数据满足特定条件时才渲染子嵌套组件,这样当数据变化但不满足渲染条件时,子嵌套组件不会重新渲染。
示例代码
父组件(App.svelte)
<script>
import Child from './Child.svelte';
let parentData = '初始数据';
function updateData() {
parentData = '更新后的数据';
}
</script>
<button on:click={updateData}>更新数据</button>
<Child>
<div>{parentData}</div>
</Child>
子嵌套组件(Child.svelte)
<script>
let slotContent;
$: console.log('子嵌套组件数据更新:', slotContent);
// 使用{#if}来避免不必要重渲染,这里简单示例,实际根据业务逻辑调整
let shouldRender = true;
</script>
{#if shouldRender}
<div>
<slot bind:this={slotContent}></slot>
</div>
{/if}
在上述示例中,父组件通过按钮更新parentData
,子嵌套组件通过slot
获取该数据。通过$:
声明对slotContent
的依赖追踪,并且通过{#if}
条件渲染(这里简单设置为shouldRender
,实际业务中可根据复杂逻辑调整)来避免不必要的重渲染。