24 React.createRef()用法細節分析

  • 通過React.createRef → ref對象
  • 通過元素的ref屬性可以附加到React元素上
  • 一般通過構造器中給this的屬性賦值一個ref,方便整個組件使用
  • ref只要傳遞到react元素中,就可以利用ref的current屬性訪問到該真實DOM節點
  • ref在componentDidMount和componentDidUpdate觸發前更新

current里是null的現象

  • 由于打印時,this.modalRef才剛剛聲明,current是null,但是current是個引用值,展開時訪問的是最后的結果
class Modal extends React.Component {constructor(props) {super(props)this.modalRef = React.createRef()console.log('剛創建時', this.modalRef)}componentDidMount() {console.log('componentDidMount', this.modalRef)}componentDidUpdate() {console.log('componentDidUpdate', this.modalRef)}render() {return (<divref={this.modalRef}style={{width: '300px',border: '1px solid #000',display: this.props.toOpen ? 'block' : 'none'}}><h1>This is a Modal</h1><p>This is a super Modal</p></div>)}
}

在這里插入圖片描述

ref有不同的使用方式

  • ref放在html元素上 → current: 真實DOM
  • ref放在class組價上 → current: 組件實例
  • ref放在函數組件(沒有實例)→ 無法附加到組件上
class App extends React.Component {constructor(props) {super(props)this.refInApp = React.createRef()}state = {toOpen: false,}componentDidMount() {console.log('【APP】componentDidMount', this.refInApp)}changeStatus = (toOpen) => {this.setState({toOpen})}render() {return (<><Modal toOpen={this.state.toOpen} ref={this.refInApp} /><button onClick={() => this.changeStatus(true)}>打開</button><button onClick={() => this.changeStatus(false)}>關閉</button></>)}
}

在這里插入圖片描述

函數組件使用hooks獲取dom實例

function Test() {const divRef = React.useRef(null)React.useEffect(() => {console.log('函數組件使用hooks獲取ref', divRef)}, [])return (<div ref={divRef}>Test函數組件</div>)
}

在這里插入圖片描述

  • 若試圖在函數組價上傳ref屬性會告警
<Test ref={this.refInApp} />

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250840.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250840.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250840.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

對于下一代互聯網的暢想

