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

React父傳子的單項數(shù)據(jù)流props的使用

 更新時間:2025年12月23日 11:33:54   作者:南山安  
props是React組件通信的核心,本文就來詳細(xì)的介紹一下React父傳子的單項數(shù)據(jù)流props的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

最近在學(xué)習(xí) React 的 props ,順手整理了自己的一些學(xué)習(xí)代碼和筆記。props 是 React 組件通信的核心,玩好了它,你寫組件就會像搭積木一樣順手。今天這篇文章,就從最基礎(chǔ)的用法開始講起,一步步帶你深入,還會結(jié)合實際代碼例子來說明。順便聊聊 React 19 前后的小變化、常見的 CSS 寫法,以及那個超級好用的 children props。

文章基于我自己的學(xué)習(xí)項目,代碼來自一個簡單的 App,包含 Greeting、Card 和 Modal 組件。咱們邊看代碼邊聊,絕對干貨滿滿。

一、Props 是什么?為什么這么重要?(重點對比 state)

在 React 里,組件要正常工作,就離不開“數(shù)據(jù)”。數(shù)據(jù)主要分兩類:stateprops。這兩兄弟長得有點像,但用途和性格完全不一樣,搞清楚它們的關(guān)系,你寫組件時才會心里有底。

用大白話總結(jié):

對比項state(狀態(tài))props(屬性)
是誰的?組件自己的私有數(shù)據(jù)父組件傳給子組件的數(shù)據(jù)
能不能改?可以改(用 setState 或 useState)只讀!子組件不能直接改
改了會怎樣?修改后組件會重新渲染只有父組件重新傳新值,子組件才會更新
生命周期屬于當(dāng)前組件,組件銷毀就沒了像“快遞”一樣,從父組件送到子組件
典型用途表單輸入值、開關(guān)狀態(tài)、計數(shù)器等可變數(shù)據(jù)配置信息、顯示內(nèi)容、回調(diào)函數(shù)等

用生活例子比喻最清楚

想象你家有個兒子(子組件)和老爸(父組件):

  • state 就像兒子自己的零花錢:他自己賺的(或爸給的初始值),想怎么花就怎么花(修改),爸管不著。
  • props 就像爸給兒子的任務(wù)和工具:爸說“今天幫我買瓶醬油,順便帶張電影票回來”,兒子只能按爸給的錢和要求去辦,不能自己改任務(wù)(“我偏要買可樂”不行)。

如果兒子想跟爸說“我買完了”或者“我需要更多錢”,那只能通過爸事先給的“傳話方式”(回調(diào)函數(shù))來溝通——這就引出了我們上次講的“子傳父”。

代碼對比最直觀

來看同一個需求:顯示一個問候語,可以改名字和歡迎詞。

用 state 的方式(數(shù)據(jù)在組件自己手里):

import { useState } from 'react';

function GreetingSelf() {
  const [name, setName] = useState('陌生人');
  const [message, setMessage] = useState('歡迎光臨');

  return (
    <div>
      <h1>Hello {name}</h1>
      <p>{message}</p>
      
      {/* 自己改自己,超級自由 */}
      <input 
        placeholder="改名字" 
        onChange={(e) => setName(e.target.value)} 
      />
      <input 
        placeholder="改歡迎詞" 
        onChange={(e) => setMessage(e.target.value)} 
      />
    </div>
  );
}

這個組件完全自給自足,想改啥改啥。

用 props 的方式(數(shù)據(jù)從外面?zhèn)鬟M(jìn)來):

function Greeting({ name, message }) {
  return (
    <div>
      <h1>Hello {name}</h1>
      <p>{message}</p>
      
      {/* 這里不能改!想改得讓父組件來 */}
      {/* <input onChange=... />  // 沒用,props 是只讀的 */}
    </div>
  );
}

// 父組件
function App() {
  const [name, setName] = useState('keji');
  const [message, setMessage] = useState('歡迎來到騰訊');

  return (
    <div>
      <Greeting name={name} message={message} />
      
      {/* 只有這里能改,改了會重新傳給子組件 */}
      <input value={name} onChange={(e) => setName(e.target.value)} />
      <input value={message} onChange={(e) => setMessage(e.target.value)} />
    </div>
  );
}

