自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

面試官:React中組件之間通信的方式有哪些?

網(wǎng)絡(luò) 通信技術(shù)
回顧Vue系列的文章,組件是vue中最強(qiáng)大的功能之一,同樣組件化是React的核心思想,相比vue,React的組件更加靈活和多樣,按照不同的方式可以分成很多類型的組件。

[[409233]]

本文轉(zhuǎn)載自微信公眾號(hào)「JS每日一題」,作者灰灰。轉(zhuǎn)載本文請(qǐng)聯(lián)系JS每日一題公眾號(hào)。

一、是什么

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

  • 組件
  • 通信

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

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

而通信指的是發(fā)送者通過(guò)某種媒體以某種格式來(lái)傳遞信息到收信者以達(dá)到某個(gè)目的,廣義上,任何信息的交通都是通信

組件間通信即指組件通過(guò)某種方式來(lái)傳遞信息以達(dá)到某個(gè)目的

二、如何通信

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

  • 父組件向子組件傳遞
  • 子組件向父組件傳遞
  • 兄弟組件之間的通信
  • 父組件向后代組件傳遞
  • 非關(guān)系組件傳遞

父組件向子組件傳遞

由于React的數(shù)據(jù)流動(dòng)為單向的,父組件向子組件傳遞是最常見(jiàn)的方式