去中心化 每臺客戶機都將成為服務器, 爭取對資源的充分利用 顯示屏化 運算功能交給云服務器, 每臺客戶機的主要任務是顯示 交互 聯網而不是進行運算, 爭取對資源的盡可能節省 優點 可以大大降低客戶機的成本, 減少資源的浪費, 而且使客戶機之間的區別變得更小(因為都主要負責顯…

npm install mysql --save-dev

npm install X: 會把X包安裝到node_modules目錄中不會修改package.json之后運行npm install命令時&#xff0c;不會自動安裝Xnpm install X –save: 會把X包安裝到node_modules目錄中 會在package.json的dependencies屬性下添加X 之后運行npm install命令時&#xff0c;會自動…

dart --- 環境配置

1.進入官網下載SDK http://www.gekorm.com/dart-windows/ 2.運行下載的EXE文件.下一步下一步… 3.打開小黑框,輸入: dart --version VSCode關于Dart的插件: DartCode Runner 插件安裝好后,需重啟VSCode. 新建 index.dart,輸入以下代碼 main () {print("Hello Dart…

Shiro 登錄、退出、校驗是否登錄涉及到的Session和Cookie

前提 我們的使用的是DefaultWebSessionManager而不是ServletContainerSessionManager。這就意味著前者的session為Shiro的&#xff0c;后者的session為Tomcat的。 登錄 DefaultWebSessionManager調用start()方法(在AbstractNativeSessionManager中)創建Session&#xff08;Simp…

25 Refs轉發機制與在高階組件中的使用

將子節點的ref暴露給父節點 16.3以上 Refs轉發&#xff0c;將ref自動通過組件傳遞給子組件 1. 在父組件創建ref對象 2. 給子組件賦值ref 3. 通過React.forward向子組件轉發ref屬性 4. 父組件的ref對象指向子組件dom 5. ref參數只有在 React.forwardRef 組件內定義時可接受con…

26 JSX深度剖析與使用技巧

React對JSX的處理 React.createElement有三個參數&#xff1a;標簽類型&#xff0c;屬性集合&#xff0c;子元素 JSX其實是React.createElement函數調用的語法糖 JSX → 編譯 → React.createElement調用形式 class App extends React.Component {render() {return (<div cl…

javascript --- 數組實用小技巧

一個數組:[a,b,c,d,e],希望滿足以下2個條件: 1.當索引在第0個位置的時候,數組為[b,c,d,e],在第1個位置的時候,數組為[a,c,d,e] … 2.若索引i 和 索引 j 的值相等,則只執行1次. 效果如下: nums [1,2,3,4] nums [1,1,1,2,2,3,4] 實現如下: let nums [1,1,1,2,2,3,4]; let le…

Http的持久連接和管線化

【要點】 1. 什么是持久連接&#xff1f; 2. 什么是管線化&#xff1f; 【總結】 1.什么是持久連接&#xff1f; (keep alive模式) HTTP1.1規定了默認保持長連接&#xff08;HTTP persistent connection &#xff0c;也有翻譯為持久連接&#xff09;;數據傳輸完成了保持TCP連接…

Hexo 版本

Mac hexo s 啟動Hexo服務報錯如下&#xff1a; Error: The module /usr/local/lib/node_modules/hexo-cli/node_modules/.0.8.0dtrace-provider/build/Release/DTraceProviderBindings.node was compiled against a different Node.js version using NODE_MODULE_VERSION 48. T…

dart --- 簡單的閉包

首先得明白下面2點: 全局變量的特點:常駐內存,污染全局變量局部變量的特點:會被垃圾回收機制回收,不會污染作用域… // 閉包.dart void main(){myClosure(){var a 0; // a是一個局部變量.函數執行完畢后將被清理return (){a;print(a);};}var fn myClosure();fn();fn();fn()…

27 JSX函數子元素的應用與思考

JSX的props.children和props本身有部分一致的特性 props.children可以傳遞任何類型的子元素 // 調用子元素回調 num 次&#xff0c;來重復生成組件 function Repeat(props) {// 返回一組JSXlet items [];for (let i 0; i < props.num; i) {items.push(props.children(i));…

Python學習day12(生成器,列表/生成器推導式)

Python學習day12(生成器&#xff0c;列表/生成器推導式) 生成器 初始生成器 我們知道的迭代器有兩種&#xff1a;一種是調用方法直接返回的&#xff0c;一種是可迭代對象通過執行iter方法得到的&#xff0c;迭代器有的好處是可以節省內存。 如果在某些情況下&#xff0c;我們也…

Cascader 級聯選擇器

當一個數據集合有清晰的層級結構時&#xff0c;可通過級聯選擇器逐級查看并選擇。 基礎用法 有兩種觸發子菜單的方式 只需為 Cascader 的options屬性指定選項數組即可渲染出一個級聯選擇器。 通過expand-trigger可以定義展開子級菜單的觸發方式。 本例還展示了change事件&#…

es6 --- String.prototype.padStart

從實際出發理解. 首先看下面代碼 // js var dt new Date(); console.log(dt);下面想把時間格式化,寫一個dateFormat函數 // js function dateFormat(data){var dt new Date(data);var y dt.getFullYear();var m dt. getMonth() 1;var d dt.getDate();var hh dt.getHo…

1 redux初探、用react開發數值增值案例

含義 Redux是專門用作狀態管理的js庫&#xff0c;不是react插件庫可以用在react、angular、vue等項目中能集中式管理react應用中多個組件共享的狀態 使用 npx create-react-app redux1 cnpm install redux -S關鍵字 storereduceractionsubscribe 案例 1. 創建store、并傳…

Python學習筆記_1_基礎_2:數據運算、bytes數據類型、.pyc文件(什么鬼)

Python學習筆記_1_基礎_2&#xff1a;數據運算、bytes數據類型、.pyc文件&#xff08;什么鬼&#xff09; 一、數據運算 Python數據運算感覺和C&#xff0c;Java沒有太大的差異&#xff0c;百度一大堆&#xff0c;這里就不想寫了。比較有意思的是三元運算&#xff0c;記得C和Ja…

LeetCode 8. String to Integer (atoi)

問題鏈接 LeetCode 8. String to Integer (atoi) 題目解析 字符串轉換成數字。 解題思路 個人認為題目并沒有完全講清楚題意。最初以為需要考慮多種情況&#xff0c;小數啊指數啊什么的&#xff0c;后面發現不是這樣的&#xff0c;這題只要關注字符數字問題以及范圍問題。 1.跳…

javascript --- 實戰中體會jsonp

準備:1.需要node環境,node環境配置 -> 百度搜索 “node環境配置” (網上太多了) node是否安裝成功指令如下: 創建如下頁面結構: html結構如下: // jsonp.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8">…

2 中間件的使用、異步action的創建

react-redux是react插件 將所有組件分成兩大類&#xff1a;UI組件和容器組件 安裝npm install react-redux -S UI組件&#xff1a; 只負責UI的呈現&#xff0c;不帶有任何業務邏輯不使用this.state所有數據都由this.props提供不使用任何Redux的API&#xff0c;不需要使用store …

PHP數組函數

整理了一份PHP開發中數組操作大全&#xff0c;包含有數組操作的基本函數、數組的分段和填充、數組與棧、數組與列隊、回調函數、排序、計算、其他的數組函數等。 一、數組操作的基本函數 數組的鍵名和值 array_values($arr); 獲得數組的值array_keys($arr); 獲得數組的鍵名ar…