正常情况下,react会等待set完毕后再进行页面渲染,所以在set时无法拿到更新后的dom
import { useRef, useState } from "react"export default () => {const div = useRef(null)const [count, setCount] = useState(0)const btnClick = () => {setCount(count + 1)console.log(div.current.innerHTML)}return (<><div ref={div}>count:{count}</div><button onClick={btnClick}>+1</button></>)
}
但flushSync可以强制React同步刷新提供的回调中的任何更新,有点像Vue中的$nextTick
import { useRef, useState } from "react"
import { flushSync } from "react-dom"export default () => {const div = useRef(null)const [count, setCount] = useState(0)const btnClick = () => {flushSync(() => {setCount(count + 1)})console.log(div.current.innerHTML)}return (<><div ref={div}>count:{count}</div><button onClick={btnClick}>+1</button></>)
}
但是flashSync会丧失自动批处理(多次set只会重新渲染一次),非必要情况下,不太建议使用。