父組件在調(diào)用子組件的時(shí)候,只需要在子組件標(biāo)簽內(nèi)傳遞參數(shù),子組件通過(guò)props屬性就能接收父組件傳遞過(guò)來(lái)的參數(shù)

  1. function EmailInput(props) { 
  2.   return ( 
  3.     <label> 
  4.       Email: <input value={props.email} /> 
  5.     </label> 
  6.   ); 
  7.  
  8. const element = <EmailInput email="123124132@163.com" />; 

子組件向父組件傳遞

子組件向父組件通信的基本思路是,父組件向子組件傳一個(gè)函數(shù),然后通過(guò)這個(gè)函數(shù)的回調(diào),拿到子組件傳過(guò)來(lái)的值

父組件對(duì)應(yīng)代碼如下:

  1. class Parents extends Component { 
  2.   constructor() { 
  3.     super(); 
  4.     this.state = { 
  5.       price: 0 
  6.     }; 
  7.   } 
  8.  
  9.   getItemPrice(e) { 
  10.     this.setState({ 
  11.       price: e 
  12.     }); 
  13.   } 
  14.  
  15.   render() { 
  16.     return ( 
  17.       <div> 
  18.         <div>price: {this.state.price}</div> 
  19.         {/* 向子組件中傳入一個(gè)函數(shù)  */} 
  20.         <Child getPrice={this.getItemPrice.bind(this)} /> 
  21.       </div> 
  22.     ); 
  23.   } 

子組件對(duì)應(yīng)代碼如下:

  1. class Child extends Component { 
  2.   clickGoods(e) { 
  3.     // 在此函數(shù)中傳入值 
  4.     this.props.getPrice(e); 
  5.   } 
  6.  
  7.   render() { 
  8.     return ( 
  9.       <div> 
  10.         <button onClick={this.clickGoods.bind(this, 100)}>goods1</button> 
  11.         <button onClick={this.clickGoods.bind(this, 1000)}>goods2</button> 
  12.       </div> 
  13.     ); 
  14.   } 

兄弟組件之間的通信

如果是兄弟組件之間的傳遞,則父組件作為中間層來(lái)實(shí)現(xiàn)數(shù)據(jù)的互通,通過(guò)使用父組件傳遞

  1. class Parent extends React.Component { 
  2.   constructor(props) { 
  3.     super(props) 
  4.     this.state = {count: 0} 
  5.   } 
  6.   setCount = () => { 
  7.     this.setState({count: this.state.count + 1}) 
  8.   } 
  9.   render() { 
  10.     return ( 
  11.       <div> 
  12.         <SiblingA 
  13.           count={this.state.count
  14.         /> 
  15.         <SiblingB 
  16.           onClick={this.setCount} 
  17.         /> 
  18.       </div> 
  19.     ); 
  20.   } 

父組件向后代組件傳遞

父組件向后代組件傳遞數(shù)據(jù)是一件最普通的事情,就像全局?jǐn)?shù)據(jù)一樣

使用context提供了組件之間通訊的一種方式,可以共享數(shù)據(jù),其他數(shù)據(jù)都能讀取對(duì)應(yīng)的數(shù)據(jù)

通過(guò)使用React.createContext創(chuàng)建一個(gè)context

  1. const PriceContext = React.createContext('price'

context創(chuàng)建成功后,其下存在Provider組件用于創(chuàng)建數(shù)據(jù)源,Consumer組件用于接收數(shù)據(jù),使用實(shí)例如下:

Provider組件通過(guò)value屬性用于給后代組件傳遞數(shù)據(jù):

  1. <PriceContext.Provider value={100}> 
  2. </PriceContext.Provider> 

 

如果想要獲取Provider傳遞的數(shù)據(jù),可以通過(guò)Consumer組件或者或者使用contextType屬性接收,對(duì)應(yīng)分別如下:

  1. class MyClass extends React.Component { 
  2.   static contextType = PriceContext; 
  3.   render() { 
  4.     let price = this.context; 
  5.     /* 基于這個(gè)值進(jìn)行渲染工作 */ 
  6.   } 

Consumer組件:

  1. <PriceContext.Consumer> 
  2.     { /*這里是一個(gè)函數(shù)*/ } 
  3.     { 
  4.         price => <div>price:{price}</div> 
  5.     } 
  6. </PriceContext.Consumer> 

 

非關(guān)系組件傳遞

如果組件之間關(guān)系類型比較復(fù)雜的情況,建議將數(shù)據(jù)進(jìn)行一個(gè)全局資源管理,從而實(shí)現(xiàn)通信,例如redux。關(guān)于redux的使用后續(xù)再詳細(xì)介紹

三、總結(jié)

由于React是單向數(shù)據(jù)流,主要思想是組件不會(huì)改變接收的數(shù)據(jù),只會(huì)監(jiān)聽(tīng)數(shù)據(jù)的變化,當(dāng)數(shù)據(jù)發(fā)生變化時(shí)它們會(huì)使用接收到的新值,而不是去修改已有的值

因此,可以看到通信過(guò)程中,數(shù)據(jù)的存儲(chǔ)位置都是存放在上級(jí)位置中

參考文獻(xiàn)

 

https://react.docschina.org/docs/context.html

 

責(zé)任編輯:武曉燕 來(lái)源: JS每日一題
相關(guān)推薦

2021-07-02 07:06:20

React組件方式

2021-07-01 07:51:45

React事件綁定

2024-02-26 14:07:18

2021-08-02 08:34:20

React性能優(yōu)化

2024-03-12 14:36:44

微服務(wù)HTTPRPC

2021-07-06 07:27:45

React元素屬性

2021-07-14 08:00:13

reactCss模塊

2023-02-20 08:08:48

限流算法計(jì)數(shù)器算法令牌桶算法

2021-07-15 07:23:25

React動(dòng)畫頁(yè)面

2024-04-19 00:00:00

計(jì)數(shù)器算法限流算法

2022-03-21 07:35:34

處理方式跨域

2025-03-26 01:25:00

MySQL優(yōu)化事務(wù)

2024-03-07 17:21:12

HotSpotJVMHot Code

2021-07-08 06:51:29

React函數(shù)組件

2021-06-29 09:47:34

ReactSetState機(jī)制

2021-08-11 08:53:23

Git命令面試

2021-05-10 08:01:12

BeanFactoryFactoryBean容器

2024-05-29 14:34:07

2021-05-27 05:37:10

HTTP請(qǐng)求頭瀏覽器

2021-09-30 07:57:13

排序算法面試
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)