最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React組件通信的實(shí)現(xiàn)示例

 更新時(shí)間:2023年11月13日 08:36:03   作者:寶子向前沖  
在React中,組件通信是一個(gè)重要的概念,它允許不同組件之間進(jìn)行數(shù)據(jù)傳遞和交互,本文主要介紹了React組件通信的實(shí)現(xiàn)示例,感興趣的可以了解一下

組件通信的意義

目標(biāo)任務(wù): 了解為什么需要組件通信

組件是獨(dú)立且封閉的單元,默認(rèn)情況下組件只能使用自己的數(shù)據(jù)(state)

組件化開(kāi)發(fā)的過(guò)程中,完整的功能會(huì)拆分多個(gè)組件,在這個(gè)過(guò)程中不可避免的需要互相傳遞一些數(shù)據(jù)

為了能讓各組件之間可以進(jìn)行互相溝通,數(shù)據(jù)傳遞,這個(gè)過(guò)程就是組件通信

  • 父子關(guān)系 - 最重要的

  • 兄弟關(guān)系 - 自定義事件模式產(chǎn)生技術(shù)方法 eventBus / 通過(guò)共同的父組件通信

  • 其它關(guān)系 - mobx / redux / zustand

父?jìng)髯訉?shí)現(xiàn)

目標(biāo)任務(wù): 實(shí)現(xiàn)父子通信中的父?jìng)髯?,把父組件中的數(shù)據(jù)傳給子組件

實(shí)現(xiàn)步驟

  • 父組件提供要傳遞的數(shù)據(jù) - state

  • 給子組件標(biāo)簽添加屬性值為 state中的數(shù)據(jù)

  • 子組件中通過(guò) props 接收父組件中傳過(guò)來(lái)的數(shù)據(jù)

  • 類組件使用this.props獲取props對(duì)象

    函數(shù)式組件直接通過(guò)參數(shù)獲取props對(duì)象

代碼實(shí)現(xiàn)

 import React from 'react'
 ?
 // 函數(shù)式子組件
 function FSon(props) {
   console.log(props)
   return (
     <div>
       子組件1
       {props.msg}
     </div>
   )
 }
 ?
 // 類子組件
 class CSon extends React.Component {
   render() {
     return (
       <div>
         子組件2
         {this.props.msg}
       </div>
     )
   }
 }
 // 父組件
 class App extends React.Component {
   state = {
     message: 'this is message'
   }
   render() {
     return (
       <div>
         <div>父組件</div>
         <FSon msg={this.state.message} />
         <CSon msg={this.state.message} />
       </div>
     )
   }
 }
 ?
 export default App

props說(shuō)明

目標(biāo)任務(wù): 知道props傳遞時(shí)的一些注意事項(xiàng)

1. props是只讀對(duì)象(readonly)

根據(jù)單項(xiàng)數(shù)據(jù)流的要求,子組件只能讀取props中的數(shù)據(jù),不能進(jìn)行修改

2. props可以傳遞任意數(shù)據(jù)

數(shù)字、字符串、布爾值、數(shù)組、對(duì)象、函數(shù)、JSX

class App extends React.Component {
   state = {
     message: 'this is message'
   }
   render() {
     return (
       <div>
         <div>父組件</div>
         <FSon 
           msg={this.state.message} 
           age={20} 
           isMan={true} 
           cb={() => { console.log(1) }} 
           child={<span>this is child</span>}
         />
         <CSon msg={this.state.message} />
       </div>
     )
   }
 }

子傳父實(shí)現(xiàn)

目標(biāo)任務(wù): 實(shí)現(xiàn)父子通信中的子傳父

口訣: 父組件給子組件傳遞回調(diào)函數(shù),子組件調(diào)用

實(shí)現(xiàn)步驟

  • 父組件提供一個(gè)回調(diào)函數(shù) - 用于接收數(shù)據(jù)

  • 將函數(shù)作為屬性的值,傳給子組件

  • 子組件通過(guò)props調(diào)用 回調(diào)函數(shù)

  • 將子組件中的數(shù)據(jù)作為參數(shù)傳遞給回調(diào)函數(shù)

代碼實(shí)現(xiàn)

