ref
添加到组件上获取的是组件(只能是类组件,因为函数组件没有实例)的实例,添加到原生HTML
元素上获取的是DOM
fondDOMNode
当参数是DOM
时得到的也是DOM
,这个没有什么作用,使用ref
就可以了。当参数时组件实例时获取的是组件render
返回的DOM
下面举些例子验证findDOMNode
功能是否如上面所说,ref
的介绍可以参考react如何使用ref
1、参数是DOM
import React, { useEffect } from 'react';
import { findDOMNode } from 'react-dom';
const FindDOMNode = () => {
const inputRef = React.createRef<HTMLInputElement>();
useEffect(() => {
if (inputRef.current) {
const inputDOM = findDOMNode(inputRef.current);
console.log(inputDOM, inputRef.current)
}
})
return <input type="text" ref={inputRef}/>
}
export default FindDOMNode;
控制台打印发现findDOMNode
参数是DOM
返回还是参数DOM
,这种使用没有什么意义,一般也不推荐这样使用,直接使用ref
即可
我们加上一行代码使input
聚焦,发现findDOMNode
返回的Element
类型的DOM
export function findDOMNode(instance: ReactInstance | null | undefined): Element | null | Text;
input
的focus
方法在HTMLInputElement
类型的DOM
对象上,而HTMLInputElement
类型继承了Element
,我们只需要使用as
断言成实际类型即可
const inputDOM = findDOMNode(inputRef.current) as HTMLInputElement;
inputDOM.focus()
ref.current
返回的就是我们 React.createRef<HTMLInputElement>()
定义好的泛型类型
2、参数是Component
// 父组件
import React, { useEffect } from 'react';
import { findDOMNode } from 'react-dom';
import InputComp from './inputComp';
const FindDOMNode = () => {
// InputComp指明组件实例的类型
const inputRef = React.createRef<InputComp>();
useEffect(() => {
if (inputRef.current) {
const inputDOM = findDOMNode(inputRef.current);
console.log(inputDOM, inputRef.current)
}
})
return <InputComp ref={inputRef}></InputComp>
}
export default FindDOMNode;
// 子组件
import React from 'react';
class InputComp extends React.Component<{}, {}> {
render() {
return <div>
<input type="text"/>
</div>
}
}
export default InputComp;
控制台打印情况恰好验证了开头说的
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。