MST

星途 面试题库

面试题:Vue插槽:如何通过合理使用作用域插槽优化渲染性能

在Vue项目中,你经常会使用到插槽。请阐述一下作用域插槽的原理,并且说明如何通过合理使用作用域插槽来优化插槽的渲染性能。请结合具体的代码示例进行说明。
12.0万 热度难度
前端开发Vue

知识考点

AI 面试

面试题答案

一键面试

作用域插槽原理

作用域插槽允许子组件在向父组件暴露数据的同时,让父组件来决定插槽内容的渲染方式。子组件在 <slot> 标签上绑定数据,这些数据会成为作用域插槽的“作用域”。父组件使用 v-slot 语法(或 # 语法糖)来接收并使用这些数据进行自定义渲染。

优化渲染性能

  1. 减少不必要的重新渲染:只在真正需要的时候更新插槽内容。如果插槽内容依赖的数据没有变化,就不触发重新渲染。
  2. 缓存插槽内容:对于一些不经常变化的插槽内容,可以使用缓存机制。

代码示例

  1. 子组件(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>
  1. 父组件(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 管理范围内且依赖数据未变,就不会重新渲染,提升了性能。