面试题答案
一键面试设计思路
- 数据传递:通过组件的props属性,将数据从组件A传递到组件B,再由组件B传递到组件C。
- 插槽与Fragment:在组件C中定义插槽,使用Fragment(Vue 2中使用
<template>
标签代替,Vue 3中可直接使用<Fragment>
或<>...</>
)来实现无包裹元素的内容插入。插槽内容可以使用从组件A传递过来的数据进行动态渲染。
实现要点
- 组件A:定义要传递的数据,并将其作为props传递给组件B。
- 组件B:接收来自组件A的props,并将其传递给组件C。
- 组件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>