MST

星途 面试题库

面试题:Vue插槽结合Fragment在复杂组件嵌套中的应用

有一个多层嵌套的Vue组件结构,最外层组件A包含组件B,组件B又包含组件C。现在需要在组件C中通过插槽结合Fragment实现无包裹元素的内容插入,且要保证数据能从组件A传递到插槽内容中进行动态渲染,阐述详细的设计思路及实现要点,并编写核心代码。
28.6万 热度难度
前端开发Vue

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 数据传递:通过组件的props属性,将数据从组件A传递到组件B,再由组件B传递到组件C。
  2. 插槽与Fragment:在组件C中定义插槽,使用Fragment(Vue 2中使用<template>标签代替,Vue 3中可直接使用<Fragment><>...</>)来实现无包裹元素的内容插入。插槽内容可以使用从组件A传递过来的数据进行动态渲染。

实现要点

  1. 组件A:定义要传递的数据,并将其作为props传递给组件B。
  2. 组件B:接收来自组件A的props,并将其传递给组件C。
  3. 组件C:定义插槽,接收传递过来的数据,在插槽内容中使用该数据进行动态渲染。

核心代码

假设使用Vue 3:

组件A (App.vue)

<template>
  <div>
    <ComponentB :data="message" />
  </div>
</template>

<script setup>
import ComponentB from './ComponentB.vue';
const message = 'Hello from Component A';
</script>

组件B (ComponentB.vue)

<template>
  <div>
    <ComponentC :data="message" >
      <!-- 插槽内容可以在这里自定义,也可以在使用ComponentC的地方传入 -->
      <template #default="{ data }">
        <p>{{ data }}</p>
      </template>
    </ComponentC>
  </div>
</template>

<script setup>
import ComponentC from './ComponentC.vue';
defineProps({
  message: String
});
</script>

组件C (ComponentC.vue)

<template>
  <Fragment>
    <slot :data="data" />
  </Fragment>
</template>

<script setup>
defineProps({
  data: String
});
</script>

如果是Vue 2:

组件A (App.vue)

<template>
  <div>
    <ComponentB :data="message" />
  </div>
</template>

<script>
import ComponentB from './ComponentB.vue';
export default {
  components: { ComponentB },
  data() {
    return {
      message: 'Hello from Component A'
    };
  }
};
</script>

组件B (ComponentB.vue)

<template>
  <div>
    <ComponentC :data="message">
      <template slot-scope="props">
        <p>{{ props.data }}</p>
      </template>
    </ComponentC>
  </div>
</template>

<script>
import ComponentC from './ComponentC.vue';
export default {
  components: { ComponentC },
  props: ['message']
};
</script>

组件C (ComponentC.vue)

<template>
  <template>
    <slot :data="data" />
  </template>
</template>

<script>
export default {
  props: ['data']
};
</script>