最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React中refs的一些常見用法匯總

 更新時間:2021年07月15日 11:12:22   作者:好_快  
Refs是一個 獲取 DOM節(jié)點(diǎn)或React元素實(shí)例的工具,在React中Refs 提供了一種方式,允許用戶訪問DOM 節(jié)點(diǎn)或者在render方法中創(chuàng)建的React元素,這篇文章主要給大家介紹了關(guān)于React中refs的一些常見用法,需要的朋友可以參考下

什么是Refs

Refs 提供了一種方式,允許我們訪問 DOM 節(jié)點(diǎn)或在 render 方法中創(chuàng)建的 React 元素。
Ref轉(zhuǎn)發(fā)是一項(xiàng)將ref自動通過組件傳遞到子組件的技巧。 通常用來獲取DOM節(jié)點(diǎn)或者React元素實(shí)例的工具。在React中Refs提供了一種方式,允許用戶訪問dom節(jié)點(diǎn)或者在render方法中創(chuàng)建的React元素。

Refs轉(zhuǎn)發(fā)

Ref 轉(zhuǎn)發(fā)是一個可選特性,其允許某些組件接收 ref,并將其向下傳遞(換句話說,“轉(zhuǎn)發(fā)”它)給子組件。

默認(rèn)情況下,不能在函數(shù)組件上使用 ref 屬性,因?yàn)樗鼈儧]有實(shí)例:

一、String 類型的 Refs

不建議使用,因?yàn)?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 (
      <div>
        {/*原生組件使用方式*/}
        <div ref={"stringRefDom"}>stringRefDom</div>
        {/*類組件使用方式*/}
        <StringRefComp ref={"stringRefComp"} />
      </div>
    );
  }
}
//類組件
class StringRefComp extends React.PureComponent {
  render() {
    return <div>StringRefComp</div>;
  }
}

二、回調(diào) Refs

  • 如果 ref 回調(diào)函數(shù)是以內(nèi)聯(lián)函數(shù)的方式定義的,在更新過程中它會被執(zhí)行兩次
  • 第一次傳入?yún)?shù) null,然后第二次會傳入?yún)?shù) DOM 元素
  • 這是因?yàn)樵诿看武秩緯r會創(chuàng)建一個新的函數(shù)實(shí)例,所以 React 清空舊的 ref 并且設(shè)置新的
  • 通過將 ref 的回調(diào)函數(shù)定義成 class 的綁定函數(shù)的方式可以避免上述問題
  • 但是大多數(shù)情況下它是無關(guān)緊要的
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);
  }
  //回調(diào)函數(shù)
  setCallbackRefDom = (ref) => {
    this.callbackRefDom = ref;
  };
  setCallbackRefComp = (ref) => {
    this.callbackRefComp = ref;
  };
  //回調(diào)函數(shù)
  render() {
    return (
      <div>
        <div ref={this.setCallbackRefDom}>callbackRefDom</div>
        <CallbackRefComp ref={this.setCallbackRefComp} />
      </div>
    );
  }
}

//類組件
class CallbackRefComp extends React.PureComponent {
  render() {
    return <div>callbackRefComp</div>;
  }
}

三、React.createRef()

  • React 16.3 版本引入
  • 較早版本的 React,推薦使用回調(diào)形式的 refs
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 (
      <div>
        <div ref={this.createRefDom}>createRefDom</div>
        <CreateRefComp ref={this.createRefComp} />
      </div>
    );
  }
}
//類組件
class CreateRefComp extends React.PureComponent {
  render() {
    return <div>CreateRefComp</div>;
  }
}

四、useRef

  • Hook 是 React 16.8 的新增特性
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 (
    <div>
      <div ref={createRefDom}>useRefDom</div>
      <UseRefComp ref={createRefComp} />
    </div>
  );
});

export default UseRef;

//類組件
class UseRefComp extends React.PureComponent {
  render() {
    return <div>useRefComp</div>;
  }
}

