面试题答案
一键面试整体架构设计
- 基础组件层:构建一系列基础UI组件,如按钮、输入框等。这些组件应设计得简洁且功能单一,便于复用。
- 容器组件层:利用Fragment特性,创建可灵活组合基础组件的容器组件。Fragment允许在不额外生成DOM元素的情况下进行组件嵌套,提升性能与灵活性。例如,一个卡片容器组件可以通过Fragment包裹标题、内容等子组件。
- Teleport组件:用于将组件渲染到指定的DOM位置,解决一些特殊场景下组件渲染位置的需求,如模态框、提示框等,使其脱离原组件层级结构进行渲染。
组件间通信方式
- props与$emit:对于父子组件通信,父组件通过props向子组件传递数据,子组件通过$emit触发事件向父组件传递数据,这在Vue 2和Vue 3中都是通用的方式。
- 事件总线(Vue 2):在Vue 2中,可以创建一个Vue实例作为事件总线,用于非父子组件间通信。各组件通过该实例的$on和$emit方法进行事件监听与触发。
- Vuex(Vue 2和Vue 3):对于大型应用,使用Vuex进行状态管理,实现组件间共享状态的管理与通信,统一管理应用的数据流。
- provide/inject(Vue 2和Vue 3):祖先组件通过provide提供数据,后代组件通过inject注入数据,实现跨层级组件通信。
保证兼容性并发挥新特性优势
- 语法兼容:编写代码时遵循Vue 2和Vue 3都支持的语法规范,如模板语法、生命周期钩子等。对于Vue 3独有的特性,如Teleport,通过条件判断或封装成可兼容的方式使用。
- 特性使用:在兼容的基础上,充分利用Fragment减少不必要的DOM元素,提升性能。Teleport则用于解决特定场景下的渲染需求,如将模态框渲染到body下,避免层级嵌套带来的样式和布局问题。
关键代码示例
Vue 2中使用Fragment模拟(Vue 2实际没有Fragment,用render函数模拟)
Vue.component('Card', {
render: function (createElement) {
return createElement('div', {}, [
this.$slots.default
]);
}
});
Vue 3中使用Fragment
<template>
<div>
<template>
<h1>Card Title</h1>
<p>Card Content</p>
</template>
</div>
</template>
Vue 3中使用Teleport
<template>
<div>
<button @click="showModal = true">打开模态框</button>
<Teleport to="body">
<div v-if="showModal" class="modal">
<div class="modal-content">
<p>模态框内容</p>
<button @click="showModal = false">关闭</button>
</div>
</div>
</Teleport>
</div>
</template>
<script>
export default {
data() {
return {
showModal: false
};
}
};
</script>
组件间通信 - props与$emit
父组件
<template>
<div>
<ChildComponent :message="parentMessage" @child-event="handleChildEvent"></ChildComponent>
</div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {
ChildComponent
},
data() {
return {
parentMessage: '来自父组件的数据'
};
},
methods: {
handleChildEvent(data) {
console.log('接收到子组件数据:', data);
}
}
};
</script>
子组件
<template>
<div>
<p>{{ message }}</p>
<button @click="sendDataToParent">发送数据到父组件</button>
</div>
</template>
<script>
export default {
props: ['message'],
methods: {
sendDataToParent() {
this.$emit('child-event', '来自子组件的数据');
}
}
};
</script>