react之組件通信詳解
父組件與子組件通信
- 父組件將自己的狀態(tài)傳遞給子組件,子組件當做屬性來接收,當父組件更改自己狀態(tài)的時候,子組件接收到的屬性就會發(fā)生改變
- 父組件利用ref對子組件做標記,通過調(diào)用子組件的方法以更改子組件的狀態(tài),也可以調(diào)用子組件的方法
父組中定義ref引用
import React,{Component,createRef} from 'react'
import Child1 from './Child1'
export default class App extends Component {
constructor(props){
super(props)
this.child=createRef()
}
render(){
return(
<div>
<Child1 ref={this.child}/>
<button onClick={this.fn.bind(this)}></button>
</div>
)
}
fn(){
const child=this.child.current
child.setTitle()
}
}
子組件定義好數(shù)據(jù)源和修改數(shù)據(jù)源方法
import React,{Component} from 'react'
export default class Child1 extends Component{
state={
title:'標題'
}
render(){
return (
<div>
{this.state.title}
</div>
)
}
setTitle(){
this.setstate({title:'hh'})
}
}
子組件與父組件通信
父組件將自己的某個方法傳遞給子組件,在方法里可以做任意操作,比如可以更改狀態(tài),子組件通過this.props接收到父組件的方法后調(diào)用。
跨組件通信
在react沒有類似vue中的事件總線來解決這個問題,一是我們借助它們共同的父級組件通過代理的方式來實現(xiàn),但過程會相當繁鎖。react提供了Context來實現(xiàn)跨組件通信, 而不必顯式地通過組件樹的逐層傳遞 props。
復(fù)雜的非父子組件通信在react中很難處理,多組件間的數(shù)據(jù)共享也不好處理,在實際的工作中我們會使用flux、redux、mobx來實現(xiàn)
祖先子孫
- 定義store類 導(dǎo)出createContext中的Provider,COnsumer
- 在祖先節(jié)點中發(fā)布消息: Provider value=任意數(shù)據(jù)
- 在子孫節(jié)點中訂閱:Consumer 回調(diào)函數(shù){value=>(組件)}
1.定義數(shù)據(jù)源store
store.js
import React , {createContext} from 'react'
let {Provider,Consumer} = createContext()
export {
Provider,//發(fā)布
Consumer//訂閱
}
2.祖先節(jié)點
import React ,{Component} from 'react'
import {Provider,Consumer} from './store'
import Son from './Son'
export default class App extends Component{
constructor(props){
super(props)
this.state={
name:'mingcen'
}
}
render(){
return (
<div>
<Provider value={this.state.name}>
<Son/>
</Provider>
</div>
)
}
}
3.后代節(jié)點
import React,{Component} from'react'
import {Consumer} from './store'
export default class Son1 extends Component{
constructor(props){
super(props)
this.state={
name:'uuu'
}
}
render(){
return(
<div>
<Consumer>
{
value=>{
<div>{value.name}</div>
}
}
</Consumer>
</div>
)
}
}
兄弟節(jié)點通信
- 一個子物體掛在事件
- 另一個掛在屬性
- 通過實踐改變屬性,來改變另一個組件接受的內(nèi)容
祖先
state={
count:1,
setCount:()=>{
this.setState(state=>{
return{
count:++state.count
}
})
}
}
render(){
let {count,setCount} = this.state
return(
<div>
<Provider value={{count,setCount}}>
<Cmp1></Cmp1>
<Cmp2></Cmp2>
</Provider>
</div>
)
}
兄弟Cmp2
import React, { Component ,createContext} from 'react'
export default class Cmp2 extends Component {
// 只得到了默認數(shù)據(jù) --> 沒有包裹在Provider組件中
static contextType = createContext
render() {
return (
<div>
<button onClick={this.setCount.bind(this)}>自增數(shù)據(jù)</button>
</div>
)
}
setCount() {
this.context.setCount()
}
}
兄弟Cmp1
<Consumer>
{
value => <h3>{value.count}</h3>
}
</Consumer>
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
react-player實現(xiàn)視頻播放與自定義進度條效果
本篇文章通過完整的代碼給大家介紹了react-player實現(xiàn)視頻播放與自定義進度條效果,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2022-01-01
React報錯Type '() => JSX.Element[]&apos
這篇文章主要為大家介紹了React報錯Type '() => JSX.Element[]' is not assignable to type FunctionComponent解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12
利用React高階組件實現(xiàn)一個面包屑導(dǎo)航的示例
這篇文章主要介紹了利用React高階組件實現(xiàn)一個面包屑導(dǎo)航的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-08-08
React.memo函數(shù)中的參數(shù)示例詳解
這篇文章主要為大家介紹了React.memo函數(shù)中的參數(shù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09

