React进阶学习之组件的解耦之道
发布时间 - 2026-01-11 02:40:32 点击率:次前言

众所周知,React中的组件非常的灵活可扩展,不过随着业务复杂度的增加和许多外部工具库的引入,组件往往也会显得浮肿,接下来我们就一起来看看常见的几种,遵循单一职责原则的,组件分割与解耦的方法,话不多说了,来一起看看详细的介绍:
一、分割 render 函数
当一个组件渲染的内容较多时,有一个快速并且通用的方法是创建sub-render函数来简化原来庞大的 render
class Panel extends React.Component {
renderHeading() {
// ...
}
renderBody() {
// ...
}
render() {
return (
<div>
{this.renderHeading()}
{this.renderBody()}
</div>
);
}
}
为了再次简化sub-render函数,我们还可以采用Functional Components写法,这种方式生成了更小的处理单元,且更有利于测试
const PanelHeader = (props) => (
// ...
);
const PanelBody = (props) => (
// ...
);
class Panel extends React.Component {
render() {
return (
<div>
// Nice and explicit about which props are used
<PanelHeader title={this.props.title}/>
<PanelBody content={this.props.content}/>
</div>
);
}
}
二、用 props 传递元素
如果一个组件的状态或配置较多,我们可以运用props传递元素而不仅是数据,比如再声明一个组件,使其中的父组件只专注于配置
class CommentTemplate extends React.Component {
static propTypes = {
// Declare slots as type node
metadata: PropTypes.node,
actions: PropTypes.node,
};
render() {
return (
<div>
<CommentHeading>
<Avatar user={...}/>
// Slot for metadata
<span>{this.props.metadata}</span>
</CommentHeading>
<CommentBody/>
<CommentFooter>
<Timestamp time={...}/>
// Slot for actions
<span>{this.props.actions}</span>
</CommentFooter>
</div>
);
}
}
父组件
class Comment extends React.Component {
render() {
const metadata = this.props.publishTime ?
<PublishTime time={this.props.publishTime} /> :
<span>Saving...</span>;
const actions = [];
if (this.props.isSignedIn) {
actions.push(<LikeAction />);
actions.push(<ReplyAction />);
}
if (this.props.isAuthor) {
actions.push(<DeleteAction />);
}
return <CommentTemplate metadata={metadata} actions={actions} />;
}
}
三、使用高阶组件
实现点击某组件的超链接,发送该组件的 ID,我们大多的解决方法可能如下
class Document extends React.Component {
componentDidMount() {
ReactDOM.findDOMNode(this).addEventListener('click', this.onClick);
}
componentWillUnmount() {
ReactDOM.findDOMNode(this).removeEventListener('click', this.onClick);
}
onClick = (e) => {
if (e.target.tagName === 'A') { // Naive check for <a> elements
sendAnalytics('link clicked', {
documentId: this.props.documentId // Specific information to be sent
});
}
};
render() {
// ...
}
}
然而它却存在代码不能复用,组件重构困难等问题
我们可以使用高阶组件来解决这些问题,顾名思义,高阶组件就是一个函数,传给它一个组件,它返回一个新的组件
function withLinkAnalytics(mapPropsToData, WrappedComponent) {
class LinkAnalyticsWrapper extends React.Component {
componentDidMount() {
ReactDOM.findDOMNode(this).addEventListener('click', this.onClick);
}
componentWillUnmount() {
ReactDOM.findDOMNode(this).removeEventListener('click', this.onClick);
}
onClick = (e) => {
if (e.target.tagName === 'A') { // Naive check for <a> elements
const data = mapPropsToData ? mapPropsToData(this.props) : {};
sendAnalytics('link clicked', data);
}
};
render() {
// Simply render the WrappedComponent with all props
return <WrappedComponent {...this.props} />;
}
}
return LinkAnalyticsWrapper;
}
简化代码如下
class Document extends React.Component {
render() {
// ...
}
}
export default withLinkAnalytics((props) => ({
documentId: props.documentId
}), Document);
总结
以上 3 个 React 组件的解耦重构方法都可以直接拿来运用,最开始可能会觉得有点棘手,但是没关系,只要坚持下来,你就会写出更强壮和可复用的代码。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
原文链接: Techniques for decomposing React components
# react
# 组件解耦之道
# 组件
# 父子组件通信
# 使用React实现轮播效果组件示例代码
# React组件的三种写法总结
# React创建组件的三种方式及其区别
# 详解React中的组件通信问题
# React组件生命周期详解
# React组件之间的通信的实例代码
# 基于react组件之间的参数传递(详解)
# React如何利用相对于根目录进行引用组件详解
# 高阶
# 重构
# 复用
# 好了
# 也会
# 还可以
# 说了
# 不多
# 我们可以
# 而不
# 更有
# 较多
# 可以直接
# 几种
# 使其
# 仅是
# 可以使用
# 顾名思义
# 这篇文章
# 谢谢大家
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
佛山网站制作系统,佛山企业变更地址网上办理步骤?
android nfc常用标签读取总结
HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
Python企业级消息系统教程_KafkaRabbitMQ高并发应用
如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环
微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
如何用狗爹虚拟主机快速搭建网站?
Laravel Docker环境搭建教程_Laravel Sail使用指南
php结合redis实现高并发下的抢购、秒杀功能的实例
Laravel怎么判断请求类型_Laravel Request isMethod用法
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
JS碰撞运动实现方法详解
如何在企业微信快速生成手机电脑官网?
千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】
通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
高端网站建设与定制开发一站式解决方案 中企动力
javascript中对象的定义、使用以及对象和原型链操作小结
Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】
如何为不同团队 ID 动态生成多个非值班状态按钮
微信小程序 五星评分(包括半颗星评分)实例代码
Laravel如何使用Sanctum进行API认证?(SPA实战)
laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析
微信小程序 HTTPS报错整理常见问题及解决方案
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
如何构建满足综合性能需求的优质建站方案?
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解
js代码实现下拉菜单【推荐】
javascript中闭包概念与用法深入理解
如何在自有机房高效搭建专业网站?
如何确保西部建站助手FTP传输的安全性?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
php485函数参数是什么意思_php485各参数详细说明【介绍】
如何在万网自助建站中设置域名及备案?
如何在IIS中新建站点并解决端口绑定冲突?
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
如何在建站之星绑定自定义域名?
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程
如何在IIS7中新建站点?详细步骤解析
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
Laravel如何使用Blade组件和插槽?(Component代码示例)
Android okhttputils现在进度显示实例代码
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?

