面试题答案
一键面试具名插槽
- 原理:具名插槽允许在组件模板中定义多个插槽,并通过
name
属性来区分。父组件可以通过<template v-slot:插槽名>
将内容插入到对应的插槽位置。 - 使用场景:当父组件需要在子组件的不同位置插入不同内容时,具名插槽很有用。例如,子组件可能有一个头部、主体和尾部,父组件可以分别向这些不同位置插入内容。
作用域插槽
- 原理:作用域插槽允许子组件向父组件暴露数据,父组件在使用插槽时可以访问这些数据。子组件通过在
<slot>
标签上绑定数据,父组件通过v-slot:插槽名="插槽数据对象"
来接收并使用这些数据。 - 使用场景:当子组件内部的数据需要影响父组件插入插槽内容的渲染逻辑时,作用域插槽非常合适。
综合运用解决多层嵌套组件数据传递与条件渲染问题
- 假设多层嵌套结构如下:
App
(父组件) ->ParentComponent
->ChildComponent
(深层子组件) - 关键代码示例:
- 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
暴露给父组件ParentComponent
。ParentComponent
在使用ChildComponent
时,根据作用域插槽传递的数据slotProps.data.message
进行条件渲染,同时利用具名插槽向ChildComponent
的不同位置插入内容。这样就优雅地解决了多层嵌套组件中父组件向深层子组件传递数据并根据不同条件渲染不同内容的问题。