看到區(qū)別了嗎?

  • 用 state:組件內(nèi)部自己管數(shù)據(jù),適合獨立的小部件。
  • 用 props:組件變成“純展示”工具,數(shù)據(jù)統(tǒng)一由父組件管理,適合復(fù)用(同一個 Greeting 可以給不同人用不同歡迎詞)。

二、React 19 之前:Props 的經(jīng)典玩法

在 React 18 及更早版本,props 用法已經(jīng)很成熟了:

  1. 解構(gòu) props:直接在參數(shù)里解構(gòu),用起來最爽。

  2. 默認(rèn)值:兩種方式

    • ES6 默認(rèn)參數(shù):message = "默認(rèn)值"
    • defaultProps(靜態(tài)屬性,已被廢棄)

    示例(舊方式):

    Greeting.defaultProps = {
      message: "歡迎來到字節(jié)"
    };
    
  3. 類型檢查:用 prop-types 包

    import PropTypes from "prop-types";
    
    Greeting.propTypes = {
      name: PropTypes.string.isRequired,
      message: PropTypes.string,
    };
    

    開發(fā)模式下,如果傳錯類型會警告,很實用。

  4. 傳任意數(shù)據(jù):字符串、數(shù)字、對象、函數(shù)、甚至 JSX 都可以。

三、React 19 之后:Props 的小變化(更簡潔了)

