gpt4 book ai didi

javascript - 如何在 React js 的功能组件中创建 ref?

转载 作者:行者123 更新时间:2023-12-05 04:48:09 26 4
gpt4 key购买 nike

我正在尝试在功能组件中创建 ref。但与基于类的组件相比,得到的输出不同。

这是简单的基于类的组件。在基于类的组件中,我得到了正确的引用

这里是基于类的组件 https://stackblitz.com/edit/react-vh86ou?file=src%2Ftabs.js

查看引用映射(正确的引用映射) enter image description here

我正在尝试对功能组件执行相同的映射但得到不同的输出,为什么?

这是我的功能组件 https://stackblitz.com/edit/react-nagea2?file=src%2FApp.js

export default function App() {
useEffect(() => {
console.log('---', tabRefs);
}, []);
const getTabProps = ({ title, key, selected, tabIndex }) => ({
selected,
children: title,
key: tabPrefix + key,
id: tabPrefix + key,
ref: e => (tabRefs[tabPrefix + key] = e),
originalKey: key
});

我得到这个输出 enter image description here

为什么我从 HTMLLIELEMENT 而不是 TAB 组件获取 Ref?

更新:

我正在尝试获取 offsetWidth 仍然无法获取 https://stackblitz.com/edit/react-nagea2?file=src%2FApp.js

useEffect(() => {
console.log('---', tabRefs);

Object.keys(tabRefs).forEach(key => {
console.log(key);
if (tabRefs[key]) {
const width = tabRefs[key].tab.offsetWidth;
console.log(width);
}
});
}, []);

最佳答案

正如@TabW 所解释的,函数组件没有引用。但是您不需要对Tab 组件本身的引用。您只需转发 ref 即可获取底层 li 元素的 offsetWidth,而无需使用 useImperativeHandle

将转发的 ref 直接附加到 li 上:

const Tab = React.forwardRef(({ children }, ref) => {
return <li ref={ref}>{children}</li>;
});

并从您访问它的地方删除 .tab 属性。

关于javascript - 如何在 React js 的功能组件中创建 ref?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68240991/

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