react_hooks系列05_useRef,useImperativeHandle,高阶组件forwordRef

news/2024/7/15 18:07:23 标签: react.js, javascript, 前端

一、useRef

1、uesRef使用在官方标签上

useRef 返回一个可变的 ref 对象,其(ref 对象) .current 属性被初始化为传入的参数(initialValue)。返回的 ref 对象在组件的整个生命周期内保持不变。

javascript">import {useRef} from "react";
​
let refContainer = useRef(initialValue); 
​
<JSX ref={refContainer} ...
​
refContainer.current.dom操作

一个常见的用例便是命令式地访问子组件:

javascript">function TextInputWithFocusButton() {
    //定义了一个ref变量:inputEl
  const inputEl = useRef(null);
  
  const onButtonClick = () => {
    // `current` 指向已挂载到 DOM 上的文本输入元素
    inputEl.current.focus();
  };
    
  return (
    <>
      <input ref={inputEl} type="text" />
      <button onClick={onButtonClick}>Focus the input</button>
    </>
  );
}

2、uesRef使用在自定义组件上

如果ref引用的都是函数式组件,那么需要配合 useImperativeHandle  和 高阶组件forwordRef 

在类组件里,如果用ref引入组件对象。那么类组件中的实例属性和方法都可以被外部使用(这也是类的特性)。但是函数式组件只是个函数。没法对外开放。所以,需要使用useImperativeHandle 来进行对外开发。同时还需要结合forwardRef。

二、useImperativeHandle 和 高阶组件forwordRef

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

javascript">//父组件


import { Button } from 'antd';
import React,{useRef} from 'react'
import SonA from './SonA'

export default function Parent() {
  
  const refSon = useRef();  
  
  const refInput = useRef(null);

  function fn(){
    console.log("refSon.current",refSon.current);
    console.log("refInput",refInput);
  }

  return (
    <>
    <div>useRefDemo02</div>
    <input type="button" value="测试" onClick={fn} />
    
    <input type="text" ref={refInput}/>

  	  <SonA ref={refSon} ></SonA>
    </>
  )
}



//子组件

import React,{forwardRef, useImperativeHandle} from 'react';

function SonA(props,ref) {


  // 对外开放(给父组件,给父组件使用ref获取子组件对象时)的数据。
  useImperativeHandle(ref, () => ({
    msg:"hello",
    focus: () => {
      console.log("focus");
    }
  }));
    
    

  return (
    <>
      <div>SonA</div>     
    </>
  )
}


export default forwardRef(SonA);


http://www.niftyadmin.cn/n/1010206.html

相关文章

【剑指offer专项突破版】二叉树篇——“C“

文章目录 前言一、二叉树剪枝题目分析思路分析代码 二、序列化与反序列化二叉树题目分析思路分析代码 三、从根节点到叶节点的路径数字之和题目分析思路分析代码 四、 向下的路径节点之和题目分析思路分析思路①代码思路②代码 五、节点之和最大的路径题目分析思路分析代码 六、…

【Spring】Bean的作用域与生命周期详情:请简述Spring的执行流程并分析Bean的生命周期?

前言 我们都知道&#xff0c;Spring框架为开发人员提供了很多便捷&#xff0c;这使得开发人员能够更加专注于应用程序的核心业务逻辑&#xff0c;而不需要花费大量时间和精力在技术细节上。作为一个包含众多工具方法的IoC容器&#xff0c;存取JavaBean是其极为重要的一个环节。…

排序的概念,插入排序,希尔排序,选择排序

文章目录 排序的概念排序的概念&#xff1a;排序运用常见的排序与时间复杂度 插入排序希尔排序希尔排序的概念希尔排序总结 选择排序概念 排序的概念 排序的概念&#xff1a; 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小…

RedmiBook Pro 15S AMD Ryzen 7 5800H电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件配置 硬件型号驱动情况 主板RedmiBook Pro 15S 2021 处理器AMD Ryzen™ 7 5800H已驱动 内存16 GB 3200 MHz DDR4已驱动 硬盘Samsung 970EVO 512GB已驱动 显卡HD …

SpringBoot04:JSR303数据校验及多环境切换

目录 一、JSR303数据校验 1、如何使用&#xff1f; 2、常见参数 二、多环境切换 1、多配置文件 2、yaml的多文档块 3、配置文件加载位置 一、JSR303数据校验 1、如何使用&#xff1f; SpringBoot中可以用Validated来校验数据&#xff0c;如果数据异常则会统一抛出异常…

【二叉树part08】| 235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

目录 &#x1f388;LeetCode235.二叉搜索树的最近公共祖先 &#x1f388;LeetCode701.二叉搜索树中的插入操作 &#x1f388;LeetCode450.删除二叉搜索树中的节点 &#x1f388;LeetCode235.二叉搜索树的最近公共祖先 链接&#xff1a;235.二叉搜索树的最近公共祖先 给定一个…

【剧前爆米花--爪哇岛寻宝】TCP实现可靠性的方法以及连接相关的三次握手四次挥手

作者&#xff1a;困了电视剧 专栏&#xff1a;《JavaEE初阶》 文章分布&#xff1a;这是一篇关于网络编程的文章&#xff0c;在这篇文章中我会具体介绍TCP是如何实现可靠性的并且分析建立断开连接的情况&#xff0c;希望对你有所帮助&#xff01; 目录 可靠性 确认应答 超时…

设计模式第20讲——备忘录模式(Memento)

目录 一、什么是备忘录模式 二、角色组成 三、优缺点 四、应用场景 五、代码实现 5.0 UML类图 5.1 EditorMemento——备忘录&#xff08;Memento&#xff09; 5.2 Editor——源发器&#xff08;Originator&#xff09; 5.3 History——管理者&#xff08;Caretaker&a…