这个hook比较简单,作用: 获取函数组件里面的事件,我们通过
ref
来获取类组件的事件,所以 这个useImperativeHandle Hook
一般是于 ref 转发一起使用。
语法
useImperativeHandle(ref, createHandle, [deps])
- 参数一
ref
: 子组件中 ref转发传过来的 ref- 参数二
createHandle
: 子组件需要对外的事件,通过一个函数返回对象定义- 参数三
deps
: 依赖,如果依赖变化,则会重新调用
案例
获取类组件中的事件
获取类组件的事件,就是需要获取类组件的实例对象,然而获取实例对象,通过
ref
来就行。
import React, { PureComponent, Ref, useCallback } from 'react'
class TestGetClassHandle extends PureComponent {
// 测试的事件
testHandle = () => {
console.log('获取类组件中的事件');
}
render() {
return (
<div>
<h1>类组件</h1>
</div>
)
}
}
export default function TestImperativeHook() {
// 创建一个 ref
const classRef: Ref<TestGetClassHandle> = React.createRef();
// 获取子组件的事件
const handle = useCallback(() => {
classRef.current!.testHandle()
}, [])
return (
<div>
<TestGetClassHandle ref={classRef}></TestGetClassHandle>
<button onClick={handle}>获取子组件事件</button>
</div>
)
}
类组件效果
函数组件的事件
首先通过 ref 转发,然后在通过
useImperativeHandle Hook
获取函数组件中的事件
import React, { Ref, useCallback, useImperativeHandle } from 'react'
// 定义接口类型
interface IR {
testHandle: () => void
}
function TestGetFuncHandle(props: {}, ref: Ref<IR>) {
useImperativeHandle(ref, () => ({
// 需要把函数组件对外暴露的的事件写到这里
testHandle: handle
}));
const handle = () => {
console.log('函数组件的事件调用了');
}
return (
<>
<div >函数组件</div>
<button onClick={ handle}>组件自己调用</button>
</>
)
}
const NewTestFor = React.forwardRef(TestGetFuncHandle);
export default function TestImperativeHook() {
const funcRef: Ref<IR> = React.createRef()
// 获取子组件的事件
const handle = useCallback(() => {
funcRef.current!.testHandle()
}, [])
return (
<div>
<NewTestFor ref={funcRef}></NewTestFor>
<button onClick={handle}>获取子组件事件</button>
</div>
)
}