您好,登錄后才能下訂單哦!
本篇內容介紹了“React中組件之間通信的方式是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
我們將組件間通信可以拆分為兩個詞:
組件
通信
回顧Vue系列的文章,組件是vue
中最強大的功能之一,同樣組件化是React
的核心思想
相比vue
,React
的組件更加靈活和多樣,按照不同的方式可以分成很多類型的組件
而通信指的是發送者通過某種媒體以某種格式來傳遞信息到收信者以達到某個目的,廣義上,任何信息的交通都是通信
組件間通信即指組件通過某種方式來傳遞信息以達到某個目的
組件傳遞的方式有很多種,根據傳送者和接收者可以分為如下:
父組件向子組件傳遞
子組件向父組件傳遞
兄弟組件之間的通信
父組件向后代組件傳遞
非關系組件傳遞
父組件向子組件傳遞
由于React
的數據流動為單向的,父組件向子組件傳遞是最常見的方式
父組件在調用子組件的時候,只需要在子組件標簽內傳遞參數,子組件通過props
屬性就能接收父組件傳遞過來的參數
function EmailInput(props) { return ( <label> Email: <input value={props.email} /> </label> ); } const element = <EmailInput email="123124132@163.com" />;
子組件向父組件傳遞
子組件向父組件通信的基本思路是,父組件向子組件傳一個函數,然后通過這個函數的回調,拿到子組件傳過來的值
父組件對應代碼如下:
class Parents extends Component { constructor() { super(); this.state = { price: 0 }; } getItemPrice(e) { this.setState({ price: e }); } render() { return ( <div> <div>price: {this.state.price}</div> {/* 向子組件中傳入一個函數 */} <Child getPrice={this.getItemPrice.bind(this)} /> </div> ); } }
子組件對應代碼如下:
class Child extends Component { clickGoods(e) { // 在此函數中傳入值 this.props.getPrice(e); } render() { return ( <div> <button onClick={this.clickGoods.bind(this, 100)}>goods1</button> <button onClick={this.clickGoods.bind(this, 1000)}>goods2</button> </div> ); } }
兄弟組件之間的通信
如果是兄弟組件之間的傳遞,則父組件作為中間層來實現數據的互通,通過使用父組件傳遞
class Parent extends React.Component { constructor(props) { super(props) this.state = {count: 0} } setCount = () => { this.setState({count: this.state.count + 1}) } render() { return ( <div> <SiblingA count={this.state.count} /> <SiblingB onClick={this.setCount} /> </div> ); } }
父組件向后代組件傳遞
父組件向后代組件傳遞數據是一件最普通的事情,就像全局數據一樣
使用context
提供了組件之間通訊的一種方式,可以共享數據,其他數據都能讀取對應的數據
通過使用React.createContext
創建一個context
const PriceContext = React.createContext('price')
context
創建成功后,其下存在Provider
組件用于創建數據源,Consumer
組件用于接收數據,使用實例如下:
Provider
組件通過value
屬性用于給后代組件傳遞數據:
<PriceContext.Provider value={100}>
</PriceContext.Provider>
如果想要獲取Provider
傳遞的數據,可以通過Consumer
組件或者或者使用contextType
屬性接收,對應分別如下:
class MyClass extends React.Component { static contextType = PriceContext; render() { let price = this.context; /* 基于這個值進行渲染工作 */ } }
Consumer組件:
<PriceContext.Consumer> { /*這里是一個函數*/ } { price => <div>price:{price}</div> } </PriceContext.Consumer>
非關系組件傳遞
如果組件之間關系類型比較復雜的情況,建議將數據進行一個全局資源管理,從而實現通信,例如redux
。關于redux
的使用后續再詳細介紹
由于React
是單向數據流,主要思想是組件不會改變接收的數據,只會監聽數據的變化,當數據發生變化時它們會使用接收到的新值,而不是去修改已有的值
因此,可以看到通信過程中,數據的存儲位置都是存放在上級位置中
“React中組件之間通信的方式是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。