我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么解决React中的re-render问题

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么解决React中的re-render问题

这篇文章主要介绍“怎么解决React中的re-render问题”,在日常操作中,相信很多人在怎么解决React中的re-render问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么解决React中的re-render问题”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

re-render?

首先使用我的脚手架:

npm i ykj-cli -g ykj init Appcd ./appyarn yarn dev

这样一个webpack5、TS、React项目就搭建好了

我们目前只有一个APP组件,内部代码:

import Myy from './myy.jpg';function App() {    console.log('render')    return (        <div className="app">            <h2>欢迎使用明源云 - 云空间前端通用脚手架</h2>            <img class="lazy" data-src={Myy} alt="" style={{ width: 500, height: 500 }} />            <h5>                加入我们:<a>453089136@qq.com</a>            </h5>            <h5>微前端,webpack5,TypeScript,React,vite应有尽有</h5>        </div>    );}export default App;

刷新访问页面后,发现控制台只打印了一次

怎么解决React中的re-render问题

OK,那我们正式开始,加入一些状态,以及新增一个按钮和SubApp组件

import { useState } from 'react';import Myy from './myy.jpg';import SubApp from './SubApp'function App() {    const [state, setState] = useState("Peter");    return (        <div className="app">            <h2>欢迎使用明源云 - 云空间前端通用脚手架</h2>            <img class="lazy" data-src={Myy} alt="" style={{ width: 500, height: 500 }} />            <h5>                加入我们:<a>453089136@qq.com</a>            </h5>            <SubApp state={state} />            <h5>微前端,webpack5,TypeScript,React,vite应有尽有</h5>            <button onClick={() => {                setState('关注公众号:前端巅峰')            }}>测试按钮</button>        </div>    );}export default App;//SubApp组件function SubApp({ state }) {    console.log('render')    return <h2>{state}</h2>}export default SubApp

这个时候点击按钮,又触发了一次render

多次点击,发现render只有一次,因为我们此时每次点击都是将state的值变成

那么,我们尝试着将state变成一个对象

const [state, setState] = useState({ des: "Peter" });  <button onClick={() => {                setState({ des: '关注公众号:前端巅峰' })            }}>测试按钮</button>

神奇的事情发生了,这里每次点击设置同样的state,都会触发子组件render. - 这里就出现了re-render问题,我们其实都是拿的同样的state,但是却出现了不必要的render

错误的优化

很多同学在使用React过程中会错误的使用PureComponentuseEffect以及UseMemo.

这里我们先用错误的方式引入useEffect,改造SubApp

import React, { useEffect, useState } from 'react';function SubApp({ state }) {    const [data, setData] = useState({})    useEffect(() => {        console.log('render')        setData(state)    }, [state])    console.log('render')    return <h2>{data.des}</h2>}export default SubApp

这里可以看到,每次点击按钮都在不断render,使用了useEffect竟然失效了。这优化无效~

这里就要谈到useEffect的源码实现,其实useEffectPureComponent等一系列优化手段,大都是使用了Object.is()这个算法。

MDN资料地址:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/is

Object.is

Object.is() 方法判断两个值是否为同一个值。

value1
被比较的第一个值。
value2
被比较的第二个值。
返回值
一个 Boolean 类型标示两个参数是否是同一个值。

描述

Object.is() 方法判断两个值是否为同一个值。如果满足以下条件则两个值相等:

都是 undefined
都是 null
都是 true 或 false
都是相同长度的字符串且相同字符按相同顺序排列
都是相同对象(意味着每个对象有同一个引用)
都是数字且
都是 +0
都是 -0
都是 NaN
或都是非零而且非 NaN 且为同一个值
与== (en-US) 运算不同。== 运算符在判断相等前对两边的变量(如果它们不是同一类型) 进行强制转换 (这种行为的结果会将 "" == false 判断为 true), 而 Object.is不会强制转换两边的值。

与=== (en-US) 运算也不相同。=== 运算符 (也包括 == 运算符) 将数字 -0 和 +0 视为相等 ,而将Number.NaN 与NaN视为不相等.

合理使用useEffect,解决re-render

