资讯专栏INFORMATION COLUMN

理解React高阶组件

jzman / 1024人阅读

摘要:用简单的话来说,主要是为了更大程度的复用现有代码,抽离代码而产生的一个模式高阶组件的参数可以为一个组件,通过一个组件再去生成另一个组件用官方的例子来解释现有一个组件如下就是全局的数据源添加事件处理函数订阅数据清除事件处理函数任何时候数据发生

用简单的话来说,主要是为了更大程度的复用现有代码,抽离代码而产生的一个模式
高阶组件的参数可以为一个组件,通过一个组件再去生成另一个组件
用官方的例子来解释:
现有一个CommentList组件如下

class CommentList extends React.Component {
  constructor() {
    super();
    this.handleChange = this.handleChange.bind(this);
    this.state = {
      // "DataSource" 就是全局的数据源
      comments: DataSource.getComments()
    };
  }

  componentDidMount() {
    // 添加事件处理函数订阅数据
    DataSource.addChangeListener(this.handleChange);
  }

  componentWillUnmount() {
    // 清除事件处理函数
    DataSource.removeChangeListener(this.handleChange);
  }

  handleChange() {
    // 任何时候数据发生改变就更新组件
    this.setState({
      comments: DataSource.getComments()
    });
  }

  render() {
    return (
      
{this.state.comments.map((comment) => ( ))}
); } }

同时有另一个BlogPost组件如下:

class BlogPost extends React.Component {
  constructor(props) {
    super(props);
    this.handleChange = this.handleChange.bind(this);
    this.state = {
      blogPost: DataSource.getBlogPost(props.id)
    };
  }

  componentDidMount() {
    DataSource.addChangeListener(this.handleChange);
  }

  componentWillUnmount() {
    DataSource.removeChangeListener(this.handleChange);
  }

  handleChange() {
    this.setState({
      blogPost: DataSource.getBlogPost(this.props.id)
    });
  }

  render() {
    return ;
  }
}

可以看出这两个组件中的结构基本一致,都是通过DataSource接收数据,然后监听,解除监听,然后渲染
那么我们就可以将公共的部分提取出来,如下:

// 函数接受一个组件参数……
function withSubscription(WrappedComponent, selectData) {
  // ……返回另一个新组件……
  return class extends React.Component {
    constructor(props) {
      super(props);
      this.handleChange = this.handleChange.bind(this);
      this.state = {
        data: selectData(DataSource, props)
      };
    }

    componentDidMount() {
      // ……注意订阅数据……
      DataSource.addChangeListener(this.handleChange);
    }

    componentWillUnmount() {
      DataSource.removeChangeListener(this.handleChange);
    }

    handleChange() {
      this.setState({
        data: selectData(DataSource, this.props)
      });
    }

    render() {
      // ……使用最新的数据渲染组件
      // 注意此处将已有的props属性传递给原组件
      return ;
    }
  };
}

然后就可以通过withSubscription组件来生成新的组件:

const CommentListWithSubscription = withSubscription(
  CommentList,
  (DataSource) => DataSource.getComments()
);

const BlogPostWithSubscription = withSubscription(
  BlogPost,
  (DataSource, props) => DataSource.getBlogPost(props.id)
);


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/105034.html

相关文章

  • react进阶系列:高阶组件详解(一)

    摘要:创建一个普通函数因为的存在所以变成构造函数创建一个方法在方法中,创建一个中间实例对中间实例经过逻辑处理之后返回使用方法创建实例而恰好,高阶组件的创建逻辑与使用,与这里的方法完全一致。因为方法其实就是构造函数的高阶组件。 很多人写文章喜欢把问题复杂化,因此当我学习高阶组件的时候,查阅到的很多文章都给人一种高阶组件高深莫测的感觉。但是事实上却未必。 有一个词叫做封装。相信写代码这么久了,大...

    NervosNetwork 评论0 收藏0
  • 初识react高阶组件

    摘要:也明确了大数据时代,前端所应该具备的职业素养高阶组件高阶组件,高阶组件就是一个组件包裹着另外一个组件中两种的实现方法中两种的实现方法返回的类继承了。之所以被称为是因为被继承了,而不是继承了。在这种方式中,它们的关系看上去被反转了。 前言 最近一直再做数据可视化,业务的理解,数据的理解确实如数据可视化要求的一样,有了更多的理解。但是技术上还停留在echart,Hchart, 画图上。正好...

    IamDLY 评论0 收藏0
  • React高阶组件

    摘要:高阶组件高阶函数接收函数作为输入,或者输出另一个函数的一类函数高阶组件接收组件作为输入,输出一个新的组件的组件。包含了一系列实用的高阶组件库拖动库深入理解高阶组件其中详细介绍了属性代理和反向继承的区别。 React高阶组件 高阶函数: 接收函数作为输入,或者输出另一个函数的一类函数; 高阶组件: 接收React组件作为输入,输出一个新的React组件的组件。 高阶组件通过包裹一个新传入...

    cncoder 评论0 收藏0
  • 学习es7的Decorator(顺带写个react高阶组件)

    摘要:为了代码进一步解耦,可以考虑使用高阶组件这种模式。开源的高阶组件使用提供了一系列使用的高阶组件,可以增强组件的行为,可以利用此库学习高阶组件的写法。通过使用此库提供的高阶组件,可以方便地让列表元素可拖动。 1. Decorator基本知识 在很多框架和库中看到它的身影,尤其是React和Redux,还有mobx中,那什么是装饰器呢。 修饰器(Decorator)是一个函数,用来修改类的...

    xiyang 评论0 收藏0
  • React高阶组件

    摘要:结语高阶函数对于初学者来说可能不太好理解,但当你深入其中,了解其中的原理之后,我们可以使用高阶函数来完成很多的工作。 前段时间在工作中写Hybrid页面时遇到了这样的一个场景,公司需要一系列的活动组件,在每个组件注册的时候都需要调用App端提供的一个接口。一开始也考虑了几种方式,包括mixin、组件继承以及react高阶组件。但经过了种种衡量,最后选择使用了高阶组件的做法。 1、Mix...

    ThinkSNS 评论0 收藏0
  • 理解React高阶组件(装饰器)

    摘要:高阶组件主要又分为属性代理和反向继承两种类型,上述举例中的函数就属于属性代理的类型。记住,高阶函数返回的是一个函数,我们只是对其进行了相对应的包装。 首先在正式的高阶组件之前我们先来了解一下函数的类似操作: function hello () { console.log(hello) } function WrapperHello (fn) { return func...

    frank_fun 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<