当前位置:编程学习 > > 正文

react的基本知识(React中refs的一些常见用法汇总)

时间:2021-10-10 00:31:22类别:编程学习

react的基本知识

React中refs的一些常见用法汇总

什么是Refs

Refs 提供了一种方式,允许我们访问 DOM 节点或在 render 方法中创建的 React 元素。
Ref转发是一项将ref自动通过组件传递到子组件的技巧。 通常用来获取DOM节点或者React元素实例的工具。在React中Refs提供了一种方式,允许用户访问dom节点或者在render方法中创建的React元素。

Refs转发

Ref 转发是一个可选特性,其允许某些组件接收 ref,并将其向下传递(换句话说,“转发”它)给子组件。

默认情况下,不能在函数组件上使用 ref 属性,因为它们没有实例:

一、String 类型的 Refs

不建议使用,因为 string 类型的 refs 存在一些问题。它已过时并可能会在未来的版本被移除。

  • import React from "react";
    // 父组件
    export default class StringRef extends React.PureComponent {
      componentDidMount() {
        console.log("stringRefDom:", this.refs.stringRefDom);
        console.log("stringRefComp:", this.refs.stringRefComp);
      }
      render() {
        return (
          <li>
            {/*原生组件使用方式*/}
            <li ref={"stringRefDom"}>stringRefDom</li>
            {/*类组件使用方式*/}
            <StringRefComp ref={"stringRefComp"} />
          </li>
        );
      }
    }
    //类组件
    class StringRefComp extends React.PureComponent {
      render() {
        return <li>StringRefComp</li>;
      }
    }
    
    
  • 二、回调 Refs
  • import React from "react";
    // 父组件
    export default class CallbackRef extends React.PureComponent {
      constructor(props) {
        super(props);
        this.callbackRefDom = null;
        this.callbackRefComp = null;
      }
      componentDidMount() {
        console.log("callbackRefDom:", this.callbackRefDom);
        console.log("callbackRefComp:", this.callbackRefComp);
      }
      //回调函数
      setCallbackRefDom = (ref) => {
        this.callbackRefDom = ref;
      };
      setCallbackRefComp = (ref) => {
        this.callbackRefComp = ref;
      };
      //回调函数
      render() {
        return (
          <li>
            <li ref={this.setCallbackRefDom}>callbackRefDom</li>
            <CallbackRefComp ref={this.setCallbackRefComp} />
          </li>
        );
      }
    }
    
    //类组件
    class CallbackRefComp extends React.PureComponent {
      render() {
        return <li>callbackRefComp</li>;
      }
    }
    
    
  • 三、React.createRef()
  • import React from "react";
    // 父组件
    export default class CreateRef extends React.PureComponent {
      constructor(props) {
        super(props);
        this.createRefDom = React.createRef();
        this.createRefComp = React.createRef();
      }
      componentDidMount() {
        console.log("createRefDom:", this.createRefDom.current);
        console.log("createRefComp:", this.createRefComp.current);
      }
      render() {
        return (
          <li>
            <li ref={this.createRefDom}>createRefDom</li>
            <CreateRefComp ref={this.createRefComp} />
          </li>
        );
      }
    }
    //类组件
    class CreateRefComp extends React.PureComponent {
      render() {
        return <li>CreateRefComp</li>;
      }
    }
    
    
  • 四、useRef
  • import React, { useEffect } from "react";
    // 父组件
    const UseRef = React.memo(() => {
      // // 同样可以用
      // const createRefDom = React.createRef();
      // const createRefComp = React.createRef();
      const createRefDom = React.useRef();
      const createRefComp = React.useRef();
      useEffect(() => {
        console.log("useRefDom:", createRefDom.current);
        console.log("useRefComp:", createRefComp.current);
      }, []);
      return (
        <li>
          <li ref={createRefDom}>useRefDom</li>
          <UseRefComp ref={createRefComp} />
        </li>
      );
    });
    
    export default UseRef;
    
    //类组件
    class UseRefComp extends React.PureComponent {
      render() {
        return <li>useRefComp</li>;
      }
    }
    
    
    
  • 五、Refs 与函数组件
  • import React, { useEffect, useImperativeHandle } from "react";
    
    // 父组件
    const ForwardRef = React.memo(() => {
      const createRefComp = React.useRef();
      const createRefCompMethod = React.useRef();
    
      useEffect(() => {
        console.log("useRefComp:", createRefComp.current);
        console.log("createRefCompMethod:", createRefCompMethod.current);
        createRefComp.current.reload();
      }, []);
      return (
        <li>
          <ForwardRefFunc ref={createRefComp} />
        </li>
      );
    });
    
    export default ForwardRef;
    
    const RefFunc = React.forwardRef((props, ref) => {
      const [name, setName] = React.useState(null);
      const reload = () => {
        console.log("reload");
        setTimeout(() => {
          setName("ForwardRefFunc");
        }, 3000);
      };
      //useImperativeHandle 可以让你在使用 ref 时自定义暴露给父组件的实例值
      useImperativeHandle(ref, () => {
        return {
          reload: reload,
        };
      });
      return <li ref={ref}>ForwardRefFunc {name}</li>;
    });
    const ForwardRefFunc = React.memo(RefFunc);
    
    
    
  • forwardRef 和 useImperativeHandle 最终目的是设法给 ref 提供一个可调用的对象!

    总结

    到此这篇关于React中refs的一些常见用法的文章就介绍到这了,更多相关React中refs用法内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!

    标签:
    上一篇下一篇

    猜您喜欢

    热门推荐