一、前端组件的分类
前端组件可以按照 功能、用途、通用性 等不同维度进行分类,主要包括以下几类:
1. 按功能分类
-
展示型组件(UI 组件)
- 只负责 UI 视图渲染,不涉及业务逻辑
- 例如:按钮(Button)、输入框(Input)、表单(Form)、卡片(Card)等
-
业务逻辑组件
- 具有特定业务逻辑,通常和接口交互
- 例如:用户列表(UserList)、订单管理(OrderTable)等
-
功能组件(工具类组件)
- 提供功能性封装,通常无 UI
- 例如:请求封装(HttpClient)、WebSocket 连接组件、权限控制组件
2. 按通用性分类
-
基础组件(基础 UI 组件库)
- 低级别的可复用组件,通常是原子级别组件
- 例如:
Button、Checkbox、Table
-
组合组件(复合组件)
- 由多个基础组件组合而成
- 例如:带搜索的表格(SearchTable = SearchBox + Table)
-
页面级组件
- 整个页面的组件,包含多个子组件
- 例如:
DashboardPage.vue、UserProfile.vue
3. 按状态管理分类
-
受控组件(Controlled Components)
- 组件的状态由
props控制,父组件决定组件如何变化 - 例如:受控
Input组件,值由value和onChange传入控制
- 组件的状态由
-
非受控组件(Uncontrolled Components)
- 组件自己管理状态,不依赖
props - 例如:
ref获取input值,而非value
- 组件自己管理状态,不依赖
4. 按生命周期分类
-
静态组件
- 组件的内容不会随着状态改变,如 Logo、导航栏
-
动态组件
- 组件会根据用户操作或数据变化进行更新
二、封装组件需要注意的事项
封装组件时需要考虑 可复用性、可维护性、性能优化、易扩展性 等因素,以下是一些关键点:
1. 组件的设计原则
(1)高内聚,低耦合
- 组件内部的功能应尽可能相关,而不应耦合过多业务逻辑
- 避免在 UI 组件中写 API 请求逻辑,应该拆分到
services里
(2)单一职责
- 每个组件应该只负责一件事,例如
Button组件不应该有复杂的Form逻辑
(3)通用性
- 组件应该尽可能复用,例如
Table组件支持传columns让用户自定义
(4)易扩展
- 通过
slots、props或emit让组件更灵活
2. 组件的 API 设计
组件的 props 和 events 应该清晰合理,常见的 API 设计规则:
(1)合理使用 props
-
例如
Button组件:vue 复制编辑 <Button type="primary" size="large" @click="handleClick">点击我</Button>js 复制编辑 props: { type: { type: String, default: "default" }, // primary | default | danger size: { type: String, default: "medium" }, // small | medium | large }
(2)事件回调 emit
-
组件应该使用
emit让父组件监听事件:vue 复制编辑 <CustomInput @change="handleInputChange" />js 复制编辑 emits: ["change"]
3. 组件的样式管理
-
避免直接修改全局样式
-
推荐使用
scoped限制样式范围 -
使用
CSS Variables提高灵活性css 复制编辑 :root { --primary-color: #409eff; }
4. 组件的性能优化
(1)避免不必要的 re-render
- 在 Vue 中,可以使用
computed计算属性代替data,减少不必要的重新渲染 - 在 React 中,使用
React.memo让组件只在props变化时重新渲染
(2)按需加载
-
例如
el-dialog组件:vue 复制编辑 <keep-alive> <LazyComponent v-if="show" /> </keep-alive>
三、代码示例:封装一个 BaseButton 组件
vue
复制编辑
<template>
<button :class="['base-button', `base-button--${type}`, `base-button--${size}`]" @click="$emit('click')">
<slot></slot>
</button>
</template>
<script>
export default {
props: {
type: { type: String, default: "default" }, // default | primary | danger
size: { type: String, default: "medium" }, // small | medium | large
},
emits: ["click"],
};
</script>
<style scoped>
.base-button {
border: none;
padding: 10px 20px;
cursor: pointer;
transition: all 0.3s;
}
.base-button--primary {
background-color: #409eff;
color: white;
}
.base-button--danger {
background-color: #f56c6c;
color: white;
}
.base-button--medium {
font-size: 14px;
}
.base-button--large {
font-size: 18px;
padding: 12px 24px;
}
</style>
四、总结
1.前端组件的分类
- 按功能:UI 组件、业务组件、工具组件
- 按通用性:基础组件、组合组件、页面级组件
- 按状态管理:受控组件、非受控组件
2.封装组件要注意的点
- 高内聚,低耦合,让组件更可复用
- 合理设计 API,让
props和emit更易用 - 样式管理,避免污染全局
- 性能优化,减少不必要的渲染
这样封装的组件才能真正做到高效、可维护、易扩展 !