文章目录
React.forwardRef
在有些时候我们想要操作子组件中的DOM节点,说到获取DOM节点,可能我们会第一时间想到ref
。可是,如果我们是直接在子组件上写ref
,获得的只是子组件,而不是子组件下的某个DOM节点。
这个时候就可以通过React.forwardRef
来实现。
例如:
子组件:
const Child = React.forwardRef((props,ref)=>(
<input ref={ref} />
));
父组件:
class Father extends React.Component{
constructor(props){
super(props);
this.myRef=React.createRef();
}
componentDidMount(){
console.log(this.myRef.current);
}
render(){
return <Child ref={this.myRef}/>
}
}
源码
export default function forwardRef<Props, ElementType: React$ElementType>(
render: (props: Props, ref: React$Ref<ElementType>) => React$Node,
) {
if (__DEV__) {
if (typeof render !== 'function') {
warningWithoutStack(
false,
'forwardRef requires a render function but was given %s.',
render === null ? 'null' : typeof render,
);
} else {
warningWithoutStack(
// Do not warn for 0 arguments because it could be due to usage of the 'arguments' object
render.length === 0 || render.length === 2,
'forwardRef render functions accept exactly two parameters: props and ref. %s',
render.length === 1
? 'Did you forget to use the ref parameter?'
: 'Any additional parameter will be undefined.',
);
}
if (render != null) {
warningWithoutStack(
render.defaultProps == null && render.propTypes == null,
'forwardRef render functions do not support propTypes or defaultProps. ' +
'Did you accidentally pass a React component?',
);
}
}
return {
$$typeof: REACT_FORWARD_REF_TYPE,
render,
};
}
这个方法也仅仅是返回了一个对象而已,返回的对象里面有一个$$typeof
属性,这并不意味着它不是一个ReactElement
。在传入ReactElement
方法之后,该对象是被保存在了type
属性内,而$$typeof
仍是REACT_ELEMENT_TYPE
。