React 19(2024 年 12 月穩(wěn)定發(fā)布)對 props 本身的核心機(jī)制沒大改,但有一些清理和改進(jìn),讓代碼更現(xiàn)代:

  • 移除 propTypes 和 defaultProps:這些早在 React 15.5 就被標(biāo)記廢棄了,React 19 直接從 React 包里刪掉。以后用的話不會報錯,但完全沒效果。

    • 推薦:用 TypeScript 做靜態(tài)類型檢查,或者繼續(xù)用獨立的 prop-types 包(手動檢查)。
    • 默認(rèn)值統(tǒng)一用 ES6 默認(rèn)參數(shù),更簡潔。
  • ref 現(xiàn)在可以直接作為 prop 傳(超級實用?。?以前,函數(shù)組件想接收 ref 必須裹一層 forwardRef:

    // React 18
    const MyInput = React.forwardRef((props, ref) => (
      <input ref={ref} {...props} />
    ));
    

    React 19 后,函數(shù)組件直接收 ref,像 children 一樣自然:

    // React 19
    function MyInput({ ref, ...props }) {
      return <input ref={ref} {...props} />;
    }
    

    少了好多樣板代碼,官方還提供了 codemod 自動遷移。

其他 props 相關(guān)的小優(yōu)化:對 Custom Elements(Web Components)的支持更好,props 會優(yōu)先作為 property 傳,而不是 attribute。

總之,React 19 的 props 更干凈、更貼近現(xiàn)代 JS。如果你還在用老項目,建議升級時跑一下官方 codemod。

四、React Props 的各種“邊界情況”詳解:不傳、傳了不用、沒給值會發(fā)生什么?

在實際寫代碼時,props 的這些“邊緣情況”經(jīng)常讓人摸不著頭腦。今天我們就一個個拆開看,結(jié)合真實代碼和控制臺輸出,告訴你到底會發(fā)生什么,以及怎么避免坑。

1. 不傳某個 prop(完全沒寫)

情況:父組件使用子組件時,壓根沒寫這個 prop。

結(jié)果:子組件收到這個 prop 的值是 undefined。

例子

子組件 Greeting.jsx:

function Greeting({ name, message, showIcon }) {
  console.log({ name, message, showIcon });  // 關(guān)鍵看這里

  return (
    <div>
      <h1>Hello {name}</h1>
      <p>{message}</p>
      {showIcon && <span>??</span>}
    </div>
  );
}

父組件這樣用:

<Greeting />

控制臺輸出:

{ name: undefined, message: undefined, showIcon: undefined }

頁面顯示:

Hello          // 空
               // 空

結(jié)論:不傳 = undefined,不會報錯,但顯示會很丑。

2. 傳了 prop 但子組件沒用(寫了但沒解構(gòu)/使用)

情況:父組件傳了值,但子組件參數(shù)里沒接收它。

結(jié)果:傳的值會丟失,子組件根本拿不到。

例子

父組件:

<Greeting name="小明" message="歡迎" />

子組件故意不接收 name:

function Greeting({ message }) {  // 只解構(gòu)了 message,name 被忽略
  console.log({ message });

  return <h1>Hello {message}</h1>;
}

控制臺輸出:

{ message: "歡迎" }

name 的值“小明”直接丟了,子組件完全不知道有這個 prop。

另一種寫法(用 props 對象):

function Greeting(props) {
  console.log(props);  // { name: "小明", message: "歡迎" }

  return <h1>Hello {props.message}</h1>;  // 只用了 message
}

這種情況下 props 對象里是有 name 的,但如果你沒用它,就白傳了。

結(jié)論:傳了但沒用 = 白傳,浪費性能(輕微),代碼易混淆。

3. 傳了 prop 但沒給值()

情況:寫了 prop 名,但沒賦值(布爾類型常見)。

結(jié)果:React 會自動把這個 prop 的值設(shè)為 true。

例子

父組件:

<Greeting showIcon />        // 沒寫 =true
<Greeting showIcon={true} /> // 顯式寫 true
<Greeting showIcon={false} />// 顯式寫 false

子組件:

function Greeting({ showIcon }) {
  console.log({ showIcon });

  return showIcon && <span>??</span>;
}

三種寫法的控制臺輸出:

{ showIcon: true }     // <Greeting showIcon />
{ showIcon: true }     // <Greeting showIcon={true} />
{ showIcon: false }    // <Greeting showIcon={false} />

結(jié)論:在 JSX 中, 等價于 。這是 React 的語法糖,超級常見于開關(guān)類 prop(如 disabled、checked、selected 等)。

4. 給了默認(rèn)值的情況(ES6 默認(rèn)參數(shù))

情況:不傳或傳 undefined 時,用默認(rèn)值兜底。

例子

function Greeting({ 
  name = "陌生人", 
  message = "歡迎光臨", 
  showIcon = false 
}) {
  console.log({ name, message, showIcon });

  return (
    <div>
      <h1>Hello {name}</h1>
      <p>{message}</p>
      {showIcon && <span>??</span>}
    </div>
  );
}

測試幾種調(diào)用:

<Greeting />                          // 全不傳
<Greeting name={undefined} />         // 顯式傳 undefined
<Greeting name="" />                  // 傳空字符串(不會用默認(rèn))
<Greeting name="小明" />

控制臺輸出:

{ name: "陌生人", message: "歡迎光臨", showIcon: false }
{ name: "陌生人", message: "歡迎光臨", showIcon: false }  // undefined 觸發(fā)默認(rèn)
{ name: "",       message: "歡迎光臨", showIcon: false }  // 空字符串不會觸發(fā)默認(rèn)
{ name: "小明",   message: "歡迎光臨", showIcon: false }

關(guān)鍵點:只有 undefined 才會觸發(fā) ES6 默認(rèn)值。傳 null、""、false、0 都不會觸發(fā)默認(rèn)值。

5. 總結(jié)表格(一目了然)

父組件寫法子組件收到值是否觸發(fā)默認(rèn)值說明
不寫 propundefined最常見坑
< Comp flag />true-布爾 prop 的語法糖
< Comp flag={true/false} />true / false-顯式控制
< Comp name={undefined} />undefined顯式傳 undefined 也會觸發(fā)默認(rèn)
< Comp name="" />""(空字符串)傳了具體值,就不會用默認(rèn)
< Comp name={null} />nullnull 是合法值,不會觸發(fā)默認(rèn)
傳了 prop 但子組件沒接收拿不到(丟失)-代碼 bug,建議用 TS 或 PropTypes 檢查

五、children:最強(qiáng)大的 props

children 是 React 自動傳給你的一個特殊 prop,代表組件標(biāo)簽之間的內(nèi)容。它讓組件超級靈活,能“插槽”任意 JSX。

Card 組件

App.jsx
<Card className="user-card">
  <h2>張三</h2>
  <p>高級前端工程師</p>
  <button>查看詳情</button>
</Card>

Card 實現(xiàn)

//Card.jsx
const Card = ({ children, className = "" }) => {
  return <div className={`card ${className}`}>{children}</div>;
};

其中,{children}就是

  <h2>張三</h2>
  <p>高級前端工程師</p>
  <button>查看詳情</button>

直接把父組件傳的 JSX 原樣渲染出來,完美封裝卡片樣式。

Modal 組件(更高級的定制): 我們想讓 Modal 支持自定義 header 和 footer:

//App.jsx
<Modal HeaderComponent={MyHeader} FooterComponent={MyFooter}>
  <p>這是一個彈窗</p>
  <p>你可以在這里顯示任何JSX</p>
</Modal>

Modal 實現(xiàn):

//Modal.jsx
function Modal({ HeaderComponent, FooterComponent, children }) {
  return (
    <div style={styles.overlay}>
      <div style={styles.modal}>
        <HeaderComponent />
        <div style={styles.content}>{children}</div>
        <FooterComponent />
      </div>
    </div>
  );
}

這里 children 就是彈窗正文內(nèi)容,而 Header/Footer 是通過 props 傳組件,實現(xiàn)高度定制。

children 的威力在于:它讓你的組件像“容器”一樣,能包裹任意內(nèi)容。Ant Design、Material UI 的很多組件都靠它實現(xiàn)靈活性。

六、React 中常見的 CSS 樣式寫法

React 是“CSS in JS”的鼻祖,樣式寫法靈活多變。來看幾種常見方式,各有優(yōu)缺點:

  1. 內(nèi)聯(lián)樣式(style 對象) —— 最簡單,直接在 JSX 里寫

    <h2 style={{ margin: 0, color: "blue" }}>自定義標(biāo)題</h2>
    

    適合快速原型或動態(tài)樣式(比如根據(jù) props 變色)。缺點:沒法用偽類(如 :hover),寫多了很亂。

  2. 單獨 CSS 文件 + className —— 傳統(tǒng)方式,最常見 看 Card.jsx 和 Card.css:

    import "./Card.css";
    
    const Card = ({ children, className = "" }) => {
      return <div className={`card ${className}`}>{children}</div>;
    };
    

    CSS 文件里寫:

    .card {
      background-color: #ffffff;
      border-radius: 12px;
      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
      /* ... */
    }
    
    .card:hover {
      transform: translateY(-4px);
      /* 懸停效果 */
    }
    

    優(yōu)點:支持所有 CSS 特性(偽類、媒體查詢),易維護(hù)。缺點:類名沖突風(fēng)險(可以用 CSS Modules 解決)。

  3. CSS in JS(對象樣式)

    const styles = {
      overlay: { backgroundColor: "rgba(0,0,0,0.5)", /* ... */ },
      modal: { backgroundColor: "white", /* ... */ },
    };
    
    <div style={styles.overlay}>...</div>
    

    優(yōu)點:樣式作用域天然隔離,動態(tài)樣式超方便。缺點:運行時開銷稍大,偽類支持差(需要額外庫如 styled-components)。

  4. 其他流行方案

    • styled-componentsemotion:寫模板字符串,兼顧作用域和偽類。
    • Tailwind CSS:utility-first,直接在 className 里堆類。
    • CSS Modules:自動生成唯一類名,避免沖突。

個人建議:小項目內(nèi)聯(lián)或單獨 CSS 夠用,中大型項目推薦 CSS Modules + Tailwind,或者 styled-components。

最后總結(jié)

props 是 React 的靈魂,掌握它你就掌握了組件通信。默認(rèn)值、類型檢查、children 這些細(xì)節(jié)用好了,代碼會優(yōu)雅很多。React 19 把一些老古董清理掉,鼓勵我們寫更現(xiàn)代的代碼(ES6 默認(rèn) + TS)。

到此這篇關(guān)于React父傳子的單項數(shù)據(jù)流props的使用的文章就介紹到這了,更多相關(guān)React 單項數(shù)據(jù)流props內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • webpack手動配置React開發(fā)環(huán)境的步驟

    webpack手動配置React開發(fā)環(huán)境的步驟

    本篇文章主要介紹了webpack手動配置React開發(fā)環(huán)境的步驟,webpack手動配置一個獨立的React開發(fā)環(huán)境, 開發(fā)環(huán)境完成后, 支持自動構(gòu)建, 自動刷新, sass語法 等功能...感興趣的小伙伴們可以參考一下
    2018-07-07
  • antd踩坑之javascriptEnabled配置方式

    antd踩坑之javascriptEnabled配置方式

    這篇文章主要介紹了antd踩坑之javascriptEnabled配置方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 官方推薦react-navigation的具體使用詳解

    官方推薦react-navigation的具體使用詳解

    本篇文章主要介紹了官方推薦react-navigation的具體使用詳解,react-navigation是致力于解決導(dǎo)航卡頓,數(shù)據(jù)傳遞,Tabbar和navigator布局,支持redux。非常具有實用價值,需要的朋友可以參考下
    2018-05-05
  • React庫之react-beautiful-dnd介紹及其使用過程

    React庫之react-beautiful-dnd介紹及其使用過程

    在使用React構(gòu)建Web應(yīng)用程序時,拖拽功能是一項常見需求,為了方便實現(xiàn)拖拽功能,我們可以借助第三方庫react-beautiful-dnd,本文將介紹react-beautiful-dnd的基本概念,并結(jié)合實際的項目代碼一步步詳細(xì)介紹其使用過程,需要的朋友可以參考下
    2023-11-11
  • react?實現(xiàn)表格列表拖拽排序的示例

    react?實現(xiàn)表格列表拖拽排序的示例

    本文主要介紹了react?實現(xiàn)表格列表拖拽排序,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • react配置路由前綴問題及解決

    react配置路由前綴問題及解決

    在使用 React 配置路由前綴時,需要注意兩點:首先,確保資源使用相對路徑,可以通過在 `package.json` 中添加 `homepage` 選項或設(shè)置確定的前綴來實現(xiàn);其次,對于 React Router,也需要配置相同的前綴,以確保前端跳轉(zhuǎn)時能夠匹配到正確的路由
    2026-03-03
  • useEffect如何通過form.getFieldValue(‘xxx‘)監(jiān)聽Form表單變化

    useEffect如何通過form.getFieldValue(‘xxx‘)監(jiān)聽Form表單變化

    這篇文章主要介紹了useEffect如何通過form.getFieldValue(‘xxx‘)監(jiān)聽Form表單變化問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • React操作真實DOM實現(xiàn)動態(tài)吸底部的示例

    React操作真實DOM實現(xiàn)動態(tài)吸底部的示例

    本篇文章主要介紹了React操作真實DOM實現(xiàn)動態(tài)吸底部的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • React+Antd+Redux實現(xiàn)待辦事件的方法

    React+Antd+Redux實現(xiàn)待辦事件的方法

    這篇文章主要介紹了React+Antd+Redux實現(xiàn)待辦事件的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • React文件分段上傳實現(xiàn)方法詳解

    React文件分段上傳實現(xiàn)方法詳解

    這篇文章主要介紹了React文件分段上傳實現(xiàn)方法,將文件切成多個小的文件;將切片并行上傳;所有切片上傳完成后,服務(wù)器端進(jìn)行切片合成;當(dāng)分片上傳失敗,可以在重新上傳時進(jìn)行判斷,只上傳上次失敗的部分實現(xiàn)斷點續(xù)傳;當(dāng)切片合成為完整的文件,通知客戶端上傳成功
    2022-11-11

最新評論

巴彦淖尔市| 大港区| 长宁县| 衡东县| 丰镇市| 无锡市| 通化县| 读书| 改则县| 东乌珠穆沁旗| 贵州省| 祁阳县| 赤水市| 平江县| 兴化市| 江华| 申扎县| 兴文县| 宝兴县| 潮安县| 水城县| 铅山县| 温州市| 社会| 武汉市| 繁峙县| 德令哈市| 盐池县| 金华市| 汉阴县| 潜江市| 阿城市| 那坡县| 阿合奇县| 曲阜市| 山东| 黔江区| 高雄市| 牡丹江市| 资中县| 泽库县|