MST

星途 面试题库

面试题:具名插槽与作用域插槽在复杂父子组件通信中的应用

在一个多层嵌套的组件结构中,父组件需要向深层子组件传递数据并根据不同条件渲染不同内容。请阐述如何综合运用具名插槽与作用域插槽来优雅地解决这个问题,并给出关键代码示例。
14.7万 热度难度
前端开发Vue

知识考点

AI 面试

面试题答案

一键面试

具名插槽

  1. 原理:具名插槽允许在组件模板中定义多个插槽,并通过name属性来区分。父组件可以通过<template v-slot:插槽名>将内容插入到对应的插槽位置。
  2. 使用场景:当父组件需要在子组件的不同位置插入不同内容时,具名插槽很有用。例如,子组件可能有一个头部、主体和尾部,父组件可以分别向这些不同位置插入内容。

作用域插槽

  1. 原理:作用域插槽允许子组件向父组件暴露数据,父组件在使用插槽时可以访问这些数据。子组件通过在<slot>标签上绑定数据,父组件通过v-slot:插槽名="插槽数据对象"来接收并使用这些数据。
  2. 使用场景:当子组件内部的数据需要影响父组件插入插槽内容的渲染逻辑时,作用域插槽非常合适。

综合运用解决多层嵌套组件数据传递与条件渲染问题

  1. 假设多层嵌套结构如下App(父组件) -> ParentComponent -> ChildComponent(深层子组件)
  2. 关键代码示例
    • ChildComponent.vue
<template>
  <div>
    <slot name="header"></slot>
    <slot :data="childData"></slot>
    <slot name="footer"></slot>
  </div>
</template>

<script>
export default {
  data() {
    return {
      childData: {
        message: '这是子组件的数据'
      }
    };
  }
};
</script>
  • ParentComponent.vue
<template>
  <div>
    <ChildComponent>
      <template v-slot:header>
        <h1>这是头部</h1>
      </template>
      <template v-slot:default="slotProps">
        <div v-if="slotProps.data.message.includes('子组件')">
          <p>符合条件的内容: {{ slotProps.data.message }}</p>
        </div>
      </template>
      <template v-slot:footer>
        <p>这是底部</p>
      </template>
    </ChildComponent>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';
export default {
  components: {
    ChildComponent
  }
};
</script>
  • App.vue
<template>
  <div id="app">
    <ParentComponent />
  </div>
</template>

<script>
import ParentComponent from './ParentComponent.vue';
export default {
  components: {
    ParentComponent
  }
};
</script>

在上述代码中,ChildComponent通过具名插槽提供了不同位置插入内容的能力,同时通过作用域插槽将自身数据childData暴露给父组件ParentComponentParentComponent在使用ChildComponent时,根据作用域插槽传递的数据slotProps.data.message进行条件渲染,同时利用具名插槽向ChildComponent的不同位置插入内容。这样就优雅地解决了多层嵌套组件中父组件向深层子组件传递数据并根据不同条件渲染不同内容的问题。