React實現(xiàn)父組件調(diào)用子組件的兩種寫法
前言
react通信分很多種,比如:父子通信,兄弟通信等等。這里我們就簡單說一下父子通信,父子通信分為:父組件調(diào)用子組件里面的方法;子組件調(diào)用子組件里面的方法。子調(diào)父一個porps就可以解決了,這里我們著重說一下父組件調(diào)用子組件。廢話不多說,直接上代碼:
函數(shù)式寫法:
方法一:
child.js
import React, { useImperativeHandle, forwardRef } from "react"; function Child(props, ref) { useImperativeHandle(ref, () => { return { onClick: handleClick, } }); const handleClick = () => { alert('點擊了'); } return ( <button>我是按鈕</button> ) } export default forwardRef(Child);
index.js
import React, { useRef } from "react"; import Child from './child'; function Calling() { const nRef = useRef(); const handleClick = () => { nRef.current.onClick(); } return ( <div> <button onClick={handleClick}>點擊后調(diào)用子組件</button> <Child ref={nRef} /> </div> ) } export default Calling;
父調(diào)子通過ref,簡單來說:使用鉤子函數(shù)將子組件自定義的方法綁定到ref.current上面。這里用到了三個鉤子:useRef、useImperativeHandle, forwardRef。
1.useRef:父組件使用useRef通過參數(shù)(這里的參數(shù)命名必須為ref)傳遞給子組件
2.useImperativeHandle:將子組件自定義的函數(shù)添加到父組件的ref上,注意這里,第一個參數(shù)為ref,第二個參數(shù)為對象(也就是父組件中調(diào)用的方法或者要取得屬性或者值)。
3.forwardRef:將引用的ref傳遞給子組件,這時子組件接收到的第一個參數(shù)是porps,第二個參數(shù)是ref。
上面因為傳遞給子組件的參數(shù)為ref關(guān)鍵字,所以子組件里必須要有接收的方法。
方法二:
child.js
import React from "react"; function Child(props) { const handleClick = () => { alert('點擊了'); } props.nref = { onClick: handleClick, } return ( <button>我是按鈕</button> ) } export default Child;
index.js
import React from "react"; import Child from './child'; function Calling() { const nRef = {}; const handleClick = () => { nRef.onClick(); } return ( <div> <button onClick={handleClick}>點擊后調(diào)用子組件</button> <Child nref={nRef} /> </div> ) } export default Calling;
index.js(解法二)
import React, { useRef } from "react"; import Child from './child'; function Calling() { const nRef = useRef(); const handleClick = () => { nRef.onClick(); } return ( <div> <button onClick={handleClick}>點擊后調(diào)用子組件</button> <Child nref={nRef} /> </div> ) } export default Calling;
大家這里注意看方法二的兩個index.js文件差異性,無非就是將空對象換成了useRef,為什么要這樣寫呢,這樣寫有什么優(yōu)點嗎?當(dāng)代碼量一樣的時候,大家就應(yīng)該思考一件事情:性能。當(dāng)然,哪個性能好就選擇哪個,我對方法二的這兩個index文件做了一下對比(實際上就是空對象和useRef的比較),空對象就不用解釋過多了:引用類型...;我們著重解釋一下useRef:可以幫我們緩存數(shù)據(jù),返回一個ref對象,里面的ref.current是用來存儲數(shù)據(jù)的,返回的ref對象不會被重新創(chuàng)建(言外之意就是他爸爸無論渲染多少次,這個對象指向地址永遠只有最原始的那個),這里值的變化不會引起組件的重新render,組件不會因為狀態(tài)的更新而更新(也就是說,組件狀態(tài)改變了,這里可以保存改變的狀態(tài)),如果只想要保存狀態(tài),不影響視圖更新,并且可以同步獲取和更新狀態(tài)的話,建議使用useRef。
大家想一想,如果他爺爺不斷渲染,使用 const nRef = {};是不是就會不斷的給nRef賦新的地址,之前的地址只有經(jīng)過一段時間的不使用才會被垃圾回收機制(不懂垃圾回收機制的去翻翻哈)釋放掉;而useRef無論他爺爺渲染多少遍,它的地址最終只有一個。
類組件寫法:
方法一:
child.js
import React , { Component } from "react" class Child extends Component { handleClick = () => { alert('點擊了'); } render(){ return (<div>子組件</div>); } }
index.js
class Parent extends Component { constructor(props) { super(props); this.Child = React.createRef(); } handleOnClick = ()=>{ this.Child.current.handleClick(); } render(){ return (<div> <button onClick={this.handleOnClick}>click</button> <Child ref={this.Child}></Child> </div>); } }
方法二:
child.js
import React , { Component } from "react" class Child extends Component { componentDidMount(){ this.props.onRef && this.props.onRef(this); } handleClick = () => { alert('點擊了'); } render(){ return (<div>子組件</div>); } }
index.js
class Parent extends Component { handleOnClick = ()=>{ this.Child.current.handleClick(); } render(){ return (<div> <button onClick={this.handleOnClick}>click</button> <Child onRef={ data => this.Child = data }></Child> </div>); } }
對比一下類組件的兩個方法:
方法一:簡單易懂,缺點就是:如果子組件中嵌套了高階組件,那么就無法指向真實的子組件
方法二:寫法更簡單易懂,粗暴,缺點就是:需要自定義props屬性
這里其實還有一個方法三,思路:大家可以利用高階組件+反向繼承實現(xiàn)。
到此這篇關(guān)于React實現(xiàn)父組件調(diào)用子組件的兩種寫法的文章就介紹到這了,更多相關(guān)React父調(diào)子內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
react koa rematch 如何打造一套服務(wù)端渲染架子
這篇文章主要介紹了react koa rematch 如何打造一套服務(wù)端渲染架子,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06React css-in-js基礎(chǔ)介紹與應(yīng)用
隨著React、Vue等支持組件化的MVVM前端框架越來越流行,在js中直接編寫css的技術(shù)方案也越來越被大家所接受。為什么前端開發(fā)者們更青睞于這些css-in-js的方案呢,下面帶你了解它2022-09-09在 React 項目中使用 Auth0 并集成到后端服務(wù)的配置步驟詳解
這篇文章主要介紹了在 React 項目中使用 Auth0 并集成到后端服務(wù)的配置步驟詳解,通過本文詳細步驟,您可以將 Auth0 集成到 React 項目并與后端服務(wù)交互,需要的朋友可以參考下2024-07-07解決React報錯Functions are not valid as 
這篇文章主要為大家介紹了React報錯Functions are not valid as a React child解決詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12用React實現(xiàn)一個完整的TodoList的示例代碼
本篇文章主要介紹了用React實現(xiàn)一個完整的TodoList的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10React Native中WebView與html雙向通信遇到的坑
這篇文章主要介紹了React Native中WebView與html雙向通信的一些問題,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01