gpt4 book ai didi

reactjs - React hooks,每个 child 一个

转载 作者:行者123 更新时间:2023-12-03 13:46:54 25 4
gpt4 key购买 nike

我正在使用useDimensions钩子(Hook)来测量我的子组件并更新父组件(尽管任何类似的测量钩子(Hook)也会发生此问题)。因此,我想为我拥有的每个子组件使用 useDimensions 。但是,这是一个通用父组件,可以接受任意数量的子组件,因此我必须循环子组件并为每个组件添加一个钩子(Hook)。

目前看起来有点像这样:

import React from "react";
import useDimensions from "react-use-dimensions";

function Parent(props){
const measurements = props.children.map(child => useDimensions());
return props.children.map(
(child, i) => React.cloneElement(child, {ref: measurements[i][0]})
);
}

但是,这打破了first rule of hooks :不要在循环、条件或嵌套函数内调用 Hook。

在不违反 React hooks 规则的情况下,执行此操作的最佳实践方法是什么?

最佳答案

钩子(Hook)规则的原因在Why Do React Hooks Rely on Call Order中有很好的解释。 .

如果需要总尺寸,则很容易,无需单独测量每个 child :

function Parent({children}) {
const [ref] = useDimensions()
return (
<div ref={ref}>
{children}
</div>
)
}

对于更复杂的场景,将 React 代码构建为多个组件是一种有效的方法,既不“浪费时间”,也不“添加大量抽象”,例如:

function Parent({children}) {
const measurements = useRef(Array(children.length))

const createSetRef = (i) => (ref) => {
measurements[i] = ref
}

return children.map(
(child, i) => <Child setRef={createSetRef(i)}>{child}</Child>
)
}

function Child({children, setRef}) {
const [ref] = useDimensions()

useEffect(() => setRef(ref), [])

if (React.isValidElement(children)) {
return React.cloneElement(children, {ref})
} else {
console.log("TODO:", children)
return children
}
}

关于reactjs - React hooks,每个 child 一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57238489/

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