useImperativeHandle使用实例

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

useImperativeHandle介绍

useImperativeHandle(ref, createHandle, [deps])
  • 通过useImperativeHandle可以只暴露特定的操作

    • 通过useImperativeHandle的Hook, 将父组件传入的ref和useImperativeHandle第二个参数返回的对象绑定到了一起

    • 所以在父组件中, 调用inputRef.current时, 实际上是返回的对象

  • useImperativeHandle使用简单总结:

    • 作用: 减少暴露给父组件获取的DOM元素属性, 只暴露给父组件需要用到的DOM方法

    • 参数1: 父组件传递的ref属性

    • 参数2: 返回一个对象, 以供给父组件中通过ref.current调用该对象中的方法

实例:

父组件:

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


  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结合使用:

  • 通过forwardRef可以将ref转发给子组件
  • 子组件拿到父组件创建的ref, 绑定到自己的某一个元素中
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直接暴露给了父组件:

  • 直接暴露给父组件带来的问题是某些情况的不可控
  • 父组件可以拿到DOM后进行任意的操作
  • 我们只是希望父组件可以操作的focus,其他并不希望它随意操作其他方法

react hooks子组件向父组件传参(useContext)

import React, { useState, useContext  } from 'react';
import { ChildrenContext } from '../index';
import { Button } from 'antd';
export const Children= (props) => {
    const { setParent } = props;
    const baseval = useContext(ChildrenContext);
    const onClick= () => {
        setParent(false);
    }
    return (
        <Button type="primary" onClick={()=>onClick()}>点击</Button>
    );
}


父组件

import React, { useState, createContext } from 'react';
import {Children} from './Children.js';
export const ChildrenContext = createContext();
export const Parent = () => {
    const [parent, setChildren] = useState(false);
    return (
         <ChildrenContext.Provider value={parent}>
            <Children setParent={setChildren}/>
         </ChildrenContext.Provider>
    );
}


 
 

参考来源:

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

  • 13
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
useImperativeHandleReact的一个自定义Hook函数,它可以在使用ref时自定义暴露给父组件的实例值。通常情况下,我们应该避免使用ref这样的命令式代码,而是使用更加声明式的方法进行组件间的通信。然而,在某些情况下,我们可能需要在父组件中获取子组件的一些内部状态或方法,这时就可以使用useImperativeHandle配合forwardRef来实现这个功能。 useImperativeHandle使用方法如下: ```javascript useImperativeHandle(ref, createHandle, [deps]) ``` 其中,ref是一个React引用对象,createHandle是一个函数,用于定义要暴露给父组件的实例值,deps是一个可选的依赖数组。 在父组件中,可以通过ref来获取子组件内部暴露的实例值,从而实现父子组件之间的通信。通过useImperativeHandle,父组件可以一次性获取到多个标签元素或其他子组件内部的状态或方法。 在子组件中,需要使用React的useState、useImperativeHandleHook函数来定义内部状态或实例值,并将其暴露给父组件使用。在useImperativeHandle中,可以返回一个对象,该对象包含了需要暴露给父组件的实例值。 总而言之,useImperativeHandle是一个可以让父组件获取子组件内部状态或方法的自定义Hook函数,通过配合forwardRef使用,可以实现父子组件之间的通信。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [useImperativeHandle使用实例](https://blog.csdn.net/WJLcomeon/article/details/123246152)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [前端必读2.0:如何在React使用SpreadJS导入和导出 Excel 文件](https://blog.csdn.net/web22050702/article/details/127797298)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值