博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
React 组件解耦之道
阅读量:6642 次
发布时间:2019-06-25

本文共 3112 字,大约阅读时间需要 10 分钟。

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
); }}

用 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 metadata = 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);  }  componentWillUnmount() {    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://doovo.baihongyu.com/

你可能感兴趣的文章
《Perl语言入门》之六——正则表达式
查看>>
Linux之strace简单用法
查看>>
Javascript中的DOM
查看>>
按需路由原理 (ODR-On Demand Routing)
查看>>
corosync与pacemaker实现nfs作为共享存储的Mysql高可用!
查看>>
Safengine NoobyProtect 过注册半自动脚本
查看>>
redis_3.0.7_sds.c_sdsclear()
查看>>
MySQL阶段五——主从复制原理、主从延迟原理与解决
查看>>
我的友情链接
查看>>
JS 有趣的应用 : Array.prototype.slice.call(arguments,0)
查看>>
Linux命令:特殊权限SUID、GUID、Sticky
查看>>
<文明开房 低调叫床> 高考满分作文
查看>>
【Spark亚太研究院系列丛书】Spark实战高手之路-第一章 构建Spark集群(第四步)(4)...
查看>>
【linux系统优化】Selinux介绍及关闭方法
查看>>
阶段总结
查看>>
我的友情链接
查看>>
Spring aop 前置通知、后置通知、返回通知、 异常通知 、后置通知
查看>>
Android中选项卡TabHost的基本使用
查看>>
数据库优化的三个例子
查看>>
Vintage、滚动率、迁移率的应用
查看>>