reactjs - 等待 DOM 上的 useCallback 效果

标签 reactjs react-hooks

我正在从 useEffect 调用 useCallback,这将使组件的高度发生变化。然后,为了结束效果,我想将组件滚动到特定点。问题是滚动操作不起作用,因为它很快就会触发:DOM 尚未更新。

如果我将它包装在 setTimeout 中,它确实可以工作(因为一旦 DOM 更新它就会触发),但它有点 hacky。

有没有一种干净的方法可以等待 DOM 渲染后再追求效果?

不起作用:

const viewportElement = useRef()
cont [innerHeight, setInnerHeight] = useState(0)

refreshDOM = useCallback(() => {
  setInnerHeight(500) // Will cause the DOM to refresh and the inner div to grow in height.
}, [setInnerHeight])

useLayoutEffect(() => {
  refreshDOM() // DOM updates
  viewportElement.current.scroll(0, 200) // Fires to soon: innerDiv is still too small 
}, [refreshDOM, someOtherStuffTriggeringTheEffect])

return (
  <div ref={viewportElement} style={{height: 100}}>
    <div style={{height: innerHeight}}></div>
  </div>
)

作品:


// ...

useLayoutEffect(() => {
  refreshDOM() // DOM updates
  setTimeout(
    () => viewportElement.current && viewportElement.current.scroll(0, 200),
    0,
  ) // DOM was refreshed, scroll operation works
}, [refreshDOM, someOtherStuffTriggeringTheEffect])

// ...

最佳答案

一个可能的解决方案是添加另一个 useEffect 并传递给依赖项 innerHeight。当 innerHeight 更新时,这意味着您可以调用滚动:

useEffect(() => {
  viewportElement.current.scroll(0, 200)
}, [innerHeight]);

并且不要忘记从 useLayoutEffect 中删除滚动

关于reactjs - 等待 DOM 上的 useCallback 效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64926612/

相关文章:

javascript - 将状态从一个 React 组件传递到另一个

unit-testing - 自动 "test"故事书

javascript - 尝试使用 gh-pages 部署我的 React 应用程序但收到此错误消息 : The "file" argument must be of type string. Received type undefined

reactjs - 检测子引用何时发生变化

reactjs - 模块 '@hookform/resolvers' 没有导出成员 'yupResolver'

javascript - 无法在物理 iOS 设备 (9.3) 上启动 react-native

reactjs - 与WebSocket react useState导致数组无法正确更新

javascript - NextJS 动态列表在删除/更新时不更新

reactjs - 我可以使用箭头函数代替 React Hooks 的普通函数吗?

reactjs - 当数据加载到 useState 中时,我的组件在页面加载后动画