使用 forwardRef 中的 ref 时,ref.current 始终未定义
2020-01-17
8166
import React, { useRef } from "react";
import { render } from "react-dom";
const styles = {
fontFamily: "sans-serif",
textAlign: "left"
};
const Wrapper = () => {
const ref = useRef();
return <App ref={ref} />;
};
const App = React.forwardRef(
({ placeHolder, onNameSelected, error, onSuggestion }, ref) => {
ref.current.setAttribute("he-de-data", "");
return (
<div style={styles}>
<h4>Username</h4>
<input ref={ref} />
</div>
);
}
);
render(<Wrapper />, document.getElementById("root"));
这里有一个 沙盒 可以帮助您:
我有以下代码,但 ref.current 未定义。我需要使用
forwardRef
中的 ref,并使用该 ref 向 DOM 添加一些属性。但是,
ref.current
始终为
未定义
。这有什么特别的原因吗?
2个回答
首先,您错误地使用了 ref 和 forwardRef。
使用 forwardRef 是因为功能组件无法实例化,因此如果您将 ref 分配给您创建的任何功能组件,它将为 null。forwardRef 的作用是将 ref 转发到它包装的组件,然后您可以将它分配给组件内的任何 html 元素,从而让您可以从 PARENT 访问 DOM。
您要做的是直接从组件本身内部设置属性,而不是从父级设置。因此不需要转发引用
const Comp =({ placeHolder, onNameSelected, error, onSuggestion }) => {
const inputRef = useRef(null);
useEffect(()=>{
if(inputRef.current!==null)
inputRef.current.setAttribute("he-de-data", "");
},[]);
return (
<div style={styles}>
<h4>Username</h4>
<input ref={inputRef} />
</div>
);
}
https://codesandbox.io/embed/react-16-v0kn4?fontsize=14&hidenavigation=1&theme=dark
Sujit.Warrier
2020-01-17
Ref. -Current将在第一个渲染上不确定。它需要在分配参考之前创建所有DOM节点 +孩子。您可以使用
686229716
之类的东西来防止它。 setAttribute不返回任何东西
topched
2020-01-17