import React from 'react'
 ?
 // 子組件
 function Son(props) {
   function handleClick() {
     // 調(diào)用父組件傳遞過(guò)來(lái)的回調(diào)函數(shù) 并注入?yún)?shù)
     props.changeMsg('this is newMessage')
   }
   return (
     <div>
       {props.msg}
       <button onClick={handleClick}>change</button>
     </div>
   )
 }
 ?
 ?
 class App extends React.Component {
   state = {
     message: 'this is message'
   }
   // 提供回調(diào)函數(shù)
   changeMessage = (newMsg) => {
     console.log('子組件傳過(guò)來(lái)的數(shù)據(jù):',newMsg)
     this.setState({
       message: newMsg
     })
   }
   render() {
     return (
       <div>
         <div>父組件</div>
         <Son
           msg={this.state.message}
           // 傳遞給子組件
           changeMsg={this.changeMessage}
         />
       </div>
     )
   }
 }
 ?
 export default App

兄弟組件通信

目標(biāo)任務(wù): 實(shí)現(xiàn)兄弟組件之間的通信

核心思路: 通過(guò)狀態(tài)提升機(jī)制,利用共同的父組件實(shí)現(xiàn)兄弟通信

實(shí)現(xiàn)步驟

  • 將共享狀態(tài)提升到最近的公共父組件中,由公共父組件管理這個(gè)狀態(tài)

    • 提供共享狀態(tài)

    • 提供操作共享狀態(tài)的方法

  • 要接收數(shù)據(jù)狀態(tài)的子組件通過(guò) props 接收數(shù)據(jù)

  • 要傳遞數(shù)據(jù)狀態(tài)的子組件通過(guò)props接收方法,調(diào)用方法傳遞數(shù)據(jù)

代碼實(shí)現(xiàn)

 import React from 'react'
 ?
 // 子組件A
 function SonA(props) {
   return (
     <div>
       SonA
       {props.msg}
     </div>
   )
 }
 // 子組件B
 function SonB(props) {
   return (
     <div>
       SonB
       <button onClick={() => props.changeMsg('new message')}>changeMsg</button>
     </div>
   )
 }
 ?
 // 父組件
 class App extends React.Component {
   // 父組件提供狀態(tài)數(shù)據(jù)
   state = {
     message: 'this is message'
   }
   // 父組件提供修改數(shù)據(jù)的方法
   changeMsg = (newMsg) => {
     this.setState({
       message: newMsg
     })
   }
 ?
   render() {
     return (
       <>
         {/* 接收數(shù)據(jù)的組件 */}
         <SonA msg={this.state.message} />
         {/* 修改數(shù)據(jù)的組件 */}
         <SonB changeMsg={this.changeMsg} />
       </>
     )
   }
 }
 ?
 export default App

跨組件通信Context

目標(biāo)任務(wù): 了解Context機(jī)制解決的問(wèn)題和使用步驟

上圖是一個(gè)react形成的嵌套組件樹(shù),如果我們想從App組件向任意一個(gè)下層組件傳遞數(shù)據(jù),該怎么辦呢?目前我們能采取的方式就是一層一層的props往下傳,顯然很繁瑣

那么,Context 提供了一個(gè)無(wú)需為每層組件手動(dòng)添加 props,就能在組件樹(shù)間進(jìn)行數(shù)據(jù)傳遞的方法

實(shí)現(xiàn)步驟

1- 創(chuàng)建Context對(duì)象 導(dǎo)出 Provider 和 Consumer對(duì)象

 const { Provider, Consumer } = createContext()

2- 使用Provider包裹上層組件提供數(shù)據(jù)

<Provider value={this.state.message}>
     {/* 根組件 */}
 </Provider>

3- 需要用到數(shù)據(jù)的組件使用Consumer包裹獲取數(shù)據(jù)

 <Consumer >
     {value => /* 基于 context 值進(jìn)行渲染 */}
 </Consumer>

代碼實(shí)現(xiàn)

import React, { createContext }  from 'react'
 ?
 // 1. 創(chuàng)建Context對(duì)象 
 const { Provider, Consumer } = createContext()
 ?
 ?
 // 3. 消費(fèi)數(shù)據(jù)
 function ComC() {
   return (
     <Consumer >
       {value => <div>{value}</div>}
     </Consumer>
   )
 }
 ?
 function ComA() {
   return (
     <ComC/>
   )
 }
 ?
 // 2. 提供數(shù)據(jù)
 class App extends React.Component {
   state = {
     message: 'this is message'
   }
   render() {
     return (
       <Provider value={this.state.message}>
         <div className="app">
           <ComA />
         </div>
       </Provider>
     )
   }
 }
 ?
 export default App

