首页 > 其他分享 >React - 14 Hooks组件之useRef

React - 14 Hooks组件之useRef

时间:2023-07-02 12:00:58浏览次数:43  
标签:useRef Hooks React REF Demo 组件 ref

1.获取元素的3种方式

方式1:ref = { x => refName = x} 函数组件中没有this,直接给了一个变量。(可以用但是不推荐)

React - 14 Hooks组件之useRef_react

方式2 React.createRef()

React - 14 Hooks组件之useRef_react_02

方式3 useRef(null)

React - 14 Hooks组件之useRef_react_03

2.函数组件用useRef,类组件用React.createRef

import React, { useState, useEffect, useRef } from "react";
import { Button } from 'antd';
import './Demo.less';

let prev1,
    prev2;
const Demo = function Demo() {
    let [num, setNum] = useState(0);

    let box1 = useRef(null),
        box2 = React.createRef();
    if (!prev1) {
        // 第一次DEMO执行,把第一次创建的REF对象赋值给变量
        prev1 = box1;
        prev2 = box2;
    } else {
        // 第二次DEMO执行,我们验证一下,新创建的REF对象,和之前第一次创建的REF对象,是否一致?
        console.log(prev1 === box1); //true  useRef再每一次组件更新的时候(函数重新执行),再次执行useRef方法的时候,不会创建新的REF对象了,获取到的还是第一次创建的那个REF对象!!
        console.log(prev2 === box2); //false createRef在每一次组件更新的时候,都会创建一个全新的REF对象出来,比较浪费性能!!
        // 总结:在类组件中,创建REF对象,我们基于 React.createRef 处理;但是在函数组件中,为了保证性能,我们应该使用专属的 useRef 处理!!
    }

    useEffect(() => {
        console.log(box1.current);
        console.log(box2.current);
    });

    return <div className="demo">
        <span className="num" ref={box1}>{num}</span>
        <span className="num" ref={box2}>哈哈哈</span>
        <Button type="primary" size="small"
            onClick={() => {
                setNum(num + 1);
            }}>
            新增
        </Button>
    </div>;
};

3.在函数组件中把ref赋给组件

React - 14 Hooks组件之useRef_react_04

useImperativeHandle:基于forwardRef实现ref转发的同时,获取函数子组件内部的状态或者方法

import React, { useState, useEffect, useRef, useImperativeHandle } from "react";
import { Button } from 'antd';
import './Demo.less';

/* 
// 基于ref获取子组件的实例,这样基于实例,可以调用子组件内部,挂载到实例上的东西
class Child extends React.Component {
    state = { x: 1000 };
    render() {
        return <div className="child-box">
            {this.state.x}
        </div>;
    }
} */

/* // 基于forwardRef实现ref转发,目的:获取子组件内部的某个元素
const Child = React.forwardRef(function Child(props, ref) {
    // console.log(ref); //在DEMO中,调用Child的时候,传递的ref对象「x」
    return <div className="child-box">
        <span ref={ref}>哈哈哈</span>
    </div>;
}); */

// 函数子组件内部,可以有自己的状态和方法了;如何实现:基于forwardRef实现ref转发的同时,获取函数子组件内部的状态或者方法呢? => useImperativeHandle
const Child = React.forwardRef(function Child(props, ref) {
    let [text, setText] = useState('你好世界');
    const submit = () => { };

    useImperativeHandle(ref, () => {
        // 在这里返回的内容,都可以被父组件的REF对象获取到
        return {
            text,
            submit
        };
    });

    return <div className="child-box">
        <span>哈哈哈</span>
    </div>;
});

const Demo = function Demo() {
    let x = useRef(null);
    useEffect(() => {
        console.log(x.current);
    }, []);

    return <div className="demo">
        <Child ref={x} />
    </div>;
};

export default Demo;

标签:useRef,Hooks,React,REF,Demo,组件,ref
From: https://blog.51cto.com/u_12207234/6604226

相关文章

  • React - 13 Hooks组件之useEffect
    1.useEffectimportReact,{useState,useEffect}from"react";import{Button}from'antd';import'./Demo.less';/*useEffect:在函数组件中,使用生命周期函数useEffect(callback):没设置依赖+第一次渲染完毕后,执行callback,等价于componentDidMount......
  • 无意间做了个 web 版的 JVM 监控端前后端分离 React+Spring Boot
    本来就是为了更多的了解JMX,第一步就想把所有的MBean和属性都展示出来,开始在控制台输出,但是效果不好,内容太多太长,不够直观,然后就加了个web端的树形结构。然后做着做着突然发现,再稍微改改就能当个web版的简易监控端用了。此工具只在hotspotJVM8环境下测试过。可支持查看......
  • Vue3 reactive 操作数组 响应性(数组变了,但页面显示没变)问题
    问题代码:tableTemplates:Array<HkTaskTemplateEntity>=reactive([]);//删除方法的一部分,根据templateId删除数组数据this.tableTemplates=this.tableTemplates.filter(item=>templateId!==item.templateId);删除后tableTemplates数组中对象减少,但vue页面显示数据......
  • React - 12 Hooks组件之useState
    1.hooks组件本质是函数组件2.useState①基础用法importReact,{useState}from"react";import{Button}from'antd';/*useState:ReactHook函数之一,目的是在函数组件中使用状态,并且后期基于状态的修改,可以让组件更新let[num,setNum]=useState(initialValue);......
  • react保姆级搭建新项目
    此文主要以ts+vite+router6+antd快速搭建一个react项目,适用于初学者一、项目搭建采用pnpm,个人感觉比npm和yarn好用npmipnpm-g采用vite方式,根据选择react-tspnpmcreatevite1.1修改初始结构,删除多余文件1.2修改vite.config配置文件配置别名vite.config:import{defineC......
  • React学习时,outlet配置(token判定,页面path监听)
    尽管写过outlet路由的配置。考虑到token判定和路由页变更,我不了解v6是不是有更详解的做法。决定调一下配置,期望在任何页面异步更新时,token都可以在跳转前被检测到,防止无token跳转发生。为src文件配置v6版本:路由子组件App.jsimport{HashRouter,Routes,Ro......
  • React - 判断当前点击是组件的外部或内部
    1.先获取当前要监听的那个组件的refimportReact,{useRef}from'react';//类组件获取this.Ref=React.createRef();//函数组件获取constRef=useRef();2.通过addEventListener来全局监听document.addEventListener("mousedown",(e)=>{if(Ref.contains(e.ta......
  • React ISR 如何实现 - 最后的 Demo
    之前写了两个demo讲解了如何实现SSR和SSG,今天再写个demo说在ISR如何实现。什么是ISRISR即IncrementalStaticRegeneration增量静态再生,是指在SSG的前提下,可以在收到请求时判定页面是否需要刷新,如果需要则重新构建该页面,这样既拥有了静态页面的优势又可以避免页......
  • React基础
    一、ReactHook(部分)1.useEffectuseEffect用于处理组件中的effect,通常用于请求数据,事件处理,订阅等相关操作。1.当useEffect没有第二个参数时,useEffect会不停的调用2.当useEffect第二个参数为空数组时,仅在组件挂载和卸载时调用3.当useEffect第二个参数为变量时,例如[co......
  • react的函数式组件中使用ref获取到子组件的方法为undefined
    我暂时遇到了两种情况。第一种情况:useImperativeHandle函数写错useImperativeHandle的第二个参数的返回值是作为ref.current的值,但是我写箭头函数写快了,忘记返回值了。useImperativeHandle(ref,()=>{foo},[foo])//错误,这样没有返回值,所以ref.current为undefineduseImp......