React之PureComponent的介绍

这篇文章主要介绍了关于react之purecomponent的介绍,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

React避免重复渲染

React在渲染出的UI内部建立和维护了一个内层的实现方式,它包括了从组件返回的React元素。这种实现方式使得React避免了一些不必要的创建和关联DOM节点,因为这样做可能比直接操作JavaScript对象更慢一些,它被称之为“虚拟DOM”。

当一个组件的props或者state改变时,React通过比较新返回的元素和之前渲染的元素来决定是否有必要更新实际的DOM。当他们不相等时,React会更新DOM。

在一些情况下,你的组件可以通过重写这个生命周期函数shouldComponentUpdate来提升速度, 它是在重新渲染过程开始前触发的。 这个函数默认返回true,可使React执行更新:

shouldComponentUpdate(nextProps, nextState) {  return true;}

登录后复制

举例

如果想让组件只在props.color或者state.count的值变化时重新渲染,你可以像下面这样设定shouldComponentUpdate:

class CounterButton extends React.Component {  constructor(props) {    super(props);    this.state = {count: 1};  }  shouldComponentUpdate(nextProps, nextState) {    if (this.props.color !== nextProps.color) {      return true;    }    if (this.state.count !== nextState.count) {      return true;    }    return false;  }  render() {    return (          );  }}

登录后复制

在以上代码中,shouldComponentUpdate只检查props.color和state.count的变化。如果这些值没有变化,组件就不会更新。当你的组件变得更加复杂时,你可以使用类似的模式来做一个“浅比较”,用来比较属性和值以判定是否需要更新组件。这种模式十分常见,因此React提供了一个辅助对象来实现这个逻辑 – 继承自React.PureComponent。以下代码可以更简单的实现相同的操作:

class CounterButton extends React.PureComponent {  constructor(props) {    super(props);    this.state = {count: 1};  }  render() {    return (          );  }}

登录后复制

PureComponent

原理

当组件更新时,如果组件的 props 和 state 都没发生改变, render 方法就不会触发,省去 Virtual DOM 的生成和比对过程,达到提升性能的目的。具体就是 React 自动帮我们做了一层浅比较:

if (this._compositeType === CompositeTypes.PureClass) {    shouldUpdate = !shallowEqual(prevProps, nextProps) || !shallowEqual(inst.state, nextState);}

登录后复制

而 shallowEqual 又做了什么呢?会比较 Object.keys(state | props) 的长度是否一致,每一个 key 是否两者都有,并且是否是一个引用,也就是只比较了第一层的值,确实很浅,所以深层的嵌套数据是对比不出来的。

问题

大部分情况下,你可以使用React.PureComponent而不必写你自己的shouldComponentUpdate,它只做一个浅比较。但是由于浅比较会忽略属性或状态突变的情况,此时你不能使用它。

