中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

React父子組件間的通信是如何進行的

發布時間:2023-03-14 11:31:56 來源:億速云 閱讀:140 作者:iii 欄目:開發技術

本篇內容介紹了“React父子組件間的通信是如何進行的”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

父子組件通信方式

(1)傳遞數據(父傳子)與傳遞方法(子傳父)

(2)ref標記(父組件拿到子組件的引用,從而調用子組件的方法)

父傳子

使用 props屬性,傳入props

this.props.數據

//父組件
 <Field label="用戶名"></Field>
//子組件
 <label>{this.props.label}</label>

子傳父

父組件向子組件傳一個函數,然后通過子組件中這個函數的回調,拿到子組件穿過的值

this.props.函數名()

//子組件
<input onChange={(evt)=>{
   this.props.onChangeEvent(evt.target.value)
}}></input>
//父組件
 <Field onChangeEvent={(value)=>{
    console.log(value)
 }}></Field>

ref標記(傳遞數據)

在組件身上綁定ref,直接通過 this.username.current 獲得整個組件,this.username.current.state獲得子組件內state數據

this.ref名.current

//子組件中
 state={
     value:''
 }
 <input onChange={(evt)=>{
   this.setState({
       value:evt.target.value
   })
}}></input>
//父組件
username = React.createRef()
<Field ref={this.username}></Filed>
....
console.log(this.username.current.state.value)

父組件中清除子組件的值:在子組件中定義修改state函數,父組件中調用此函數來實現

clear(){
    this.setState({
        value:''
    })
}
 <input value={this.state.value}></input>
....................
this.username.current.clear()//父

非父子組件通信方式

狀態提升(兄弟通信)

React中的狀態提升概括來說,就是將多個組件需要共享的狀態提升到它們最近的父組件上,在父組件上改變這個狀態然后通過props分發給子組件

React父子組件間的通信是如何進行的

發布訂閱模式

兄弟組件AB,子組件A將值傳給B組件,在子組件A中發布,在子組件B中訂閱,,此方法適合任意關系的通信

React父子組件間的通信是如何進行的

調度中心bus:

var bus={
	list:[],//放入所有的訂閱
	//訂閱
    subscribe(callback){
         this.list.push(callback)
        //callback為注冊訂閱的回調函數
    }
	//發布
	publish(){
    }
}

1.訂閱消息

//創建訂閱的回調函數
subscribe(callback){
   console.log(callback);
   this.list.push(callback)
}
//訂閱者
bus.subscribe((value)=>{
    console.log(111,value);
})
bus.subscribe((value)=>{
    console.log(222,value);
})

2.發布消息

//創建bus(調度中心)中的發布函數
publish(text){
        //遍歷所有的list,將回調函數執行
        // console.log(this.list);
        this.list.forEach(callback=>{
            callback && callback(text)
        })
    }
//發布者
setTimeout(()=>{
    bus.publish('沉默')
},0)

bus.publish調用時,傳入參數,觸發bus中publish函數并接收到數據即text,調用callback回調函數,傳入text,此時調用者subscribe將收到參數為value,即將組件A數據傳入組件B中

context狀態樹傳參(跨組件方案)

Context 提供了一種在組件之間共享此類值的方式,是“全局”的數據,而不必顯式地通過組件樹的逐層傳遞 props。

context上下文對象來管理公共狀態,來實現數據的修改

1.創建context對象

const GlobalContext = React.createContext()

2.創建提供數據的父組件Provider

給Provider組件設置value屬性,需要傳遞到后代組件中的數據作為value的值

當Provider發生數據value變更時,會觸發到Consumer發生渲染,所有被其包裹的子組件都會發生渲染(render被調用)

//格式
state={
    info:'111'
}
render(){
    return(
        <GlobalContext.Provider value={{
        	//key:value或key:函數
        }}>
        	<div>父組件內容</div>
        </GlobalContext.Provider>
    )
}

3.創建接受數據的子孫組件Consumer

//格式
render(){
     return(
       <GlobalContext.Consumer>
        {
            (value)=>{
                return(
                    <div onClick={()=>{
                       
                      }}>
                    </div>
                )
            }
        }
       </GlobalContext.Consumer>
    )
}

4.在子孫組件A中調用Provider中的回調函數

某些時候需要內部組件去更新Context的數據,只需要向上下文添加回調函數即可

//子組件A中  調用回調函數,傳遞數據
value.chageInfo(synopsis)
//父組件
state={
        info:111
}
......................................
<GlobalContext.Provider value={{
     "name":"說名字",
     "info":this.state.info,
     chageInfo:(content)=>{
         this.setState({
             info:content
         })
     }
}}>

全局定義狀態,并修改狀態

5.子孫組件B中接收Provider的數據

 <GlobalContext.Consumer>
        {
            (value)=><div className="filmDetail">
                //接受Provider的數據
                    detail-{value.info}
                </div>
        }
 </GlobalContext.Consumer>

實現了將組件A的值傳給了組件B的值

React插槽

作用:為了復用;一定程度減少父子通信

children實現插槽

在React組件中直接包裹一些html標簽,html標簽內容是否會出現呢?

<Child>
    <div>111</div>
    <div>22</div>
    <div>333</div>
</Child>

React父子組件間的通信是如何進行的

由上圖可見,被包裹的html標簽并未被渲染出來,這是因為當讀取到Child組件時,會重新渲染頁面覆蓋被包裹的html標簽;而我們可以在Child組件中留下html標簽的位置,以便來顯示被包裹的html,這種做法即為 插槽

語法

使用props的固定屬性children在Child組件中占位

this.props.children
//該屬性中包含子組件標簽開始到結束之間的內容

父組件的子組件標簽中寫入要插入到子組件的html標簽

export default class App extends Component {
  render() {
    return (
      <div>
        <Child>
            <div>111</div>
            <div>22</div>
            <div>333</div>
        </Child>
      </div>
    )
  }
}

在子組件中放入該標簽

class Child extends Component{
    render(){
        return(
            <div>
                child
                 {this.props.children}
            </div>
        )
    }
}

多個元素的children

如果children中有多個元素,那么children為一個數組,數組中放著所有存放的內容

//父組件
<Child>
            <div>111</div>
            <div>22</div>
            <div>333</div>
</Child>
//子組件
<div>
    child
    <h4>以下獲得所有內容</h4>
     {this.props.children}
     <h4>以下獲得數組其中的元素</h4>
     {this.props.children[1]}
</div>

React父子組件間的通信是如何進行的

注意:以上方法實現了 可以通過被 插槽的內容來直接操作父組件,以此給子組件傳遞數據(被 插入的內容連同數據一起插入子組件中)。

“React父子組件間的通信是如何進行的”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

玉树县| 南靖县| 台湾省| 昌平区| 安龙县| 盖州市| 辽宁省| 柏乡县| 周口市| 长治县| 衡南县| 晋江市| 武定县| 蛟河市| 濮阳县| 鲁山县| 林周县| 泸定县| 普安县| 五华县| 平昌县| 兴海县| 合水县| 若尔盖县| 大关县| 竹山县| 汕头市| 乌拉特后旗| 周口市| 静海县| 东明县| 汽车| 鹤峰县| 晋城| 滨州市| 张家川| 泸溪县| 兴安盟| 双柏县| 温宿县| 瑞昌市|