React进阶学习之组件的解耦之道
前言
众所周知,React中的组件非常的灵活可扩展,不过随着业务复杂度的增加和许多外部工具库的引入,组件往往也会显得浮肿,接下来我们就一起来看看常见的几种,遵循单一职责原则的,组件分割与解耦的方法,话不多说了,来一起看看详细的介绍:
一、分割render函数
当一个组件渲染的内容较多时,有一个快速并且通用的方法是创建sub-render函数来简化原来庞大的render
classPanelextendsReact.Component{
renderHeading(){
//...
}
renderBody(){
//...
}
render(){
return(
{this.renderHeading()}
{this.renderBody()}
);
}
}
为了再次简化sub-render函数,我们还可以采用FunctionalComponents写法,这种方式生成了更小的处理单元,且更有利于测试
constPanelHeader=(props)=>(
//...
);
constPanelBody=(props)=>(
//...
);
classPanelextendsReact.Component{
render(){
return(
//Niceandexplicitaboutwhichpropsareused
);
}
}
二、用props传递元素
如果一个组件的状态或配置较多,我们可以运用props传递元素而不仅是数据,比如再声明一个组件,使其中的父组件只专注于配置
classCommentTemplateextendsReact.Component{
staticpropTypes={
//Declareslotsastypenode
metadata:PropTypes.node,
actions:PropTypes.node,
};
render(){
return(
//Slotformetadata
{this.props.metadata}
//Slotforactions
{this.props.actions}
);
}
}
父组件
classCommentextendsReact.Component{
render(){
constmetadata=this.props.publishTime?
:
Saving...;
constactions=[];
if(this.props.isSignedIn){
actions.push( );
actions.push( );
}
if(this.props.isAuthor){
actions.push( );
}
return ;
}
}
三、使用高阶组件
实现点击某组件的超链接,发送该组件的ID,我们大多的解决方法可能如下
classDocumentextendsReact.Component{
componentDidMount(){
ReactDOM.findDOMNode(this).addEventListener('click',this.onClick);
}
componentWillUnmount(){
ReactDOM.findDOMNode(this).removeEventListener('click',this.onClick);
}
onClick=(e)=>{
if(e.target.tagName==='A'){//Naivecheckforelements
sendAnalytics('linkclicked',{
documentId:this.props.documentId//Specificinformationtobesent
});
}
};
render(){
//...
}
}
然而它却存在代码不能复用,组件重构困难等问题
我们可以使用高阶组件来解决这些问题,顾名思义,高阶组件就是一个函数,传给它一个组件,它返回一个新的组件
functionwithLinkAnalytics(mapPropsToData,WrappedComponent){
classLinkAnalyticsWrapperextendsReact.Component{
componentDidMount(){
ReactDOM.findDOMNode(this).addEventListener('click',this.onClick);
}
componentWillUnmount(){
ReactDOM.findDOMNode(this).removeEventListener('click',this.onClick);
}
onClick=(e)=>{
if(e.target.tagName==='A'){//Naivecheckforelements
constdata=mapPropsToData?mapPropsToData(this.props):{};
sendAnalytics('linkclicked',data);
}
};
render(){
//SimplyrendertheWrappedComponentwithallprops
return ;
}
}
returnLinkAnalyticsWrapper;
}
简化代码如下
classDocumentextendsReact.Component{
render(){
//...
}
}
exportdefaultwithLinkAnalytics((props)=>({
documentId:props.documentId
}),Document);
总结
以上3个React组件的解耦重构方法都可以直接拿来运用,最开始可能会觉得有点棘手,但是没关系,只要坚持下来,你就会写出更强壮和可复用的代码。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。
原文链接:TechniquesfordecomposingReactcomponents