前言

众所周知,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如何利用相对于根目录进行引用组件详解
# 高阶
# 重构
# 复用
# 好了
# 也会
# 还可以
# 说了
# 不多
# 我们可以
# 而不
# 更有
# 较多
# 可以直接
# 几种
# 使其
# 仅是
# 可以使用
# 顾名思义
# 这篇文章
# 谢谢大家
相关文章:
简单实现Android文件上传
如何在Tomcat中配置并部署网站项目?
简历在线制作网站免费,免费下载个人简历的网站是哪些?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
如何用wdcp快速搭建高效网站?
如何在橙子建站中快速调整背景颜色?
网站网页制作专业公司,怎样制作自己的网页?
家庭服务器如何搭建个人网站?
建站之星后台密码遗忘如何找回?
山东云建站价格为何差异显著?
成都网站制作公司哪家好,四川省职工服务网是做什么用?
如何在云指建站中生成FTP站点?
已有域名和空间,如何快速搭建网站?
制作网站的基本流程,设计网站的软件是什么?
网站制作报价单模板图片,小松挖机官方网站报价?
建站上市公司网站建设方案与SEO优化服务定制指南
如何快速生成ASP一键建站模板并优化安全性?
打鱼网站制作软件,波克捕鱼官方号怎么注册?
如何在阿里云域名上完成建站全流程?
家具网站制作软件,家具厂怎么跑业务?
如何在建站之星绑定自定义域名?
如何在云虚拟主机上快速搭建个人网站?
建站之星多图banner生成与模板自定义指南
网站制作软件有哪些,制图软件有哪些?
网站制作服务平台,有什么网站可以发布本地服务信息?
网站制作模板下载什么软件,ppt模板免费下载网站?
如何快速查询网站的真实建站时间?
盘锦网站制作公司,盘锦大洼有多少5G网站?
宿州网站制作公司兴策,安徽省低保查询网站?
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
网站制作公司排行榜,四大门户网站排名?
,南京靠谱的征婚网站?
如何生成腾讯云建站专用兑换码?
深入理解Android中的xmlns:tools属性
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?
如何自定义建站之星网站的导航菜单样式?
导航网站建站方案与优化指南:一站式高效搭建技巧解析
如何在云服务器上快速搭建个人网站?
广州建站公司哪家好?十大优质服务商推荐
成都网站制作报价公司,成都工业用气开户费用?
合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?
*服务器网站为何频现安全漏洞?
如何通过.red域名打造高辨识度品牌网站?
设计网站制作公司有哪些,制作网页教程?
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
头像制作网站在线制作软件,dw网页背景图像怎么设置?
如何通过服务器快速搭建网站?完整步骤解析
*请认真填写需求信息,我们会在24小时内与您取得联系。