到此這篇關(guān)于React組件通信的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)React組件通信內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • 解決antd的Table組件使用rowSelection屬性實(shí)現(xiàn)多選時(shí)遇到的bug

    解決antd的Table組件使用rowSelection屬性實(shí)現(xiàn)多選時(shí)遇到的bug

    這篇文章主要介紹了解決antd的Table組件使用rowSelection屬性實(shí)現(xiàn)多選時(shí)遇到的bug問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • React競(jìng)態(tài)條件Race Condition實(shí)例詳解

    React競(jìng)態(tài)條件Race Condition實(shí)例詳解

    這篇文章主要為大家介紹了React競(jìng)態(tài)條件Race Condition實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 詳解在create-react-app使用less與antd按需加載

    詳解在create-react-app使用less與antd按需加載

    這篇文章主要介紹了詳解在create-react-app使用less與antd按需加載,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • React 18版本配置rem 和 vw的詳細(xì)步驟

    React 18版本配置rem 和 vw的詳細(xì)步驟

    這篇文章主要介紹了React 18版本配置rem 和 vw的詳細(xì)步驟,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • React嵌套組件的構(gòu)建順序

    React嵌套組件的構(gòu)建順序

    這篇文章主要介紹了React嵌套組件的構(gòu)建順序,幫助大家更好的理解和學(xué)習(xí)使用React,感興趣的朋友可以了解下
    2021-04-04
  • React Hooks使用實(shí)戰(zhàn)深度解析

    React Hooks使用實(shí)戰(zhàn)深度解析

    useEffect是React提供的Hook,用于處理副作用操作(如數(shù)據(jù)獲取、訂閱、手動(dòng) DOM 修改等),這篇文章給大家介紹React Hooks使用實(shí)戰(zhàn),感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • React?state結(jié)構(gòu)設(shè)計(jì)原則示例詳解

    React?state結(jié)構(gòu)設(shè)計(jì)原則示例詳解

    這篇文章主要為大家介紹了React?state結(jié)構(gòu)設(shè)計(jì)原則示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • React組件化學(xué)習(xí)入門教程講解

    React組件化學(xué)習(xí)入門教程講解

    React是現(xiàn)在前端使用頻率最高的三大框架之一,React率先提出虛擬DOM的思想和實(shí)現(xiàn),使其保持有良好的性能。本篇文章將對(duì)React組件化的入門學(xué)習(xí)進(jìn)行講解,同時(shí)針對(duì)模塊化的思想進(jìn)行概述,為接下來(lái)組件化開(kāi)發(fā)的文章進(jìn)行知識(shí)儲(chǔ)備
    2022-09-09
  • 記錄React使用connect后,ref.current為null問(wèn)題及解決

    記錄React使用connect后,ref.current為null問(wèn)題及解決

    記錄React使用connect后,ref.current為null問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • React RenderProps模式超詳細(xì)講解

    React RenderProps模式超詳細(xì)講解

    render props是指一種在 React 組件之間使用一個(gè)值為函數(shù)的 prop 共享代碼的技術(shù)。簡(jiǎn)單來(lái)說(shuō),給一個(gè)組件傳入一個(gè)prop,這個(gè)props是一個(gè)函數(shù),函數(shù)的作用是用來(lái)告訴這個(gè)組件需要渲染什么內(nèi)容,那么這個(gè)prop就成為render prop
    2022-11-11

最新評(píng)論

滨海县| 元朗区| 修水县| 沅江市| 来凤县| 芜湖县| 榕江县| 中江县| 正镶白旗| 开原市| 疏勒县| 若尔盖县| 梨树县| 洞口县| 叶城县| 牡丹江市| 白河县| 招远市| 通海县| 阿拉善右旗| 双峰县| 东乡族自治县| 广河县| 淮北市| 宁阳县| 博白县| 大同县| 辉县市| 南澳县| 什邡市| 岳池县| 德昌县| 宣汉县| 文山县| 咸阳市| 佛学| 奉化市| 雅安市| 云阳县| 慈利县| 沂源县|