成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

[[409233]]

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

一、是什么

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

  • 組件
  • 通信

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

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

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

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

二、如何通信

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

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

父組件向子組件傳遞

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

父組件在調(diào)用子組件的時候,只需要在子組件標(biāo)簽內(nèi)傳遞參數(shù),子組件通過props屬性就能接收父組件傳遞過來的參數(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" />; 

子組件向父組件傳遞

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

父組件對應(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.         {/* 向子組件中傳入一個函數(shù)  */} 
  20.         <Child getPrice={this.getItemPrice.bind(this)} /> 
  21.       </div> 
  22.     ); 
  23.   } 

子組件對應(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.   } 

兄弟組件之間的通信

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

  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ù)都能讀取對應(yīng)的數(shù)據(jù)

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

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

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

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

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

 

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

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

Consumer組件:

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

 

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

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

三、總結(jié)

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

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

參考文獻(xiàn)

 

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

 

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

2021-07-02 07:06:20

React組件方式

2021-07-01 07:51:45

React事件綁定

2024-02-26 14:07:18

2024-03-12 14:36:44

微服務(wù)HTTPRPC

2021-08-02 08:34:20

React性能優(yōu)化

2021-07-06 07:27:45

React元素屬性

2021-07-14 08:00:13

reactCss模塊

2023-02-20 08:08:48

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

2024-04-19 00:00:00

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

2022-03-21 07:35:34

處理方式跨域

2024-03-07 17:21:12

HotSpotJVMHot Code

2025-03-26 01:25:00

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

2021-07-15 07:23:25

React動畫頁面

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容器

2021-09-30 07:57:13

排序算法面試

2021-05-27 05:37:10

HTTP請求頭瀏覽器

2024-05-29 14:34:07

點(diǎn)贊
收藏

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

主站蜘蛛池模板: 岛国av一区二区 | www.黄色片视频 | 日韩伦理电影免费在线观看 | 久久国产激情视频 | 女人一区| 久久久免费电影 | 久久精品毛片 | 国产一区不卡 | 国产黄色网址在线观看 | 国产精品96久久久久久 | 网站黄色在线免费观看 | 欧美中文字幕在线 | 中文字幕在线观看第一页 | 成人影 | 国产成人在线一区二区 | 国产高清在线精品一区二区三区 | 国产欧美视频一区二区三区 | 亚洲大片一区 | 免费在线播放黄色 | 乳色吐息在线观看 | 日本国产一区二区 | 91资源在线| 91麻豆产精品久久久久久夏晴子 | 国产亚韩| avtt国产| 大陆一级毛片免费视频观看 | 日韩色图在线观看 | 精品国产一区二区三区久久狼黑人 | 国产成人精品视频 | 成人亚洲 | 国产一级淫片免费视频 | 超碰97人人人人人蜜桃 | 国产高清一区二区三区 | 在线中文字幕国产 | 蜜桃精品噜噜噜成人av | 国产婷婷精品av在线 | 国产精品伦理一区 | 精品无码久久久久久国产 | 亚洲精品一 | 亚洲在线一区二区 | 精品视频导航 |