【发布时间】:2021-03-28 16:46:29
【问题描述】:
使用 React,我有一个以这种方式静态声明的 ref 列表:
let line1 = useRef(null);
let line2 = useRef(null);
let line3 = useRef(null);
...
//IN MY RENDER PART
<li ref={(el) => (line1 = el)}>line1</li>
<li ref={(el) => (line2 = el)}>line1</li>
<li ref={(el) => (line3 = el)}>line1</li>
然后将 refs 传递给动画函数,一切正常; 现在事情发生了一些变化,我使用地图创建了列表项,我不再能够正确地引用元素; 我试过类似的东西:
{menu.menu.map((D) => {
let newRef = createRef();
LiRefs.push(newRef);
return (
<li
key={D.id}
ref={(el) => (newRef = el)} >
{D.label}
</li>
);
})}
但我传递给动画函数的数组是空的(我猜是因为该函数在 useEffect 钩子中被调用,而 LiRefs 还不是一个 useRef) 我也知道人数
ref={(el) => (`line${i}` = el)}
这不起作用 我可以尝试任何其他解决方案吗?
【问题讨论】:
-
您可能想要
React.useRef()而不是React.createRef()。createRef()仅用于 React 类组件。 -
但是,在循环内调用 any 钩子在技术上违反了“钩子规则”。如果您绝对肯定地知道“菜单”数组的长度不会改变,您可以这样做,但要小心。
-
@jered
React.createRef可以在任何你想要/需要创建反应引用的地方使用,我所知道的没有规则说它们只能用于基于类的组件中。如果是这样的话,那么 React docs 肯定会说明这一点。