首頁 > 軟體

React中父子元件通訊詳解

2022-08-28 18:00:27

父元件向子元件通訊

在父元件中,為子元件新增屬性資料,即可實現父元件向子元件通訊。傳遞的資料可以分成兩類

子元件是作為屬性來接收這些資料的

第一類就是資料:變數,物件,屬性資料,狀態資料等等

這些資料發生改變,子元件接收的屬性資料就發生了改變。

第二類就是方法:父元件可以向子元件傳遞屬性方法,子元件接收方法,並可以在元件內執行,有兩種執行方式

注意:父元件傳給子元件的方法是不能執行的,執行了相當於將方法的返回值傳遞給子元件。

第一種 作為事件回撥函數執行

引數預設就是事件物件

this預設指向undefined,因此我們要改變this指向

如果在子元件中改變,

this指向子元件

bind方式傳遞的引數在事件物件之前

如果在父元件中改變(​​工作中常用​​)

this指向父元件了

此時子元件不論如何繫結,都指向父元件

bind方式傳遞的引數會在子元件傳遞的引數之前

引數順序:父元件引數,子元件引數,事件物件

第二種 在子元件方法中執行

預設沒有引數,使用什麼可以傳遞什麼

this預設指向子元件屬性物件(this.props)

此時我們要在父元件中繫結this,就指向了父元件

我們既可以存取父元件範例化物件,也可以存取子元件範例化物件,

我們既可以在子元件中傳遞引數,也可以在父元件中傳遞引數

有一種簡寫方式(​​工作中常用​​)

直接在事件回撥函數中,定義箭頭函數,並執行父元件方法:

// 定義父元件slider
class Slider extends Component {
// 建構函式
constructor(props) {
super(props);
// 初始化狀態
this.state = {
title: '返回頂部'
}
}
// 父元件方法
parentMethod() {
console.log(this, arguments)
}
render() {
return (
<div className="slider">
{/*字串*/}
{/*<GoTop text="網址導航"></GoTop>*/}
{/*屬性資料*/}
{/*<GoTop text={this.props.title}></GoTop>*/}
{/*狀態資料*/}
{/*<GoTop text={this.state.title}></GoTop>*/}
{/*傳遞方法*/}
<GoTop text={this.state.title} method={this.parentMethod.bind(this, 200, 'parent')}></GoTop>
{/*<GoTop text={this.state.title} method={this.parentMethod}></GoTop>*/}
</div>
)
}
}
// 定義元件
class GoTop extends Component {
// 定義方法
childMethod(e) {
// 執行父元件方法
this.props.method(200, e);
}
// 4 渲染虛擬DOM
render() {
// console.log(this.props)
// 繫結事件
// return <span onClick={this.props.method.bind(this, 100, 'child')}>{this.props.text}</span>
// 在子元件方法中執行
// return <span onClick={this.childMethod.bind(this)}>{this.props.text}</span>
// 簡便寫法
return <span onClick={e => this.props.method(e)}>{this.props.text}</span>
}
}

存在期

元件建立完成,一旦屬性資料或者狀態資料發生改變,元件就會進入存在期,共分五個階段

第一個階段 元件即將接收新的屬性資料

componnetWillReceiveProps方法

第一個參數列示​​新的​​屬性資料

元件範例化物件上的是舊的屬性資料

資料還沒有更新,

​只有當屬性資料發生改變,才會執行該方法,狀態資料改變不會執行​​,直接進入第二個階段

作用:用屬性資料去更新狀態資料,實現資料由外部流入內部

第二個階段 元件是否應該更新

shouldComponentUpdate方法

第一個參數列示​​新的​​屬性資料

第二個參數列示​​新的​​狀態資料

元件範例化物件上的是舊的屬性資料

元件範例化物件上的是舊的狀態資料

必須有返回值,表示是否可以更新

true 可以更新

false 不能更新

工作中,我們常常比較

引數中的屬性資料是否與元件範例化物件中屬性資料是否不相等,或者

引數中的狀態資料是否與元件範例化物件中狀態資料是否不相等

作用:啟動更新優化的作用,常常在高頻事件中使用。(類似節流作用)

第三個階段 元件即將更新

componentWillUpdate方法:

  • 第一個參數列示​​新的​​屬性資料
  • 第二個參數列示​​新的​​狀態資料

元件範例化物件上的是舊的屬性資料

元件範例化物件上的是舊的狀態資料

說明此時資料仍然沒有更新,當該方法執行完畢,資料才會更新

作用:更新外掛,預處理資料等等,

注意:不要在第二個階段和第三個階段去更新屬性資料以及裝填資料

第四個階段 元件渲染檢視

render 方法

沒有引數,但是此時資料已經更新了

  • 元件範例化物件上的是​​新的​​屬性資料
  • 元件範例化物件上的是​​新的​​狀態資料

所以我們在渲染虛擬DOM的時候,可以使用這些新的資料了

此時虛擬DOM還沒有更新,方法執行完畢,虛擬DOM才更新

第五個階段 元件更新完成

componentDidUpdate方法:

  • 第一個引數是舊的屬性資料
  • 第二個引數是舊的狀態資料

元件範例化物件上的是​​新的​​屬性資料

元件範例化物件上的是​​新的​​狀態資料

此時虛擬DOM也已經更新完成了

元件更新完成了,我們可以在這個階段傳送請求,處理事件等等,該方法執行完畢,並沒有說明存在期的結束,存在期仍然繼續,只是一次更新的結束,所有元件生命週期方法this都指向元件範例化物件

// 定義元件
class GoTop extends Component {
// 建構函式
constructor(props) {
super(props);
this.state = {
text: props.text
}
}
// 存在期五個階段
// 1 元件即將接收新的屬性資料
componentWillReceiveProps(newProps) {
console.log(111, 'componentWillRecieveProps', newProps, this.props)
// 將屬性資料,儲存到狀態中
this.setState({ text: newProps.text })
}
// 2 元件是否更新
shouldComponentUpdate(newProps, newState) {
console.log(222, 'shouldComponentUpdate', newProps, this.props, 'state', newState, this.state)
// 是否可以更新
// return true;
// 根據屬性或者狀態的改變來優化
return newProps.text !== this.props.text || newState.text !== this.state.text
}
// 3 元件即將更新
componentWillUpdate(newProps, newState) {
console.log(333, 'componentWillUpdate', newProps, this.props, 'state', newState, this.state, findDOMNode(this).innerHTML)
}
// 4 渲染虛擬DOM
render() {
console.log(444, 'render', this.props, 'state', this.state)
// return <span>{this.props.text}</span>
return <span>{this.state.text}</span>
}
// 5 元件更新完成
componentDidUpdate(oldProps, oldState) {
console.log(555, 'componentDidUpdate', oldProps, this.props, 'state', oldState, this.state, findDOMNode(this).innerHTML)
}
// 元件建立完成
componentDidMount() {
window.onscroll = () => {
// 移動超過300顯示返回頂部
if (window.scrollY > 300) {
this.setState({
text: '返回頂部'
})
} else {
// 顯示頭條新聞
this.setState({
text: '頭條新聞'
})
}
// console.log(window.scrollY)
}
}
}

到此這篇關於React中父子元件通訊詳解的文章就介紹到這了,更多相關React元件通訊內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com