React进阶学习之组件的解耦之道

网友投稿 356 2023-04-23


React进阶学习之组件的解耦之道

前言

众所周知,React中的组件非常的灵活可扩展,不过随着业务复杂度的增加和许多外部工具库的引入,组件往往也会显得浮肿,接下来我们就一起来看看常见的几种,遵循单一职责原则的,组件分割与解耦的方法,话不多说了,来一起看看详细的介绍:

一、分割 render 函数

当一个组件渲染的内容较多时,有一个快速并且通用的方法是创建sub-render函数来简化原来庞大的 render

class Panel extends React.Component {

renderHeading() {

// ...

}

renderBody() {

// ...

}

render() {

return (

{this.renderHeading()}

{this.renderBody()}

);

}

}

为了再次简化sub-render函数,我们还可以采用Functional Components写法,这种方式生成了更小的处理单元,且更有利于测试

const PanelHeader = (props) => (

// ...

);

const PanelBody = (props) => (

// ...

);

class Panel extends React.Component {

render() {

return (

// Nice and explicit about which props are used

lKkqL

);

}

}

二、用 props 传递元素

如果一个组件的状态或配置较多,我们可以运用props传递元素而不仅是数据,比如再声明一个组件,使其中的父组件只专注于配置

class CommentTemplate extends React.Component {

static propTypes = {

// Declare slots as type node

metadata: PropTypes.node,

actions: PropTypes.node,

};

render() {

return (

// Slot for metadata

{this.props.metadata}

// Slot for actions

{this.props.actions}

);

}

}

父组件

class Comment extends React.Component {

render() {

const metahttp://data = this.props.publishTime ?

:

Saving...;

const actions = [];

if (this.props.isSignedIn) {

actions.push();

actions.push();

}

if (this.props.isAuthor) {

actions.push();

}

return ;

}

}

三、使用高阶组件

实现点击某组件的超链接,发送该组件的 ID,我们大多的解决方法可能如下

class Document extends React.Component {

componentDidMount() {

ReactDOM.findDOMNode(this).addEventListener('click', this.onClick);

}

componentWillUnmounhttp://t() {

ReactDOM.findDOMNode(this).removeEventListener('click', this.onClick);

}

onClick = (e) => {

if (e.target.tagName === 'A') { // Naive check for 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 elements

const data = mapPropsToData ? mapPropsToData(this.props) : {};

sendAnalytics('link clicked', data);

}

};

render() {

// Simply render the WrappedComponent with all props

return ;

}

}

return LinkAnalyticsWrapper;

}

简化代码如下

class Document extends React.Component {

render() {

// ...

}

}

export default withLinkAnalytics((props) => ({

documentId: props.documentId

}), Document);

总结

以上 3 个 React 组件的解耦重构方法都可以直接拿来运用,最开始可能会觉得有点棘手,但是没关系,只要坚持下来,你就会写出更强壮和可复用的代码。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持http://。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:如何设计一个可用的api网关(api网关设计原则)
下一篇:mock工具是什么(mock工具类)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~