【发布时间】:2021-10-11 17:10:18
【问题描述】:
我正在使用ResizeObserver 在调整屏幕大小时调用函数,但我需要在观察者中获取状态的更新值,以便在调用函数之前确定一些条件。
是这样的:
let [test, setTest] = React.useState(true)
const callFunction = () => {
console.log('function invoked')
setTest(false) // => set 'test' to 'false', so 'callFunction' can't be invoked again by the observer
}
const observer = React.useRef(
new ResizeObserver(entries => {
console.log(test) // => It always has the initial value (true), so the function is always invoked
if (test === true) {
callFunction()
}
})
)
React.useEffect(() => {
const body = document.getElementsByTagName('BODY')[0]
observer.current.observe(body)
return () => observer.unobserve(body)
}, [])
不要担心细节或为什么要这样做,因为我的应用程序比这个示例复杂得多。
我只需要知道是否有办法在观察者中获取更新的值。我已经花了相当长的时间试图弄清楚这一点,但我还做不到。
有什么想法吗?
【问题讨论】:
-
你总是得到 true 的原因是每次调整窗口大小时,react re 渲染组件,所以状态再次设置为 true。您可以在组件外部定义一个变量并将其设置在 callFunction 中。更好的方法是将状态作为道具传递给组件并在那里读取。您也可以将 setState 与状态本身一起传递。但是这样你可以在全局级别定义状态,这样状态就不会在每次组件重新渲染时重新初始化。
-
@Ako 谢谢你的评论,我做了外部变量的事情,我可以解决这个问题。如果您想将其编辑为答案,我会接受。我已经考虑过道具,但在这种情况下,这不是一个选择。
-
@Ako
The reason you always get true is every time window is resized, react re renders the component...:我想到了,但重点是,这不是国家的目的,“生存”重新渲染吗?让我感到困惑的是,状态的新值将在代码的任何其他部分中读取,因为它应该是,即使在重新呈现页面之后,只有在观察者内部才会保留初始值。我在这里做错了什么? -
其实我评论错了,我会贴出正确答案。
标签: javascript reactjs api observer-pattern