成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:說說對React refs 的理解?應(yīng)用場景?

開發(fā) 前端
React 中的 Refs提供了一種方式,允許我們訪問 DOM節(jié)點(diǎn)或在 render方法中創(chuàng)建的 React元素

[[409689]]

本文轉(zhuǎn)載自微信公眾號「JS每日一題」,作者灰灰。轉(zhuǎn)載本文請聯(lián)系JS每日一題公眾號。

一、Refs 是什么

Refs 在計(jì)算機(jī)中稱為彈性文件系統(tǒng)(英語:Resilient File System,簡稱ReFS)

React 中的 Refs提供了一種方式,允許我們訪問 DOM節(jié)點(diǎn)或在 render方法中創(chuàng)建的 React元素

本質(zhì)為ReactDOM.render()返回的組件實(shí)例,如果是渲染組件則返回的是組件實(shí)例,如果渲染dom則返回的是具體的dom節(jié)點(diǎn)

二、如何使用

創(chuàng)建ref的形式有三種:

  • 傳入字符串,使用時通過 this.refs.傳入的字符串的格式獲取對應(yīng)的元素
  • 傳入對象,對象是通過 React.createRef() 方式創(chuàng)建出來,使用時獲取到創(chuàng)建的對象中存在 current 屬性就是對應(yīng)的元素
  • 傳入函數(shù),該函數(shù)會在 DOM 被掛載時進(jìn)行回調(diào),這個函數(shù)會傳入一個 元素對象,可以自己保存,使用時,直接拿到之前保存的元素對象即可
  • 傳入hook,hook是通過 useRef() 方式創(chuàng)建,使用時通過生成hook對象的 current 屬性就是對應(yīng)的元素

傳入字符串

只需要在對應(yīng)元素或組件中ref屬性

  1. class MyComponent extends React.Component { 
  2.   constructor(props) { 
  3.     super(props); 
  4.     this.myRef = React.createRef(); 
  5.   } 
  6.   render() { 
  7.     return <div ref={this.myRef} />; 
  8.   } 

訪問當(dāng)前節(jié)點(diǎn)的方式如下:

  1. this.refs.myref.innerHTML = "hello"

傳入對象

refs通過React.createRef()創(chuàng)建,然后將ref屬性添加到React元素中,如下:

  1. class MyComponent extends React.Component { 
  2.   constructor(props) { 
  3.     super(props); 
  4.     this.myRef = React.createRef(); 
  5.   } 
  6.   render() { 
  7.     return <div ref={this.myRef} />; 
  8.   } 

當(dāng) ref 被傳遞給 render 中的元素時,對該節(jié)點(diǎn)的引用可以在 ref 的 current 屬性中訪問

  1. const node = this.myRef.current

傳入函數(shù)

當(dāng)ref傳入為一個函數(shù)的時候,在渲染過程中,回調(diào)函數(shù)參數(shù)會傳入一個元素對象,然后通過實(shí)例將對象進(jìn)行保存

  1. class MyComponent extends React.Component { 
  2.   constructor(props) { 
  3.     super(props); 
  4.     this.myRef = React.createRef(); 
  5.   } 
  6.   render() { 
  7.     return <div ref={element => this.myref = element} />; 
  8.   } 

獲取ref對象只需要通過先前存儲的對象即可

  1. const node = this.myref  

傳入hook

通過useRef創(chuàng)建一個ref,整體使用方式與React.createRef一致

  1. function App(props) { 
  2.   const myref = useRef() 
  3.   return ( 
  4.     <> 
  5.       <div ref={myref}></div> 
  6.     </> 
  7.   ) 

獲取ref屬性也是通過hook對象的current屬性

  1. const node = myref.current

上述三種情況都是ref屬性用于原生HTML元素上,如果ref設(shè)置的組件為一個類組件的時候,ref對象接收到的是組件的掛載實(shí)例

注意的是,不能在函數(shù)組件上使用ref屬性,因?yàn)樗麄儾]有實(shí)例

三、應(yīng)用場景

在某些情況下,我們會通過使用refs來更新組件,但這種方式并不推薦,更多情況我們是通過props與state的方式進(jìn)行去重新渲染子元素

過多使用refs,會使組件的實(shí)例或者是DOM結(jié)構(gòu)暴露,違反組件封裝的原則

例如,避免在 Dialog 組件里暴露 open() 和 close() 方法,最好傳遞 isOpen 屬性

但下面的場景使用refs非常有用:

  • 對Dom元素的焦點(diǎn)控制、內(nèi)容選擇、控制
  • 對Dom元素的內(nèi)容設(shè)置及媒體播放
  • 對Dom元素的操作和對組件實(shí)例的操作
  • 集成第三方 DOM 庫

參考文獻(xiàn)

https://zh-hans.reactjs.org/docs/refs-and-the-dom.html

https://segmentfault.com/a/1190000020842342

https://vue3js.cn/interview

 

責(zé)任編輯:武曉燕 來源: JS每日一題
相關(guān)推薦

2021-05-31 10:35:34

TCPWebSocket協(xié)議

2021-07-12 08:35:24

組件應(yīng)用場景

2021-06-08 08:33:23

NodeStream數(shù)據(jù)

2021-06-07 09:41:48

NodeBuffer 網(wǎng)絡(luò)協(xié)議

2021-06-30 07:19:36

React事件機(jī)制

2021-09-16 07:52:18

算法應(yīng)用場景

2021-11-09 08:51:13

模式命令面試

2021-11-05 07:47:56

代理模式對象

2021-11-10 07:47:49

組合模式場景

2021-08-16 08:33:26

git

2021-11-04 06:58:32

策略模式面試

2021-11-03 14:10:28

工廠模式場景

2021-07-13 07:52:03

ReactHooks組件

2021-09-06 10:51:27

TypeScriptJavaScript

2021-09-28 07:12:09

測試路徑

2021-11-22 23:50:59

責(zé)任鏈模式場景

2021-11-11 16:37:05

模板模式方法

2021-09-29 07:24:20

場景數(shù)據(jù)

2021-07-29 07:55:20

React Fiber架構(gòu)引擎

2021-09-10 06:50:03

TypeScript裝飾器應(yīng)用
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久久久高清 | 久久精品国产一区二区三区不卡 | 中文字幕一区二区三区四区不卡 | 精品视频一区二区三区四区 | 日韩成人在线观看 | 国产视频三区 | 欧美成人久久 | 亚洲综合一区二区三区 | 日韩精品在线免费观看 | 午夜影院在线观看 | 亚洲视频在线观看 | 亚洲一区av| 成人在线播放网址 | 福利一区二区在线 | 日本中文在线 | 成人在线观看欧美 | 激情伊人网 | 亚洲一区中文字幕在线观看 | 国产伊人精品 | 国产日韩视频 | 亚洲性在线 | 久久精品色欧美aⅴ一区二区 | 日韩精品一区二区三区在线播放 | 91精品一区二区三区久久久久 | 国产精品永久免费 | 狠狠狠干 | 一区二区三区四区不卡视频 | 岛国午夜 | 香蕉一区二区 | 一区二区av | 黄网站涩免费蜜桃网站 | 黄色网址av | 欧美激情国产精品 | av喷水| 女同久久 | 日韩在线一区二区三区 | 亚洲一区二区久久 | 久久伊人在 | 精品在线一区 | yeyeav| 欧美日韩国产一区二区三区 |