正常情况下,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只会重新渲染一次),非必要情况下,不太建议使用。