如果Props传入的是一个对象,那么由于React hooks每次更新都会生成一个全新的对象,而这个全新的对象和之前的对象,无法通过Object.is去对比,每次都会不相等。例如:

  const obj1 = {            name: "peter"        }        const obj2 = {            name: "peter"        }        console.log(Object.is(obj1, obj2, 'xx'))

这段代码永远输出都是false,因为obj1和obj2是两个不同地址的引用对象

但是如果我们换一种方式:

Object.is(obj1.name, obj2.name )

这样就可以正常比较,永远输出ture了

那么我们现在也要在useEffect中类似这样使用

    useEffect(() => {        setData(state)        console.log('render')    }, [state.des])

这样我们的useEffect内部回调只会被触发一次

简单实现useEffect

网上抄的代码改造了比较方法:

let _deps;function useEffect(callback, dependencies) {  const hasChanged = _deps    && !dependencies.every((el, i) =>Object.is( el ,_deps[i]))    || true;  // 如果 dependencies 不存在,或者 dependencies 有变化,就执行 callback  if (!dependencies || hasChanged) {    callback();    _deps = dependencies;  }}

实现逻辑:将传入的依赖项遍历,通过Object.is方法与原依赖项的值进行浅对比,如果不一致就执行callback。

到此,关于“怎么解决React中的re-render问题”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么解决React中的re-render问题

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么解决React中的re-render问题

这篇文章主要介绍“怎么解决React中的re-render问题”,在日常操作中,相信很多人在怎么解决React中的re-render问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么解决React中的re
2023-06-29

React中useEffect使用问题怎么解决

本篇内容介绍了“React中useEffect使用问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言最近看了一下 ant-des
2023-07-02

react跨域问题怎么解决

在 React 中解决跨域问题通常有以下几种方法:1. 设置代理:在开发环境中,可以通过设置代理服务器来解决跨域问题。可以在 `package.json` 文件中的 `proxy` 字段中添加代理服务器的地址,例如:```"proxy":
2023-08-19

react usestate异步问题怎么解决

在React中,useState钩子是同步的,它不会自动处理异步操作。因此,当遇到需要在useState之后执行异步操作的情况时,可以采用以下方法解决:1. 使用useEffect钩子:可以在useEffect中执行异步操作,并在异步操作完
2023-10-07

React中的权限组件设计问题怎么解决

这篇“React中的权限组件设计问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“React中的权限组件设计问题怎么
2023-07-02

react异步渲染问题怎么解决

在React中,可以使用异步渲染来优化性能并提升用户体验。有几种方式可以解决React异步渲染问题:1. 使用React.lazy和Suspense:React.lazy函数可以让你像渲染常规组件一样渲染动态导入的组件。Suspense组件
2023-08-19

React和Vue项目问题怎么解决

本篇内容主要讲解“React和Vue项目问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React和Vue项目问题怎么解决”吧!组件库的样式覆盖不掉,这应该是很多前端在工作中遇到过的问
2023-06-30

React操作DOM之forwardRef问题怎么解决

本篇内容主要讲解“React操作DOM之forwardRef问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React操作DOM之forwardRef问题怎么解决”吧!React操作D
2023-07-05

React竞态条件Race Condition问题怎么解决

本篇内容主要讲解“React竞态条件Race Condition问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React竞态条件Race Condition问题怎么解决”吧!竞态条件
2023-07-04

React新文档滥用effect问题怎么解决

这篇文章主要介绍了React新文档滥用effect问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇React新文档滥用effect问题怎么解决文章都会有所收获,下面我们一起来看看吧。引言你或你的同事在
2023-07-02

React竞态条件Race Condition问题怎么解决

React中的竞态条件(Race Condition)问题通常发生在异步操作中,当多个异步操作同时修改同一个状态时可能会导致不确定的结果。为了解决这个问题,可以采取以下几种方法:1. 使用回调函数:可以在每个异步操作完成后调用回调函数,确保
2023-08-15

解决react-connect中使用forwardRef遇到的问题

这篇文章主要介绍了解决react-connect中使用forwardRef遇到的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-20

在React中使用Redux解决的问题小结

在React中组件通信的数据流是单向的,顶层组件可以通过props属性向下层组件传递数据,而下层组件不能直接向上层组件传递数据,这篇文章主要介绍了使用react+redux实现弹出框案例,需要的朋友可以参考下
2022-11-13

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录