面试官:你是如何封装组件的?

266 阅读3分钟

封装组件就像搭积木,要既灵活又稳固。让我用六个步骤给您演示这个思考过程:


一、先问为什么,再想怎么做(确认动机)

就像做菜前要确定是家常小炒还是米其林大餐,封装组件前必须明确动机。我遇到过三种典型场景:

  1. 解耦复杂界面(比如把一个300行的页面拆成5个小组件)
  2. 项目内复用(如自定义的日期选择器)
  3. 跨项目/开源(像我们团队把审批流程组件发布成npm包)

比如上周我重构审批页面时,发现五个模块都在重复写相似的表单代码,这时候就该抽离成通用表单组件了。


二、画好"势力范围"最重要(分析边界)

组件就像乐高积木——越基础的颗粒越百搭。这里有个有趣的对比:

组件类型边界特点案例
业务组件大而全(像预制菜)包含特定API调用的登录模块
通用组件小而美(像调味料)带校验规则的输入框

记得去年封装表格组件时,我刻意把数据获取逻辑留在外部,只处理渲染和分页,这样既能在商品列表用,也能在订单管理复用。


三、设计说明书是关键(设计接口)

好的组件接口要像产品说明书一样清晰。我通常会准备三个"工具包":

  1. 属性包:用PropTypes/TS定义配置项,比如按钮的type/size
  2. 插槽兜底:用<slot name="footer">处理特殊布局
  3. 事件通知:用$emit传递状态变化,比如@submit-success

就像这个日历组件:

props: {
  markDates: { type: Array, default: () => [] } // 标记特殊日期
},
emits: ['date-selected'], // 选中日期事件
slots: {
  header: '<div>自定义头部</div>' 
}

四、给组件找个合适的"家"(代码实现)

代码组织就像整理房间,我有两个常用方案:

  1. 单项目组件:放在src/components/base/Button.vue
  2. 跨项目组件:用Vite/Vue CLI单独打包,发布到私有npm仓库

我们团队用Storybook搭建组件库文档站,新同事上手效率提高了40%!


五、测试不是选修课(功能测试)

根据组件重要性选择测试策略:

  • 基础测试:手动验证核心功能(80%的问题出在20%的功能)
  • 进阶保障:用Jest写单元测试 + Cypress做E2E测试
  • 边界案例:比如表格在空数据时的骨架屏展示

六、维护是组件的生命线(后续维护)

我坚持三个原则:

  1. 每次迭代更新CHANGELOG
  2. 用SemVer规范版本号(major.minor.patch)
  3. 收集用户反馈建立需求池(像维护开源项目一样)

比如我们的消息通知组件,通过收集业务方反馈,逐步增加了悬浮位置配置、自动关闭时长等特性。


总结来说,封装组件就像设计精良的瑞士军刀——在灵活性和易用性之间找到平衡点。把握住动机→边界→接口这三个核心,就能避免组件变成难以维护的"屎山代码"。您觉得这样的思路是否符合您的预期呢?