詳解React中組件之間通信的方式

一、是什麼

我們將組件間通信可以拆分為兩個詞:

  • 組件
  • 通信

回顧Vue系列的文章,組件是vue中最強大的功能之一,同樣組件化是React的核心思想

相比vueReact的組件更加靈活和多樣,按照不同的方式可以分成很多類型的組件

而通信指的是發送者通過某種媒體以某種格式來傳遞信息到收信者以達到某個目的,廣義上,任何信息的交通都是通信

組件間通信即指組件通過某種方式來傳遞信息以達到某個目的

二、如何通信

組件傳遞的方式有很多種,根據傳送者和接收者可以分為如下:

  • 父組件向子組件傳遞
  • 子組件向父組件傳遞
  • 兄弟組件之間的通信
  • 父組件向後代組件傳遞
  • 非關系組件傳遞

父組件向子組件傳遞

由於React的數據流動為單向的,父組件向子組件傳遞是最常見的方式

父組件在調用子組件的時候,隻需要在子組件標簽內傳遞參數,子組件通過props屬性就能接收父組件傳遞過來的參數

function EmailInput(props) {
  return (
    <label>
      Email: <input value={props.email} />
    </label>
  );
}

const element = <EmailInput email="[email protected]" />;

子組件向父組件傳遞

子組件向父組件通信的基本思路是,父組件向子組件傳一個函數,然後通過這個函數的回調,拿到子組件傳過來的值

父組件對應代碼如下:

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中組件之間通信的方式的文章就介紹到這瞭,更多相關React組件之間通信內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: