面试题答案
一键面试1. 使用Fragment和Slot实现内容分发
- Fragment(片段):在Vue中,Fragment允许我们在不额外添加DOM元素的情况下包裹多个子元素。在顶层组件模板中,使用
template
标签包裹需要分发的内容,这就相当于一个Fragment。例如:
<template>
<template>
<!-- 这里放置要分发到不同底层组件的内容 -->
<div>内容1</div>
<div>内容2</div>
</template>
</template>
- Slot(插槽):在底层组件中,通过定义插槽来接收顶层组件分发的内容。例如,在底层组件
ChildComponent
的模板中:
<template>
<div>
<slot></slot>
</div>
</template>
在顶层组件使用ChildComponent
时,将内容插入到插槽中:
<template>
<ChildComponent>
<div>要插入到ChildComponent插槽的内容</div>
</ChildComponent>
</template>
2. 处理作用域插槽
- 定义作用域插槽:当底层组件需要向插槽传递数据时,使用作用域插槽。在底层组件模板中,在
slot
标签上绑定数据:
<template>
<div>
<slot :data="localData">默认内容</slot>
</div>
</template>
<script>
export default {
data() {
return {
localData: '来自底层组件的数据'
}
}
}
</script>
- 使用作用域插槽:在顶层组件使用底层组件时,通过解构获取传递的数据:
<template>
<ChildComponent>
<template v-slot:default="scope">
<div>{{ scope.data }}</div>
</template>
</ChildComponent>
</template>
3. 数据的传递和更新
- 数据传递:
- 父传子:顶层组件可以通过props向底层组件传递数据,底层组件在
props
选项中声明接收。例如,顶层组件:
- 父传子:顶层组件可以通过props向底层组件传递数据,底层组件在
<template>
<ChildComponent :parentData="topLevelData"></ChildComponent>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {
ChildComponent
},
data() {
return {
topLevelData: '顶层组件的数据'
}
}
}
</script>
底层组件:
<template>
<div>{{ parentData }}</div>
</template>
<script>
export default {
props: ['parentData']
}
</script>
- 更新数据:
- 当顶层组件数据更新时,会自动传递给底层组件,底层组件会响应式更新视图。如果底层组件需要更新顶层组件的数据,可以通过
$emit
触发事件,顶层组件监听该事件并更新数据。例如,底层组件:
- 当顶层组件数据更新时,会自动传递给底层组件,底层组件会响应式更新视图。如果底层组件需要更新顶层组件的数据,可以通过
<template>
<button @click="updateParent">更新顶层数据</button>
</template>
<script>
export default {
methods: {
updateParent() {
this.$emit('updateTopLevel', '新的数据');
}
}
}
</script>
顶层组件:
<template>
<ChildComponent @updateTopLevel="updateData"></ChildComponent>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {
ChildComponent
},
methods: {
updateData(newData) {
this.topLevelData = newData;
}
}
}
</script>
大致实现框架思路
- 顶层组件:组织需要分发的内容,使用
template
作为Fragment包裹内容。通过props向底层组件传递数据,监听底层组件触发的事件来更新自身数据。 - 底层组件:通过插槽接收顶层组件分发的内容,通过作用域插槽向插槽传递数据。通过props接收顶层组件传递的数据,通过
$emit
触发事件通知顶层组件更新数据。