五、Refs 與函數(shù)組件

  • 默認(rèn)情況下,你不能在函數(shù)組件上使用 ref 屬性,因?yàn)樗鼈儧]有實(shí)例
  • 如果要在函數(shù)組件中使用 ref,你可以使用 forwardRef(可與 useImperativeHandle 結(jié)合使用)
  • 或者將該組件轉(zhuǎn)化為 class 組件。
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 (
    <div>
      <ForwardRefFunc ref={createRefComp} />
    </div>
  );
});

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 時自定義暴露給父組件的實(shí)例值
  useImperativeHandle(ref, () => {
    return {
      reload: reload,
    };
  });
  return <div ref={ref}>ForwardRefFunc {name}</div>;
});
const ForwardRefFunc = React.memo(RefFunc);

forwardRef 和 useImperativeHandle 最終目的是設(shè)法給 ref 提供一個可調(diào)用的對象!

總結(jié)

到此這篇關(guān)于React中refs的一些常見用法的文章就介紹到這了,更多相關(guān)React中refs用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • react component changing uncontrolled input報(bào)錯解決

    react component changing uncontrolled in

    這篇文章主要為大家介紹了react component changing uncontrolled input報(bào)錯解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • react批量引入svg圖標(biāo)的方法

    react批量引入svg圖標(biāo)的方法

    這篇文章主要介紹了react批量引入svg圖標(biāo)的方法,在批量引入之前,我們需要安裝一個包并配置到typescript.json文件中,需要的朋友可以參考下
    2024-03-03
  • react實(shí)現(xiàn)鼠標(biāo)懸停在SVG地圖上某個區(qū)域時上方呈現(xiàn)柱形圖效果

    react實(shí)現(xiàn)鼠標(biāo)懸停在SVG地圖上某個區(qū)域時上方呈現(xiàn)柱形圖效果

    這篇文章主要介紹了react實(shí)現(xiàn)鼠標(biāo)懸停在SVG地圖上某個區(qū)域時,其上方呈現(xiàn)柱形圖,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • react 創(chuàng)建單例組件的方法

    react 創(chuàng)建單例組件的方法

    這篇文章主要介紹了react 創(chuàng)建單例組件的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • 詳解React項(xiàng)目的服務(wù)端渲染改造(koa2+webpack3.11)

    詳解React項(xiàng)目的服務(wù)端渲染改造(koa2+webpack3.11)

    本篇文章主要介紹了詳解React項(xiàng)目的服務(wù)端渲染改造(koa2+webpack3.11),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • 插件化機(jī)制優(yōu)雅封裝你的hook請求使用方式

    插件化機(jī)制優(yōu)雅封裝你的hook請求使用方式

    這篇文章主要為大家介紹了插件化機(jī)制優(yōu)雅封裝你的hook請求使用方式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • React 腳手架使用指南(最新推薦)

    React 腳手架使用指南(最新推薦)

    本文介紹了React腳手架(CreateReactApp)的使用指南,包括創(chuàng)建項(xiàng)目、項(xiàng)目結(jié)構(gòu)、常用命令、最佳實(shí)踐、常見問題解決以及腳手架的優(yōu)勢,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2024-12-12
  • React Native中的RefreshContorl下拉刷新使用

    React Native中的RefreshContorl下拉刷新使用

    本篇文章主要介紹了React Native中的RefreshContorl下拉刷新使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • JavaScript中React 面向組件編程(下)

    JavaScript中React 面向組件編程(下)

    在React面向組件編程中,除了上一章節(jié)的組件實(shí)例的三大核心屬性以外,還有很多重要的內(nèi)容比如:React 的生命周期,受控組件與非受控組件,高階函數(shù)和函數(shù)柯里化的理解等,在本文中會給大家繼續(xù)講解React 面向組件編程中剩余的內(nèi)容
    2023-03-03
  • React中嵌套組件與被嵌套組件的通信過程

    React中嵌套組件與被嵌套組件的通信過程

    這篇文章主要介紹了React中嵌套組件與被嵌套組件的通信過程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-07-07

最新評論

江口县| 贡山| 松滋市| 丰台区| 岳西县| 汝州市| 元阳县| 太康县| 柳州市| 莱芜市| 阳江市| 张家口市| 大连市| 遂宁市| 江陵县| 竹山县| 旬邑县| 德钦县| 奇台县| 额尔古纳市| 开封市| 东乡| 临夏市| 峡江县| 普陀区| 尚义县| 日土县| 黄浦区| 黄大仙区| 大新县| 托里县| 海淀区| 郸城县| 邛崃市| 土默特左旗| 江北区| 河池市| 淮北市| 涡阳县| 米脂县| 慈溪市|