面试题答案
一键面试作用域插槽原理
作用域插槽允许子组件在向父组件暴露数据的同时,让父组件来决定插槽内容的渲染方式。子组件在 <slot>
标签上绑定数据,这些数据会成为作用域插槽的“作用域”。父组件使用 v-slot
语法(或 #
语法糖)来接收并使用这些数据进行自定义渲染。
优化渲染性能
- 减少不必要的重新渲染:只在真正需要的时候更新插槽内容。如果插槽内容依赖的数据没有变化,就不触发重新渲染。
- 缓存插槽内容:对于一些不经常变化的插槽内容,可以使用缓存机制。
代码示例
- 子组件(Child.vue)
<template>
<div>
<slot :data="list">
<!-- 默认插槽内容 -->
<div v-for="item in list" :key="item.id">{{ item.name }}</div>
</slot>
</div>
</template>
<script>
export default {
data() {
return {
list: [
{ id: 1, name: 'Apple' },
{ id: 2, name: 'Banana' },
{ id: 3, name: 'Cherry' }
]
};
}
};
</script>
- 父组件(Parent.vue)
<template>
<div>
<Child>
<template v-slot:default="slotProps">
<div v-for="item in slotProps.data" :key="item.id">
<strong>{{ item.name }}</strong>
</div>
</template>
</Child>
</div>
</template>
<script>
import Child from './Child.vue';
export default {
components: {
Child
}
};
</script>
在上述示例中,子组件 Child
通过 :data="list"
将 list
数据暴露给插槽作用域。父组件使用 v-slot:default="slotProps"
接收 slotProps.data
并进行自定义渲染。如果 list
数据没有变化,父组件插槽内的内容不会重新渲染,从而优化了渲染性能。同时,如果需要缓存插槽内容,可以使用 keep - alive
组件。
<template>
<div>
<keep-alive>
<Child>
<template v-slot:default="slotProps">
<div v-for="item in slotProps.data" :key="item.id">
<strong>{{ item.name }}</strong>
</div>
</template>
</Child>
</keep-alive>
</div>
</template>
这样,在 Child
组件切换或数据更新时,只要插槽内容在 keep - alive
管理范围内且依赖数据未变,就不会重新渲染,提升了性能。