react中useStart数据更新不渲染问题

443 阅读2分钟

react中useStart数据更新不渲染问题

1 值为对象时

解决的办法:

import { useState } from 'react'
import './App.css'

function App() {
    const [arr, setArr] = useState({data:"data"})
    const add = () => {
      setArr({...arr,data:"updata"})
    }
    return (
    <div className="App">
        {arr.data}
        <br/>
    <button onClick={add}>add</button>
    </div>
  )
}

export default App

React中默认浅监听,当State值为对象时,栈中存的是对象的引用(地址),setState改变的是堆中的数据 所以此时 setArr(arr) 后,栈中的地址还是原地址,React浅监听到地址没变,故会认为State并未改变,故没有重渲染页面解析为一个新的内存地址,然后渲染页面

es6对象结构参考blog.csdn.net/XYXYYDD/art…

2值为number时

原代码

import { useState } from 'react'
import './App.css'

function App() {
    console.log("组件渲染")
    let [data, setData] = useState(0)
    const add = () => {
        console.log("函数执行 set前 当前data值==>" + data)
        setData(data++)
        console.log("函数执行 set后 当前data值==>" + data)
    }
    return (
    <div className="App">
        {data}
        <br/>
    <button onClick={add}>add</button>
    </div>
  )
}

export default App

模拟点击5次

1664040818613.png

解决的办法:

import { useState } from 'react'
import './App.css'

function App() {
    console.log("组件渲染")
    let [data, setData] = useState(0)
    const add = () => {
        console.log("函数执行 set前 当前data值==>" + data)
        setData(()=>data+1)
        console.log("函数执行 set后 当前data值==>" + data)
    }
    return (
    <div className="App">
        {data}
        <br/>
    <button onClick={add}>add</button>
    </div>
  )
}

export default App

1 ++ 问题

将data++ ==> 更改为 data+1 或++data 也可以

a++称为“后增量”,++a称为“前增量”。

1let a = 1;
const b = a++;  // b = 1

2let a = 1
const b = ++a;  // b = 2

函数组件的state是重新执行当前函数,而data++ 拿到的值是原来的而不会渲染页面

2 函数问题

将 setData(data+1) 改为 setData(()=>data+1)

原理:

setState返回的函数执行会导致re-render; 框架内部会对多次函数操作进行合并,保证useState拿到最新的状态,避免重复渲染。

如果初始state需要通过复杂计算获得,可以传入一个函数,在函数中计算并返回初始state,此函数只在初始渲染时被调用

*简单理解:*setData(()=>data+1)内部函数执行后会直接将返回值给data

useState源码参考blog.csdn.net/qq_30997503…