react中useState改变值不渲染的解决方式

 更新时间:2022年12月03日 08:59:25   作者:湫ii  
这篇文章主要介绍了react中useState改变值不渲染的解决方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

react中useState改变值不渲染

React中默认浅监听,当State值为对象时,栈中存的是对象的引用(地址),setState改变的是堆中的数据

所以此时 setArr(arr) 后,栈中的地址还是原地址,React浅监听到地址没变,故会认为State并未改变,故没有重渲染页面

解决的办法

示例如下:

利用ES6的拓展符

const [arr, setArr] = useState([])
setArr([...arr])

react踩坑 useState的两次渲染

问题背景,函数组件中使用useState后,console.log发现组件重复渲染。

一开始我以为是useState的问题,经查验,发现是index.tsx里<React.StrictMode>的坑

ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById('root')
);

以下内容,摘自react官网,如果你很忙可以不看!总之,渲染两次没事,生产模式下不会这样。

StrictMode 目前有助于:

  • 识别不安全的生命周期
  • 关于使用过时字符串 ref API 的警告
  • 关于使用废弃的 findDOMNode 方法的警告

检测意外的副作用

检测过时的 context API

检测意外的副作用

从概念上讲,React 分两个阶段工作:

渲染 阶段会确定需要进行哪些更改,比如 DOM。在此阶段,React 调用 render,然后将结果与上次渲染的结果进行比较。

提交 阶段发生在当 React 应用变化时。(对于 React DOM 来说,会发生在 React 插入,更新及删除 DOM 节点的时候。)在此阶段,React 还会调用 componentDidMount 和 componentDidUpdate 之类的生命周期方法。

提交阶段通常会很快,但渲染过程可能很慢。因此,即将推出的 concurrent 模式 (默认情况下未启用) 将渲染工作分解为多个部分,对任务进行暂停和恢复操作以避免阻塞浏览器。这意味着 React 可以在提交之前多次调用渲染阶段生命周期的方法,或者在不提交的情况下调用它们(由于出现错误或更高优先级的任务使其中断)。

渲染阶段的生命周期包括以下 class 组件方法:

  • constructor
  • componentWillMount (or UNSAFE_componentWillMount)
  • componentWillReceiveProps (or UNSAFE_componentWillReceiveProps)
  • componentWillUpdate (or UNSAFE_componentWillUpdate)
  • getDerivedStateFromProps
  • shouldComponentUpdate
  • render
  • setState 更新函数(第一个参数)

因为上述方法可能会被多次调用,所以不要在它们内部编写副作用相关的代码,这点非常重要。忽略此规则可能会导致各种问题的产生,包括内存泄漏和或出现无效的应用程序状态。不幸的是,这些问题很难被发现,因为它们通常具有非确定性。

严格模式不能自动检测到你的副作用,但它可以帮助你发现它们,使它们更具确定性。

通过故意重复调用以下函数来实现的该操作:

  • 类组件的 constructor,render 以及 shouldComponentUpdate 方法
  • 类组件的生命周期方法 getDerivedStateFromProps
  • 函数组件体
  • 状态更新函数 (即 setState 的第一个参数)
  • 函数组件通过使用 useState,useMemo 或者 useReducer

注意:

这仅适用于开发模式。生产模式下生命周期不会被调用两次。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • React八大常见错误及其解决方案

    React八大常见错误及其解决方案

    这篇文章主要介绍了React八大常见错误及其解决方案,并通过代码示例介绍的非常详细,对大家学习react有一定的帮助,感兴趣的朋友可以参考下
    2024-03-03
  • 详解React路由传参方法汇总记录

    详解React路由传参方法汇总记录

    这篇文章主要介绍了详解React路由传参方法汇总记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Redux thunk中间件及执行原理详细分析

    Redux thunk中间件及执行原理详细分析

    redux的核心概念其实很简单:将需要修改的state都存入到store里,发起一个action用来描述发生了什么,用reducers描述action如何改变state tree,这篇文章主要介绍了Redux thunk中间件及执行原理分析
    2022-09-09
  • React 条件渲染最佳实践小结(7种)

    React 条件渲染最佳实践小结(7种)

    这篇文章主要介绍了React 条件渲染最佳实践小结(7种),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • React创建组件的三种方式及其区别

    React创建组件的三种方式及其区别

    本文主要介绍了React创建组件的三种方式及其区别,具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • react-router v6实现动态路由实例

    react-router v6实现动态路由实例

    这篇文章主要为大家介绍了react-router v6实现动态路由实例详解,<BR>有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 详解react-native WebView 返回处理(非回调方法可解决)

    详解react-native WebView 返回处理(非回调方法可解决)

    这篇文章主要介绍了详解react-native WebView 返回处理(非回调方法可解决),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • React和Vue组件更新的实现及区别

    React和Vue组件更新的实现及区别

    React 和 Vue 都是当今最流行的前端框架,它们都实现了组件化开发模式,本文将从React和Vue的组件更新原理入手,剖析两者虚拟DOM difer算法的异同点,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • React Fiber原理深入分析

    React Fiber原理深入分析

    Fiber可以理解为一个执行单元,每次执行完一个执行单元,React Fiber就会检查还剩多少时间,如果没有时间则将控制权让出去,然后由浏览器执行渲染操作,这篇文章主要介绍了React Fiber架构原理剖析,需要的朋友可以参考下<BR>
    2023-01-01
  • React控制元素显示隐藏的三种方法小结

    React控制元素显示隐藏的三种方法小结

    这篇文章主要介绍了React控制元素显示隐藏的三种方法小结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12

最新评论