其他分享
首页 > 其他分享> > useImperativeHandle使用实例

useImperativeHandle使用实例

作者:互联网

useImperativeHandle可以让你在使用ref时自定义暴露给父组件的实例值。在大多数情况下,应当避免使用ref这样的命令式代码。useImperativeHandle应当与forwardRef一起使用。

useImperativeHandle介绍

useImperativeHandle(ref, createHandle, [deps])

实例:

父组件:

import React, { useState, useEffect, useRef } from 'react';

 const childForm = useRef<any>({});
  const cRef = useRef() as React.MutableRefObject<any>;


//使用子组件暴露出来的方法   cRef.current

const handleAgree = async () => {
const res = await cRef.current.onFinish();
}





  <Modal
        title="云端情报库"
        visible={isShow}
        onOk={handleAgree}
        onCancel={handleOff}
        destroyOnClose={true}
      >
//CloudIntelligence 子组件
        <CloudIntelligence
          cRef={cRef}
          data={dataform}
        />
      </Modal>

子组件:

import React, { useState, useImperativeHandle, useEffect } from 'react';


//子组件解析出来
const { cRef, data } = props;


   // 将方法暴露给父组件使用
    useImperativeHandle(cRef, () => ({
        form,
        onFinish,
    }));

回顾一下ref和forwardRef结合使用:

import React, { useRef, forwardRef } from 'react'

// forwardRef可以将ref转发给子组件
const JMInput = forwardRef((props, ref) => {
  return <input type="text" ref={ref} />
})

export default function ForwardDemo() {
  // forward用于获取函数式组件DOM元素
  const inputRef = useRef()
  const getFocus = () => {
    inputRef.current.focus()
  }

  return (
    <div>
      <button onClick={getFocus}>聚焦</button>
      <JMInput ref={inputRef} />
    </div>
  )
}

forwardRef的做法本身没有什么问题, 但是我们是将子组件的DOM直接暴露给了父组件:

参考来源:

React Hook 中useImperativeHandle介绍使用与场景 - 网页3剑客

标签:const,useImperativeHandle,实例,forwardRef,使用,组件,ref,给父
来源: https://blog.csdn.net/WJLcomeon/article/details/123246152