React-引领未来的用户界面开发框架-读书笔记(五)

第11章 性能优化

Reactde Dom diff算法使我们能够在任意时间点高效地重新绘制整个用户界面,并保证最小程度的DOM改变,然而,也存在需要对组件进行细致优化的情况,这时就需要渲染一个新的DOM来让应用运行得更加高效。

shouldComponentUpdate

当一个组件更新时,无论是设置了新的props还是调用了setState方法,或者forceUpdate方法,React都会调用该组件所有的子组件的render方法。在大多数时候这样的操作都没有问题,但是在组件树深度嵌套或是render方法十分复杂的页面上,这可能会带来些许延迟。

有时候组件的render方法会在不必要的情况下被调用。比如:组件渲染的过程中,并没有使用props或者state的值,或者组件的props或者state并没有在父组件重新渲染时发生改变。这意味着重新渲染这个组件会得到和已知虚拟DOM一模一样的结果,这样的计算过程是没有必要的。

React提供了一个组件的生命周期方法shouldComponentUpdate,我们可以使用它来帮助React正确判断是否需要调用组件的render方法。

shouldComponentUpdate方法返回一个布尔值。如果返回false就是告诉React不要调用组件的渲染方法,并使用之前渲染好的虚拟DOM;如果返回true则是让React调用组件的渲染方法并计算出新的虚拟DOM。在默认情况下,shouldComponentUpadte方法永远都会返回true,因此组件总是会调用render方法。

组件首次被渲染时,shouldComponentUpdate方法并不会被调用,shouldComponentUpdate方法接受两个参数,即新的props和新的state,以帮助你决定是否应该重新渲染。

不可变性辅助插件

在需要比较对象以确定是否更新时,使用不可变得数据结构让你的shouldComponentUpdate方法变得更加简单。我们可以使用React.addons.update来确保<SurverEditor />组件得不可变性。

React.addons.update接受一个数据结构和一个配置对象。你可以在配置对象中传入$slice、$push、$unshift、$set和$apply

深入调查拖慢你应用的部分

正如我们在前几小节中提到的那样,给组件添加一个自定义的shouldComponentUpdate方法能够在很大程度上优化程序。

React.addons.Perf插件能够帮助我们找到添加shouldComponentUpdate方法的最佳位置。

键(Key)

多数时候,你会看到列表中使用key属性的情况,它的作用是给React提供一种除组件类之外的识别一个组件的方法。举个例子:假设有一个div组件,它的key属性是foo,后续又将它改成了bar,那么React就会跳过DOM diff,同时完全放弃div所有的子元素,并重新从头开始渲染。

在渲染大型子树以避免diff计算时,这样的设计很有用——因为这种计算就是在浪费时间。除了告诉React什么时候抛弃一个节点之外,很多情况下key还可以在元素顺序改变时候使用,举个例子:

var items=sortBy(this.state.sortingAlgorithm,this.props,items);
return items.map(funciton (item){return <img src={item.src}/};
});

如果顺序发生改变,React会对元素进行diff操作,并确定出最高效的操作是改变其中几个img元素的src属性。这样的结论其实是非常低效的,同时可能会导致浏览器查询缓存,甚至导致新的网络请求。

要解决这个问题,我们可以给每个img元素简单的添加一些独一无二的字符串或者数字。 return <img src={item.src} key={item.id}/>;

这样React得出的结论就不是改变src属性,而是使用insertBefore操作,而这个操作是移动DOM节点最高效的方法。

除了改变顺序外,这个操作同样适用于插入操作(不包括向末尾元素后面插入)。如果没有正确的key属性,在数组开头插入一个项目会导致后续的<img>标签的src属性发生改变。

值得注意的一点是,尽管key看似被作为一个属性传入了,但其实在组件的任何位置都无法实际获取到它。

总结

  1. 将shouldComponentUpdate返回值改为true或者false以提升性能。
  2. 使用React.addons.Perf来诊断缓慢或不必要的渲染。
  3. 使用key来帮助,React识别列表中所有子组件的最小变化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286762.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oneproxy检测主从复制同步延迟

Q:为什么要实现读写分离延迟检测&#xff1f; A:就好比你在ATM机存钱&#xff0c;你老婆收到短信后乐呵呵的拿网银APP查看&#xff0c;结果钱没过来。其实钱已经到账了&#xff0c;只是查询的ATM机节点钱还没过来。所以我们dba要监控数据&#xff0c;一旦发现钱没有复制到另一A…

.NET 分表分库动态化处理

介绍本期主角:ShardingCore 一款ef-core下高性能、轻量级针对分表分库读写分离的解决方案&#xff0c;具有零依赖、零学习成本、零业务代码入侵我不是efcore怎么办这边肯定有小伙伴要问有没有不是efcore的,我这边很确信的和你讲有并且适应所有的ADO.NET包括sqlhelperShardingCo…

addEventListener 的事件函数的传递【转载】

addEventListener 参数如下&#xff1a; addEventListener(type, listener[, useCapture]); type&#xff0c;事件名称listener&#xff0c;事件处理器useCapture&#xff0c;是否捕获一直把 listener 记成是响应函数&#xff0c;function 类型。相信很多人也是这么理解的。多数…

Android之elevation实现阴影效果

1 需求 需要控件实现阴影效果 2 实现 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"andr…

十、小程序实战 (IVX 快速开发教程)

