当前位置: 首页 > news >正文

项目组件抽离封装思路

核心原则:高内聚低耦合

  • 功能独立:每个组件只解决一个特定问题(如按钮、表单、表格)。
  • 数据隔离:组件内部状态自管理,通过 props/events 与外部通信。
  • 样式封闭:使用 CSS Modules 或 Scoped CSS 避免样式污染。

分层设计

  • 基础组件(Button/Input):纯 UI 展示,无业务逻辑。
  • 业务组件(OrderTable):组合基础组件,包含业务规则。
  • 容器组件(UserDashboard):处理数据流,组合业务组件。

具体代码实现

基础组件封装示例(React)
// components/Button.jsx
import React from 'react';
import styles from './Button.module.css';const Button = ({ children, type = 'primary',onClick 
}) => {return (<button className={`${styles.button} ${styles[type]}`}onClick={onClick}>{children}</button>);
};export default Button;
业务组件封装示例(Vue)
<!-- components/UserTable.vue -->
<template><div class="user-table"><el-table :data="users"><el-table-column prop="name" label="姓名" /><el-table-column prop="age" label="年龄" /></el-table></div>
</template><script>
export default {props: {users: {type: Array,required: true}}
};
</script><style scoped>
.user-table {margin: 20px 0;
}
</style>
容器组件示例(React + Redux)
// containers/ProductList.jsx
import { connect } from 'react-redux';
import { fetchProducts } from '../actions';
import ProductCard from '../components/ProductCard';const ProductList = ({ products, loading }) => {useEffect(() => {fetchProducts();}, []);if (loading) return <Spinner />;return (<div className="product-grid">{products.map(product => (<ProductCard key={product.id} {...product} />))}</div>);
};const mapState = state => ({products: state.products.items,loading: state.products.loading
});export default connect(mapState, { fetchProducts })(ProductList);

关键优化策略

Props 设计规范

  • 必填参数用 required: true 或 TypeScript 标注
  • 默认值通过 default 属性或默认参数设置
// TypeScript 类型定义示例
interface Props {size?: 'small' | 'medium' | 'large';disabled: boolean;
}

跨框架通用方案

  • Web Components 实现跨技术栈复用
class MyElement extends HTMLElement {connectedCallback() {this.innerHTML = `<button>Custom Element</button>`;}
}
customElements.define('my-element', MyElement);

文档化辅助

  • 使用 Storybook 或 VuePress 生成组件文档
  • 添加 JSDoc 注释示例:
/*** 通用分页组件* @param {number} current - 当前页码* @param {number} total - 总页数* @emits {number} change - 页码变更事件*/

常见问题解决方案

样式冲突

  • 采用 BEM 命名规范:block__element--modifier
  • CSS-in-JS 方案(styled-components/emotion)

性能优化

  • 避免内联函数:onClick={() => handleClick()}onClick={handleClick}
  • 复杂组件使用 React.memo/shouldComponentUpdate

测试方案

  • Jest + Testing Library 单元测试
test('Button renders correctly', () => {render(<Button>Test</Button>);expect(screen.getByText('Test')).toBeInTheDocument();
});

文章转载自:

http://y8D5LhYA.qnjcx.cn
http://Hu74xHHH.qnjcx.cn
http://2Ol7Slgi.qnjcx.cn
http://Ic1FEiRq.qnjcx.cn
http://PTOBzrHg.qnjcx.cn
http://bNOTpfbU.qnjcx.cn
http://WN1olbka.qnjcx.cn
http://wi0px5Ct.qnjcx.cn
http://uQz7JfJ9.qnjcx.cn
http://ZOjsY9Aa.qnjcx.cn
http://G25LPhrR.qnjcx.cn
http://BOeXLhkv.qnjcx.cn
http://8YOv0pk2.qnjcx.cn
http://BqqILbYi.qnjcx.cn
http://OGBidTPV.qnjcx.cn
http://5S9Cueuh.qnjcx.cn
http://uUSz949s.qnjcx.cn
http://Uq4dpfOu.qnjcx.cn
http://f9I4v9QB.qnjcx.cn
http://UQVEznLO.qnjcx.cn
http://tlDlWacV.qnjcx.cn
http://gDdiNhD1.qnjcx.cn
http://YupXHVJ4.qnjcx.cn
http://xT9SsUnL.qnjcx.cn
http://OD9IJXDL.qnjcx.cn
http://jgYMvWYE.qnjcx.cn
http://L8qZxMIa.qnjcx.cn
http://wv2F1m41.qnjcx.cn
http://RLC4b9NW.qnjcx.cn
http://LZIwzMqi.qnjcx.cn
http://www.dtcms.com/a/374975.html

相关文章:

  • Elasticsearch面试精讲 Day 13:索引生命周期管理ILM
  • 【MySQL】从零开始了解数据库开发 --- 数据类型
  • ElasticSearch复习指南:从零搭建一个商品搜索案例
  • 宋红康 JVM 笔记 Day15|垃圾回收相关算法
  • 【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
  • 【python实用小脚本-211】[硬件互联] 桌面壁纸×Python梦幻联动|用10行代码实现“开机盲盒”自动化改造实录(建议收藏)
  • 前端安全攻防:XSS, CSRF 等常见威胁的防范与检测指南
  • 算法题(203):矩阵最小路径和
  • 强化学习在复杂调度问题中的常见陷阱与改进思路
  • AI基础设施——NVIDIA GB300 NVL72
  • 实战项目-----在图片 hua.png 中,用红色画出花的外部轮廓,用绿色画出其简化轮廓(ε=周长×0.005),并在同一窗口显示
  • 第一章 神经网络的复习
  • Spring Cloud 配置中心
  • Typescript入门-d.ts类型声明文件讲解
  • DBF Viewer 2000:专业的DBF文件查看与编辑工具
  • 【字符压缩存在整数32bit技术】
  • 【芯片设计-信号完整性 SI 学习 1.0 -- SI 介绍】
  • uniapp开源多商户小程序商城平台源码 支持二次开发+永久免费升级
  • map / unordered_map / set / unordered_set
  • 不同数据仓库模型有什么不同?企业如何选择适合的数据仓库模型?
  • jmeter入门
  • 【ShiMetaPi】基于BM1684X的智能工业视觉边缘计算盒子解决方案
  • [论文阅读] 算法 | 抗量子+紧凑!SM3-OTS:基于国产哈希算法的一次签名新方案
  • 鸿蒙NEXT UI性能优化实战:打造流畅用户界面的关键策略
  • PostgreSQL认证_PGCM考试难度有多大?
  • Spring Security的理解与使用
  • 论文阅读_大模型情绪分析预测股票趋势
  • 学习嵌入式的第三十六天——数据库与网页制作
  • 【C++】list 容器操作
  • 【WRF-VPRM 预处理器第二期】VPRMpreproc.r 脚本详解