稀土掘金 稀土掘金

React中PureComponent和Component的区别

在今天之前,一直都是处于边学习边用react开发项目的过程中,起初一直以为 PureComponent 和 Component 功能是一样的,只是 PureComponent 与 Component 相比提升了性能,但是为什么提升性能以及两者之间又有什么不同没有去进行深入的了解。近来在深入研究 React 的过程中,才发现了 PureComponent 是如何达到性能提升的优化,并对其进行了一番资料查找学习研究O(∩_∩)O~。

区别:

  • PureComponent 通过 propstate 的浅比较来实现 shouldComponentUpdate,当 prop 或 state 的值或者引用地址发生改变时,组件就会发生更新。

  • Component 只要 state 发生改变, 不论值是否与之前的相等,都会触发更新。

什么是浅比较?

就是对比当前状态(current)下一个状态(next)下的 prop 和 state时,比较基本数据类型是否相同(如: 'a' === 'a'), 而引用数据类型则是比较其引用地址是否相同,与值内容无关。

注意:在 PureComponent 中,当对传入的对象或者数组进行直接赋值时,因为并没有改变其引用地址,所以就不引起重新渲染。

示例一:

import React, { Component, PureComponent } from 'react';

class ComponentDiff extends Component {
  render() {
    return (
      <div>
        different between PureComponent and Component <br />
        please open console
        <div style={{ display: 'flex' }}>
          <div style={{ marginRight: 200 }}>
            <ComponentDiffPure />
          </div>
          <ComponentDiffNormal />
        </div>
      </div>
    );
  }
}

export default ComponentDiff;

class ComponentDiffPure extends PureComponent {
  constructor() {
    super();
    this.state = { text: 'true' };
    console.log('pure-constructor');
  }

  changeState = () => {
    this.setState({ text: 'false' });
  };

  render() {
    console.log('pure-render');
    return (
      <div>
        pure
        <button onClick={this.changeState}>Click</button>
        <div>{this.state.text}</div>
      </div>
    );
  }
}

class ComponentDiffNormal extends Component {
  constructor() {
    super();
    this.state = { text: 'true' };
    console.log('normal-constructor');
  }

  changeState = () => {
    this.setState({ text: 'false' });
  };

  render() {
    console.log('normal-render');
    return (
      <div>
        normal
        <button onClick={this.changeState}>Click</button>
        <div>{this.state.text}</div>
      </div>
    );
  }
}

示例对应效果图如下,从操作中可以看出,在挂载时都会执行constructor和render方法,而在state改变时,PureComponent只在state的text值改变时执行了一次render方法,而Component会每次执行,这就是其浅对比功能体现的地方;

image.png

示例二:

这是一个组件的子树。每个节点中,SCU 代表 shouldComponentUpdate 返回的值,而 vDOMEq 代表返回的 React 元素是否相同。最后,圆圈的颜色代表了该组件是否需要被调停。

image.png

讲解: 节点 C2 的 shouldComponentUpdate 返回了 false,React 因而不会去渲染 C2,也因此 C4 和 C5 的 shouldComponentUpdate 不会被调用到。

对于 C1 和 C3,shouldComponentUpdate 返回了 true,所以 React 需要继续向下查询子节点。这里 C6 的 shouldComponentUpdate 返回了 true,同时由于渲染的元素与之前的不同使得 React 更新了该 DOM。

最后一个有趣的例子是 C8。React 需要渲染这个组件,但是由于其返回的 React 元素和之前渲染的相同,所以不需要更新 DOM。

显而易见,你看到 React 只改变了 C6 的 DOM。对于 C8,通过对比了渲染的 React 元素跳过了渲染。而对于 C2 的子节点和 C7,由于 shouldComponentUpdate 使得 render 并没有被调用。因此它们也不需要对比元素了。

总结

  1. PureComponent 不仅会影响本身,而且会影响子组件。
  2. 如果 prop 和 state 每次都会变,那么使用 Component 的效率会更好,因为浅比较也是需要时间的。
  3. 若有shouldComponentUpdate,则执行shouldComponentUpdate,若没有shouldComponentUpdate方法会判断是不是PureComponent,若是,进行浅比较

注意: 继承自Component的组件,若是shouldComponentUpdate返回false,就不会渲染了,继承自PureComponent的组件不用我们手动去判断prop和state,所以在PureComponent中使用shouldComponentUpdate会有如下警告: IndexPage has a method called shouldComponentUpdate(). shouldComponentUpdate should not be used when extending React.PureComponent. Please extend React.Component if shouldComponentUpdate is used.

参考资料:

react.docschina.org/docs/optimi…

blog.csdn.net/weixin_3624…

www.jianshu.com/p/b7733dc8f…

玻璃钢生产厂家黔西南玻璃钢雕塑厂河北玻璃钢观音雕塑定做江西户内玻璃钢雕塑优势焦作玻璃钢人物雕塑铸造工艺仿铜西式玻璃钢雕塑厂家深圳高档玻璃钢花盆不锈钢牛玻璃钢仿铜雕塑制造园林景观玻璃钢雕塑工厂宁德仿铜西式玻璃钢雕塑安徽口碑好玻璃钢雕塑玻璃钢花盆磨具佛山玻璃钢人物雕塑东莞商场玻璃钢花盆福建玻璃钢雕塑生产商场创意美陈吊饰玻璃钢卡通座椅雕塑代梅玻璃钢雕塑菏泽玻璃钢人物卡通雕塑厂家民权定做玻璃钢雕塑厂电话赤峰人物玻璃钢雕塑生产厂家衢州学校玻璃钢雕塑销售厂家山东玻璃钢海豚雕塑濮阳玻璃钢雕塑报价潮州玻璃钢昆虫雕塑定制关公玻璃钢雕塑公司哪家好华容玻璃钢花盆花器国外商场花艺美陈昌邑玻璃钢游乐场门头雕塑户外景观玻璃钢雕塑厂家联系方式玻璃钢广场不锈钢雕塑制作厂家香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化