React hooks之useImperativeHandle使用实例

useImperativeHandle

useImperativeHandle(ref, createHandle, [deps])

useImperativeHandle 可以让你在使用 ref 时自定义暴露给父组件的实例值,与 forwardRef 一起使用。

封装两个子组件:combine.js

import React, { useState } from 'react';
import Invite from "../invite"
import Login from "../login"

const openSwitch = React.forwardRef((props, ref) => {
  const [isInviteVisible, setIsInviteVisible] = useState(false);
  const [isModalVisible, setIsModalVisible] = useState(false);

  React.useImperativeHandle(
      ref,
      () => ({
        handleShowLogin,
        handleShowInvite
      })
  )

  const handleShowLogin = () => {
    setIsModalVisible(true);
    setIsInviteVisible(false);
  };

  const handleShowInvite = () => {
    setIsModalVisible(false);
    setIsInviteVisible(true);
  };

  return (
    <>
      <Invite   isInviteVisible={isInviteVisible}
                setIsInviteVisible={setIsInviteVisible}
                handleShowLogin={handleShowLogin} />
      <Login    isModalVisible={isModalVisible}
                setIsModalVisible={setIsModalVisible}
                handleShowInvite={handleShowInvite}/>
    </>
  );
})

export default openSwitch

父组件中引用:index.js

function Open (){
  const ref = useRef(null)
 
  const handleInvite = () =>{
    ref.current.handleShowInvite()
  }

  return (
    <div className="page-container">
	    <Button
	          key="btn"
	          type="primary"
	          onClick={handleInvite}
	        >
	        立即邀请
        </Button>
        <OpenSwitch ref={ref}/>
    </div>
  )
}

export default Open

正常情况下 ref 是不能挂在到函数组件上的,因为函数组件没有实例,但是 useImperativeHandle 为我们提供了一个类似实例的东西。它帮助我们通过 useImperativeHandle 的第 2 个参数,所返回的对象的内容挂载到 父组件的 ref.current 上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

椰卤工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值