返回顶部
首页 > 资讯 > 前端开发 > JavaScript >解决React中的re-render问题
  • 125
分享到

解决React中的re-render问题

2024-04-02 19:04:59 125人浏览 薄情痞子
摘要

目录re-render?错误的优化Object.is合理使用useEffect,解决re-render简单实现useEffect文章转自公众号:前端巅峰 re-render? 首先使

文章转自公众号:前端巅峰

re-render?

首先使用我的脚手架:

npm i ykj-cli -g 
ykj init App
cd ./app
yarn 
yarn dev

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

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

import Myy from './myy.jpg';

function App() {
    console.log('render')
    return (
        <div className="app">
            <h1>欢迎使用明源云 - 云空间前端通用脚手架</h1>
            <img src={Myy} alt="" style={{ width: 500, height: 500 }} />
            <h4>
                加入我们:<a>453089136@qq.com</a>
            </h4>
            <h4>微前端,WEBpack5,typescript,React,vite应有尽有</h4>
        </div>
    );
}

export default App;

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

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">
            <h1>欢迎使用明源云 - 云空间前端通用脚手架</h1>
            <img src={Myy} alt="" style={{ width: 500, height: 500 }} />
            <h4>
                加入我们:<a>453089136@qq.com</a>
            </h4>
            <SubApp state={state} />
            <h4>微前端,webpack5,TypeScript,React,vite应有尽有</h4>
            <button onClick={() => {
                setState('关注公众号:前端巅峰')
            }}>测试按钮</button>
        </div>
    );
}

export default App;


//SubApp组件
function SubApp({ state }) {
    console.log('render')
    return <h1>{state}</h1>
}

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 <h1>{data.des}</h1>
}

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。

结语:
所以大家在解决re-render问题时,或者使用useEffect之类优化方案时,应该监听对比某个值,而不是去监听某个大对象进行对比。相信这篇文章能解决你心中疑惑很久的re-render问题,

到此这篇关于解决React中的re-render问题的文章就介绍到这了,更多相关React中的re-render问题内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 解决React中的re-render问题

本文链接: https://lsjlt.com/news/161818.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 解决React中的re-render问题
    目录re-render?错误的优化Object.is合理使用useEffect,解决re-render简单实现useEffect文章转自公众号:前端巅峰 re-render? 首先使...
    99+
    2024-04-02
  • 怎么解决React中的re-render问题
    这篇文章主要介绍“怎么解决React中的re-render问题”,在日常操作中,相信很多人在怎么解决React中的re-render问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么解决React中的re...
    99+
    2023-06-29
  • React#31的render怎么解决
    这篇文章将为大家详细讲解有关React#31的render怎么解决,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。卡颂日常从事基础架构相关工作。这次接到一个任...
    99+
    2024-04-02
  • react中hooks解决的问题有哪些
    这篇文章主要介绍“react中hooks解决的问题有哪些”,在日常操作中,相信很多人在react中hooks解决的问题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”re...
    99+
    2024-04-02
  • React中useEffect使用问题怎么解决
    本篇内容介绍了“React中useEffect使用问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言最近看了一下 ant-des...
    99+
    2023-07-02
  • 解决react-connect中使用forwardRef遇到的问题
    目录react-connect使用forwardRef遇到的问题项目场景原因问题描述解决方案React.forwardRef的使用说明应用场景但问题来了总结react-connect...
    99+
    2023-05-20
    react-connect使用forwardRef 使用forwardRef遇到问题 react-connect使用forwardRef问题
  • react组件中过渡动画的问题解决
    目录一、是什么二、如何实现CSSTransitionSwitchTransitionTransitionGroup一、是什么 在日常开发中,页面切换时的转场动画是比较基础的一个场景 ...
    99+
    2024-04-02
  • 在React中使用Redux解决的问题小结
    目录在 React 中使用 Redux 解决的问题在 React 项目中加入 Redux 的好处React + Redux 安装 ReduxReact 中 Redux 的工作流程Re...
    99+
    2022-11-13
    React + Redux 案例 React 使用 Redux
  • react跨域问题怎么解决
    在 React 中解决跨域问题通常有以下几种方法:1. 设置代理:在开发环境中,可以通过设置代理服务器来解决跨域问题。可以在 `pa...
    99+
    2023-08-19
    react
  • 如何解决React中组件通信问题
    这篇文章将为大家详细讲解有关如何解决React中组件通信问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。父子组件父 → 子parent组件传给child组件,符合rea...
    99+
    2024-04-02
  • 解决react中label标签for报错问题
    要求:点击账号或密码,自动将焦点转到相关的表单控件(input)上。 问题:功能可以使用,但是会有报错。 解决办法:react中label标签没有for属性,用htmlFor代替fo...
    99+
    2024-04-02
  • React项目中className运用及问题解决
    目录抛出问题解决问题组件化思想className运用总结问题抛出问题 className 大家都用过吧,用它在 react 项目中设置样式。它的用法很简单,除了可以设置一个样式外,r...
    99+
    2022-12-15
    React项目className运用 React className
  • 如何解决React项目中碰到的IE问题
    这篇文章将为大家详细讲解有关如何解决React项目中碰到的IE问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。最近接手一个React项目,在IE下碰到了俩问题IE11报...
    99+
    2024-04-02
  • 解决react中useState状态异步更新的问题
    目录疑惑状态异步更新带来的问题问题示例问题解决类组件的解决方案函数组件的解决方案其他解决方案结尾疑惑 相信刚开始使用react函数组件的小伙伴也遇到过一个坑,就是 useState ...
    99+
    2024-04-02
  • React中关于render()的用法及说明
    目录React中的render()1、render()2、当 render 被调用时3、render() 函数应该为纯函数4、如需与浏览器进行交互5、在React.Component...
    99+
    2023-02-12
    React render() render()的用法 render()说明
  • React样式冲突解决问题如何解决
    本篇内容主要讲解“React样式冲突解决问题如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React样式冲突解决问题如何解决”吧!前言:React最终编译打包后都在一个html页面中,如...
    99+
    2023-07-05
  • react usestate异步问题怎么解决
    在React中,useState钩子是同步的,它不会自动处理异步操作。因此,当遇到需要在useState之后执行异步操作的情况时,可...
    99+
    2023-10-07
    react
  • React hooks useState异步问题及解决
    目录React Hooks useState异步问题原因解决方法React中useState异步更新小坑问题点React Hooks useState异步问题 最近在开发中遇到一个问...
    99+
    2022-11-13
    React hooks useState useState异步问题 React hooks useState异步
  • React中的权限组件设计问题怎么解决
    这篇“React中的权限组件设计问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“React中的权限组件设计问题怎么...
    99+
    2023-07-02
  • React样式冲突解决问题的方法
    目录前言:CSS IN JS一、概念二、CSS Modules三、在项目中使用css Modules四、css module配合sass五、module.scss 使用步骤:六、总结...
    99+
    2023-03-10
    React样式冲突 React样式
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作