class ListOfWords extends React.PureComponent {  render() {    return 

{this.props.words.join(',')}

; }}class WordAdder extends React.Component { constructor(props) { super(props); this.state = { words: ['marklar'] }; this.handleClick = this.handleClick.bind(this); } handleClick() { // This section is bad style and causes a bug const words = this.state.words; words.push('marklar'); this.setState({words: words}); } render() { return (

登录后复制

在ListOfWords中,this.props.words是WordAdder中传入的其state的一个引用。虽然在WordAdder的handelClick方法中被改变了,但是对于ListOfWords来说,其引用是不变的,从而导致并没有被更新。

解决方法

在上面的问题中可以发现,当一个数据是不变数据时,可以使用一个引用。但是对于一个易变数据来说,不能使用引用的方式给到PureComponent。简单来说,就是我们在PureComponent外层来修改其使用的数据时,应该给其赋值一个新的对象或者引用,从而才能确保其能够进行重新渲染。例如上面例子中的handleClick可以通过以下几种来进行修改从而确认正确的渲染:

handleClick() {  this.setState(prevState => ({    words: prevState.words.concat(['marklar'])  }));}或者handleClick() {  this.setState(prevState => ({    words: [...prevState.words, 'marklar'],  }));};或者针对对象结构:function updateColorMap(oldObj) {  return Object.assign({}, oldObj, {key: new value});}

登录后复制

immutable.js

Immutable.js是解决这个问题的另一种方法。它通过结构共享提供不可突变的,持久的集合:

不可突变:一旦创建,集合就不能在另一个时间点改变。

持久性:可以使用原始集合和一个突变来创建新的集合。原始集合在新集合创建后仍然可用。

结构共享:新集合尽可能多的使用原始集合的结构来创建,以便将复制操作降至最少从而提升性能。

// 常见的js处理const x = { foo: 'bar' };const y = x;y.foo = 'baz';x === y; // true// 使用 immutable.jsconst SomeRecord = Immutable.Record({ foo: null });const x = new SomeRecord({ foo: 'bar' });const y = x.set('foo', 'baz');x === y; // false

登录后复制

总结

PureComponent 真正起作用的,只是在一些纯展示组件上,复杂组件使用的话shallowEqual 那一关基本就过不了。另外在使用的过程中为了确保能够正确的渲染,记得 props 和 state 不能使用同一个引用哦。

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

AngularJs与Angular 常用的指令写法的区别

以上就是React之PureComponent的介绍的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2746606.html

(0)
上一篇 2025年3月8日 04:10:27
下一篇 2025年2月18日 04:02:45

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 关于react父子组件之间的传值问题解析

    这篇文章主要介绍了关于react父子组件之间的传值问题解析,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 父组件传递给子组件:核心思路就是将父组件中的state传递给子组件 父组件代码:class Father extend…

    编程技术 2025年3月8日
    200
  • 如何利用js fetch实现ping效果

    这篇文章主要介绍了关于如何利用js fetch实现ping效果,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 实际业务终于到的,在部分环境中可能存在网络不稳定的因素,wms手持有时候联网了但实际访问不到网页,很是尴尬网上找到…

    2025年3月8日
    200
  • 对于 React 组件和state|props的解析

    阅读源码一个痛处是会陷进理不顺主干的困局中,本系列文章在实现一个 (x)react 的同时理顺 react 框架的主干内容(jsx/虚拟dom/组件/…) 组件即函数 在上一篇 JSX 和 Virtual DOM 中,解释了 J…

    2025年3月8日
    200
  • react-router路由的简单分析

    这篇文章主要介绍了关于react-router路由的简单分析,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 我们要的是一个简单的react-router路由 我们要的是一个简单的react-router路由 习惯了 vue-…

    编程技术 2025年3月8日
    200
  • React+mongodb的使用与配置

    这篇文章主要介绍了关于react+mongodb的使用与配置,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 React环境搭建 (一步一步走) React 基本配置 (React 是一个用于构建用户界面的 JAVASCRIP…

    2025年3月8日 编程技术
    200
  • React实现的抛物线动画

    这篇文章主要介绍了关于react实现的抛物线动画,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 一个简单通用的 React 抛物线动画 Usage import { parabola } from “./parabola”.…

    2025年3月8日
    200
  • React的使用:react框架的五大特点

    这篇文章给大家介绍的内容是关于react的使用:react框架的五大特点,有着一定的参考价值,有需要的朋友可以参考一下。 01. React 出现的时代背景 世界上的事情都有因才有果,一个框架的出现也必然离不开特定的时代背景。而对于 Rea…

    编程技术 2025年3月8日
    200
  • react的使用: React如何渲染UI

    这篇文章给大家介绍的内容是关于react的使用: react如何渲染ui,有着一定的参考价值,有需要的朋友可以参考一下。 01. React 渲染界面的方式 在 React 等大型前端框架出现之前,我们渲染 UI 元素的方式是使用字符串模板…

    编程技术 2025年3月8日
    200
  • React的使用:React组件内部的状态管理

    这篇文章给大家介绍的内容是关于React的使用:React组件内部的状态管理,有着一定的参考价值,有需要的朋友可以参考一下。 在本文中,我们将把目光聚焦于 React 组件内部的状态管理,去认识或重新思考以下三个核心概念: props 和 …

    编程技术 2025年3月8日
    200
  • React中动画不生效的原因分析

    这篇文章给大家介绍的内容是关于react中动画不生效的原因分析,有着一定的参考价值,有需要的朋友可以参考一下。 项目中需要做这样的一个组件根据不同的数值,这个蓝色的条显示的宽度不同。这个其实很简单,我只要根据数据动态的计算它的宽度,生成节点…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论