gpt4 book ai didi

javascript - 如何在功能组件中混合使用 useCallback 和 useRef

转载 作者:行者123 更新时间:2023-12-05 07:11:41 30 4
gpt4 key购买 nike

我是 React 新手,正在研究无限滚动组件。多个组件将使用无限滚动并且需要一起同步(即,以编程方式滚动一个元素也会滚动其他组件)。

所以我创建了 ScrollProvider 来维护组件之间的滚动状态(即使它们被重新渲染),以及一个较低级别的钩子(Hook) useScrollSync. useScrollState 返回一个 ref 和修改滚动提供程序中的状态的 handleScroll 回调。一切正常。但是,我想单独测量一个组件的大小。 React 团队提供的示例显示了一个回调,因为它肯定会在组件安装后执行,并且元素不会为 null。问题是 div 已经有一个来自 useScrollSync Hook 的引用。

核心问题

如果除了在其上使用滚动同步之外我还想测量我的 div,我该如何为其分配回调引用和其他引用?鉴于一个元素只能有一个 div,是否有围绕此的模式?

一些(简化的)代码:

滚动提供者

const ScrollContext = React.createCreateContext();

const ScrollProvider = ({initialScrollTop, initialScrollLeft}) => {
const controlledElements = useRef(new Map());
const scrollPositions = useRef({
scrollTop: initialScrollTop,
scrollLeft: initialScrollLeft,
controllingElementKey: null
});

const register = (key, controlledElementRef) => {
controlledElements.current.set(key, controlledElementRef);
}

const handleScrollHOF = (key) => {
return () => {
scrollPositions.controllingElementKey = key;
//some scrolling logic
}
}

return {register, scrollPositions, handleScrollHOF};

}

使用滚动同步

const useScrollSync = () => { 
const scrollContext = useContext(ScrollContext);

const elementRef = useRef(null);
const keyRef = useRef({key: Symbol()}); // this probably could also be useState

useEffect(() => {
scrollContext.register(keyRef, elementRef);
}, []);

return {ref: elementRef, handleScroll: handleScrollHOF(keyRef.current)};
}

SomeComponent(第 1 轮)

const SomeComponent = () => {
// this would be within the provider tree
const {ref, handleScroll} = useScrollSync();

return (
<div onScroll={handleScroll} ref={ref}>some stuff</div>
)
}

现在的挑战是添加测量 Hook ...

使用测量值

const useMeasurements = () => {
// something like this, per the React team's Hooks FAQ
const [measurements, setMeasurements] = useState(null);

const measurementRef = useCallback((element) => {
if(element !== null) {
setMeasurements(element.getBoundingClientRect());
}
});

return {measurementRef, measurements};
}

为了将它添加到 SomeComponent...SomeComponent(第二轮)

const SomeComponent = () => {
// this would be within the provider tree
const {ref, handleScroll} = useScrollSync();
const {measurementRef, measurements} = useMeasurements();
// I cannot assign measurementRef to this same div,
// and changing useMeasurements to just measure an injected ref winds up
// with that ref being null and it never being recalculated

return (
<div onScroll={handleScroll} ref={ref}>some stuff</div>
)
}

我有点碰壁了,或者我只是太累了。关于如何超越这一点有什么想法吗?

最佳答案

我看到的主要问题是您没有在 useMeasurement 中引用可行的引用。此外,在创建 DOM 之前,useCallback 作为渲染的一部分同步执行。您需要在另一个 useEffect Hook 中引用您的元素。

关于javascript - 如何在功能组件中混合使用 useCallback 和 useRef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60679664/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com