react 进阶hook 之 useImperativeHandle hook

简介: 这个hook比较简单,作用: 获取函数组件里面的事件,我们通过 ref 来获取类组件的事件,所以 这个 useImperativeHandle Hook 一般是于 ref 转发一起使用。

这个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>
  )
}


类组件效果


20210412092038937.png


函数组件的事件


首先通过 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>
  )
}


函数组件调用效果


20210412095350412.png

相关文章
|
5月前
|
前端开发
React 中的 Hook 概念
【8月更文挑战第31天】
44 0
|
6月前
|
前端开发
React useImperativeHandle Hook
【7月更文挑战第1天】React useImperativeHandle Hook
34 3
|
6月前
|
前端开发 JavaScript 数据格式
react18【系列实用教程】Hooks (useState,useReducer,useRef,useEffect,useContext,useMemo,useCallback,自定义 Hook )
react18【系列实用教程】Hooks (useState,useReducer,useRef,useEffect,useContext,useMemo,useCallback,自定义 Hook )
116 1
|
6月前
|
存储 前端开发 JavaScript
react hooks 学习进阶
【7月更文挑战第12天】 React Hooks(自16.8版起)让函数组件能处理状态和副作用。useState用于添加状态管理,useEffect处理副作用,useContext共享数据,useReducer处理复杂状态逻辑,useRef获取引用。进阶技巧涉及性能优化,如useMemo和useCallback,以及遵循规则避免在不适当位置调用Hooks。理解异步更新机制和结合Redux等库提升应用复杂性管理。持续学习新技巧是关键。
64 0
|
6月前
|
前端开发
Vue3 【仿 react 的 hook】封装 useTitle
Vue3 【仿 react 的 hook】封装 useTitle
65 0
|
6月前
|
前端开发 API
Vue3 【仿 react 的 hook】封装 useLocation
Vue3 【仿 react 的 hook】封装 useLocation
46 0
|
8月前
|
前端开发 JavaScript
【边做边学】React Hooks (二)——useEffect Hook
【边做边学】React Hooks (二)——useEffect Hook
|
8月前
|
前端开发 中间件 数据安全/隐私保护
React路由进阶方法
React路由进阶方法
70 1
|
8月前
|
前端开发 JavaScript
React中useEffect Hook使用纠错
React中useEffect Hook使用纠错
49 0
|
8月前
|
自然语言处理 前端开发 JavaScript
说说你对 React Hook的闭包陷阱的理解,有哪些解决方案?
说说你对 React Hook的闭包陷阱的理解,有哪些解决方案?
128 0