十、小程序实战 使用小程序完成一个二手信息站点与 WebApp 实现流程类型&#xff0c;只是部分内容使用了微信小程序特有的组件&#xff0c;例如微信登录与 WebApp 略有差别&#xff0c;其它逻辑实现较为类似。我们先制作页面&#xff0c;之后再实现功能。 由于之前已经完成了…

【VB测绘程序设计】第一章 VB测绘程序设计概述

目 录 第一节 测绘程序设计的意义 第二节 程序设计语言的发展 第三节 测绘程序设计语言的选择

类属性和实例属性冲突

类属性和实例属性名字冲突怎么办 修改类属性会导致所有实例访问到的类属性全部都受影响&#xff0c;但是&#xff0c;如果在实例变量上修改类属性会发生什么问题呢&#xff1f;class Person(object):address Earthdef __init__(self, name):self.name namep1 Person(Bob) p2…

源代码下载 第六章 注解式控制器详解

2019独角兽企业重金招聘Python工程师标准>>> 源代码请到附件中下载。 其他下载&#xff1a; 跟着开涛学SpringMVC 第一章源代码下载 第二章 Spring MVC入门 源代码下载 Controller接口控制器详解 源代码下载 源码下载——第四章 Controller接口控制器详解——跟着开…

Android6.0到底有什么不一样

在android 6.0&#xff08;API 23&#xff09;中&#xff0c;Google已经移除了移除了Apache HttpClient相关的类 http://developer.android.com/intl/zh-cn/about/versions/marshmallow/android-6.0-changes.html 本文转自屠夫章哥 51CTO博客&#xff0c;原文链接&#xff1a;…

WPF|快速添加新手引导功能(支持MVVM)

阅读导航前言案例一案例二案例三&#xff08;本文介绍的方式&#xff09;如何使用&#xff1f;控件如何开发的&#xff1f;总结1. 前言案例一站长分享过 眾尋 大佬的一篇 WPF 简易新手引导 一文&#xff0c;新手引导的效果挺不错的&#xff0c;如下图&#xff1a;该文给出的代码…

三、界面介绍(IVX快速手册)

三、集成开发环境界面介绍 通过本节你将了解 iVX 在线集成开发环境 界面&#xff0c;快速建立对 在线集成开发环境 的认识。 文章目录三、集成开发环境界面介绍3.1 界面区域3.2 舞台3.3 组件工具栏3.4 对象树/素材面板3.5 属性面板3.6 菜单面板3.7 逻辑工具面板3.8 辅助工具3.…

Android studio之提示Failed to resolve: com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.46

1、错误提示如下 Failed to resolve: com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.46 Show in Project Structure dialog Affected Modules: app2、解决办法 在project的build.gradle里面加入 maven { url https://jitpack.io }

【VB测绘程序设计】第二章 VB测绘程序基础

第一节 数据类型 VB中提供了以下11中基本的数据类型: 一、数值型 二、字符串 三、日期型 1.界面设计 2. 代码 <

React-引领未来的用户界面开发框架-读书笔记(六)

第12章 服务端渲染 想让搜索引擎抓取到你的站点&#xff0c;服务端渲染这一步不可或缺&#xff0c;服务端渲染还可以提升站点的性能&#xff0c;因为在加载JavaScript脚本的同时&#xff0c;浏览器就可以进行页面渲染。 React的虚拟DOM是其可被用于服务端渲染的关键。首先每个R…

TrimPath - Js模板引擎

当页面中引用template.js文件之后&#xff0c;脚本将创建一个TrimPath对象供你使用。 parseDOMTemplate(elementId,optionalDocument)  //获得模板字符串代码 得到页面中Id为elementId的DOM组件的InnerHTML&#xff0c;将其解析成一个模板&#xff0c;这个返回一个templateOb…

appserv安装

Appserv 官网: http://www.appservnetwork.com/ 安装好后&#xff0c;输入http://localhost:8082/验证是否装成功&#xff0c;成功后如下图 http://localhost:8082/ 默认指定的文件夹是 进入到phpMyAdmin 的账号是root&#xff0c;密码是安装时的密码

一、iVX简介(IVX 快速开发教程)

一、iVX简介 通过本节你将对 iVX 有一个大致的认识&#xff0c;并且了解 iVX 能够做些什么&#xff0c;有哪一些优势&#xff0c;这将帮助你更好的上手 iVX 进行应用的开发&#xff0c;初步了解 iVX 的强大之处。 文章目录一、iVX简介1.1 iVX 是什么&#xff1f;1.2 iVX适合怎…

WPF效果第一百八十六篇之又玩ListBox

大周末的接着上一篇玩耍TreeView,这二天又再次去玩耍ListBox;毕竟是我的最爱,没办法就喜欢玩耍他;闲话也不多扯了,直接看咱们最终效果:2、原来一直ItemTemplate,这次直接ListBoxItem的Template:<Setter Property"Template"><Setter.Value><ControlTem…

Android之URL “page={page}category_id={***} string For dynamic query parameters use @Query.

1、问题 我们用retrofit进行Get网络请求的时候&#xff0c;我代码是这样写的 GET("/api/get_****/***?page{page}&category_id{category_id}")suspend fun getWebsiteCategory(Path("page") page: Int, Path("category_id") category_id: …

【VB测绘程序设计】第三章 VB结构化程序设计(顺序、选择、循环)

目 录 第一节 顺序结构设计 第二节 选择结构设计 第三节 循环结构设计 第一节 顺序结构设计 一、赋值语句