本人认为回答这个问题有三个点(1-为什么2-怎么实现3-需要注意什么)
1.跟面试官阐述为什么要二次封装组件
2.二次封装组件怎么实现(公共样式、通信传值等)
3.二次封装组件需要注意什么(保留原生组件功能,不能说二次封装了把原有的组件方法和属性影响掉了,另外还有避免全局样式污染等等)
一、阐述逻辑与核心要点(为什么)
1.封装动机
建议回答结构:
在项目中二次封装Element-UI组件主要是基于以下需求:
① 统一业务规范:例如表单验证规则、表格操作列样式等高频重复场景需要标准化
② 扩展原生能力:如给表格增加全局Loading状态管理、按钮增加权限拦截等业务强关联功能
③ 降低维护成本:通过封装统一处理Element版本升级带来的兼容性问题"
2.实现方法(怎么实现--示例部分)
// 示例:封装表格组件时保留原生能力
export default {
inheritAttrs: false, // 禁用默认属性透传
props: {
// 扩展业务属性
autoHeight: { type: Boolean, default: true }
},
mounted() {
// 保留原生方法调用能力
this.$refs.elTable.clearSelection();
},
methods: {
// 扩展业务方法
exportExcel() { ... }
}
}
技术说明:
- 属性透传:通过
v-bind="$attrs"
继承所有未声明props的原生属性 - 事件继承:使用
v-on="$listeners"
透传原生事件 - 插槽兼容:动态渲染
<slot>
并保留作用域插槽$scopedSlots
二、注意事项与高阶技巧(需要注意什么)
1.接口继承 -- 保留原生组件全部功能,比如它的一些属性和方法等等。通过使用$attrs透传属性和$listeners透传事件去处理。
2.样式隔离 -- 避免全局样式污染 可以通过外层容器添加命名空间(如.custom-table-wrap),内部使用:deep()穿透修改Element样式
3.功能拓展 -- 新增业务逻辑不破坏原有行为 通过Mixin注入扩展方法,用$refs调用原生API
4.数据流 -- 遵循单向数据流原则 ,复杂场景用V-model拆分为:value + @inputm避免直接修改props