【React 學習】props 初探

閱讀時間約 8 分鐘
這是我最後的 props,收下── (閉嘴啦)

這是我最後的 props,收下── (閉嘴啦)


剛開始接觸 props 時難免有點霧裡看花的感覺,但其實 props 的概念和 JavaScript 函式的參數非常類似。用這篇文章來記錄一下 props 的基本使用方式和注意事項。


什麼是 props?如何傳遞資料?

props 其實為 properties 的縮寫,而在 JavaScript 的世界中,看到 property,我們直覺會聯想到物件屬性,而 props 的確和物件有關係。

props 是 React 提供的特殊物件,讓我們將父元件的資料傳遞給子元件

沒錯,日後只要看到 props,就想像它承載了喬斯達家族的精神,不斷傳遞給下一代的 JOJO 就對了。這樣的運作方式我們其實不陌生,先來回想一下 JavaScript 函式參數吧

function sum() {
return a + b;
}

sum(); // Reference Error: a is not defined


sum() 函式取用了 a、b 兩個值,但不知道它們是何許人也,所以跳出 Reference Error。解決的方法很簡單,將 a、b 當作參數帶入函式即可。

function sum(a, b) {
return a + b;
}

sum(2, 2); // 4


正在學習 React 的我們都知道,元件 (component) 其實就是 JavaScript 函式,所以我們理當能用參數的方式來傳遞資料。但再進一步回想,元件一定要回傳 (return) 一組 JSX 讓 React 進行渲染,而 JSX 和 HTML 標記又非常類似,因此我們不妨將想要傳遞下去的黃金精神資料,以 attribute 的方式寫進 JSX 裡面。

看到了嗎?namecolor 就是 props

function App() {
return <Spirit name="黃金精神" color="golden" />;
}

function Spirit() {
return <div>目前還沒有取用傳遞下來的資料喔</div>;
}


props 能傳遞的資料類型不限字串,數值、陣列、物件、函式都可以。實務上還滿常傳遞物件的,請參考以下程式碼:

const spiritObj = {
name: "黃金精神",
​color: "golden",
value : [
"integrity",
"pride",
"brave",
"dedication"
]
};

function App() {
return <Spirit spiritObj={spiritObj} />;
}

function Spirit() {
return <div>目前還沒有取用傳遞下來的資料喔</div>;
}


透過 propsApp 就可以將資料傳遞給子元件 Spirit 囉。學會傳遞資料之後,接下來還得取用傳下來的資料。


取用 props 資料

前面提過 props 本身是 React 提供的物件,因此我們傳遞的資料,其實都包含在 props 物件裡面了。想一探究竟的話,可以把 props 先列印在 console 喬喬瞧瞧。

export default function App() {
return <Spirit spiritObj={spiritObj} />;
}

function Spirit(props) { // Add props as parameter
console.log(props); // Print props object
return <div>目前還沒有取用傳遞下來的資料喔</div>;
}
raw-image


太好了,那我們使用 dot notation 不就可以取用資料了嗎?的確是這樣沒錯:

const spiritObj = {
name: "黃金精神",
color: "golden",
value: ["integrity", "pride", "brave", "dedication"],
};

export default function App() {
return <Spirit spiritObj={spiritObj} />;
}

function Spirit(props) {
return (
<div style={{ backgroundColor: props.spiritObj.color }}>
{props.spiritObj.name}
</div>
);
}


但由於現在包了兩層物件,所以資料取用的寫法難免冗長,這時候善用解構賦值會是不錯的選項。直接在子元件的 (...) 當中解構,明確指名要使用的 props 資料:

// Before using destructuring​
function Spirit(props) {
return (
<div style={{ backgroundColor: props.spiritObj.color }}>
{props.spiritObj.name}
</div>
);
}

// After using destructuring​
function Spirit({ spiritObj }) {
return (
<div style={{ backgroundColor: spiritObj.color }}>
{spiritObj.name}
</div>
);
}


截至目前來做個小整理:

  • props 是 React 提供的特殊物件,裡面承載父元件要傳遞給子元件的資料,有助於我們去架構、客製化元件,就像 JavaScript 函示的參數。
  • 各種資料類型都可以透過 props 傳遞,舉凡字串、數值、陣列、物件,甚至元件。
  • 由父元件去控制子元件的手段 (我是為你好)。
  • 不想用 props.<key> 的寫法取值,可以善用解構寫法,直接定義 props 當中要使用的資料。



props 注意事項

Immutibility 不可改變

props 是 read-only 的,也就是只能被拿來讀取,無法被更改。聽起來好麻煩喔,為什麼要設下這種規定?因為 React 講求 pure function,其中一項規則,就是函式不能更改 function scope 外面的值。套用到 props 的使用情境,字元件函式不能去改變父元件傳遞下來的資料,要記得資料還是屬於父元件的。

打破 pure function 原則的話,容易形成副作用 (side-effect),造成 debug 的問題,終究也是害到我們這些始作俑者。

如果真要更改 props,請改用 state

One-way data flow 單向資料流

React 採取單向資料流模式,意即資料傳遞僅能由父元件往下傳給子元件,子元件無法逆流將資料往上傳給父元件。這種模式的好處如下:

  • 效能比雙向資料流佳
  • 應用程式的運作更容易預期,因為資料流向是單一的
  • 承接上一點,debug 起來也會比較容易

題外話,Angular 似乎是採用雙向資料流,但沒有那方面的實作經驗,日後遇到會再補充上來。

總而言之,單向資料流讓 props 僅能由上往下傳遞,但 React 似乎有種叫做 controled component 的東西可以達到雙向的效果,這部分也留待日後研究:Understanding data binding in React



參考資料:

18會員
34Content count
Bonjour à tous,我本身是法文系畢業,這邊會刊登純文組學習網頁開發的筆記。如果能鼓勵更多文組夥伴一起學習,那就太開心了~
留言0
查看全部
發表第一個留言支持創作者!
蕭宇廷的沙龍 的其他內容
初探 JSX 語法、規則以及其背後運作方式。
簡單認識 JS 的 import 和 export 用法,以及它們在 React 的使用情境
記錄了前端框架的學習原因、使用好處以及注意事項。
電商網站切版連結: https://codepen.io/XavierHSIAO/pen/qBgvQyw
CSS Grid 基礎學習筆記第二彈
初探 JSX 語法、規則以及其背後運作方式。
簡單認識 JS 的 import 和 export 用法,以及它們在 React 的使用情境
記錄了前端框架的學習原因、使用好處以及注意事項。
電商網站切版連結: https://codepen.io/XavierHSIAO/pen/qBgvQyw
CSS Grid 基礎學習筆記第二彈
你可能也想看
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
React 表單驗證是一種技術與使用者體驗的設計,讓使用者能夠即時檢查輸入的資料並修正,提升使用者的使用體驗,並確保資料的正確性。
Thumbnail
前言 嗨,各位懷舊遊戲愛好者!今天要跟大家分享一個有趣的主題:如何利用React和Pixi.js這兩大神兵利器,重塑我們那個年代的經典紅白機打磚塊遊戲! 先跟大家簡單科普一下,React是一個超級火爆的前端框架,能讓我們輕鬆創建可重用的UI組件,組件間的狀態管理也相當方便。。。
Thumbnail
動態導覽列為增加使用者經驗UX,要如何在Tailwind CSS上實現呢?這次JayLin來帶大家做一個動態導覽列(Animation Navigation)
Thumbnail
Todo App是一個很好學習程式語言的專案開始,JayLin來帶大家手把手用TypeScript | React | TailwildCSS 來做一個小專案
Thumbnail
想要知道如何用最新技術來製作一個App嗎? 跟著JayLin用React | Redux Tool Kit | TypeScript | TailwildCSS 來製作一個Drawing App
Thumbnail
瑞士作為歐洲的非歐盟國家,並未直接採用歐盟REACH法規,但是其化學品管理條例ChemO很大程度上借鑒了歐盟的REACH和CLP法規。可以說,瑞士ChemO合規和歐盟REACH息息相關。
Thumbnail
React Hook onclick call a callback function with params, and change css style example: 本筆記參考: 1. https://www.codegrepper.com/code-examples/javascrip
Thumbnail
接續上一篇,navbar元件其實寫的不是很好,還不能說是可真正reuse,我們把程式改成這樣,透過props傳入navbar的items,定義好navbar title, li的href/name/active等等,就可以達到navbar元件無須改code就能重用的目的! Navbar 元件中用m
Thumbnail
接續上一篇,這邊要來寫一個React hello world app,最後安裝webpack-dev-server來提升開發效率。 使用npm安裝react, react-dom: $ npm install react react-dom --save dependencies下紀錄的是生產環境會
Thumbnail
React開發有兩種方式,一種是使用CDN方式include react的官方lib,然後使用babel來將JSX編譯成瀏覽器看得懂的javascript。 但是在react中還會使用到sass, scss等等,還需要額外編譯成css瀏覽器才看得懂。 而webpack的誕生,就是為了解決上述的問題,
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
React 表單驗證是一種技術與使用者體驗的設計,讓使用者能夠即時檢查輸入的資料並修正,提升使用者的使用體驗,並確保資料的正確性。
Thumbnail
前言 嗨,各位懷舊遊戲愛好者!今天要跟大家分享一個有趣的主題:如何利用React和Pixi.js這兩大神兵利器,重塑我們那個年代的經典紅白機打磚塊遊戲! 先跟大家簡單科普一下,React是一個超級火爆的前端框架,能讓我們輕鬆創建可重用的UI組件,組件間的狀態管理也相當方便。。。
Thumbnail
動態導覽列為增加使用者經驗UX,要如何在Tailwind CSS上實現呢?這次JayLin來帶大家做一個動態導覽列(Animation Navigation)
Thumbnail
Todo App是一個很好學習程式語言的專案開始,JayLin來帶大家手把手用TypeScript | React | TailwildCSS 來做一個小專案
Thumbnail
想要知道如何用最新技術來製作一個App嗎? 跟著JayLin用React | Redux Tool Kit | TypeScript | TailwildCSS 來製作一個Drawing App
Thumbnail
瑞士作為歐洲的非歐盟國家,並未直接採用歐盟REACH法規,但是其化學品管理條例ChemO很大程度上借鑒了歐盟的REACH和CLP法規。可以說,瑞士ChemO合規和歐盟REACH息息相關。
Thumbnail
React Hook onclick call a callback function with params, and change css style example: 本筆記參考: 1. https://www.codegrepper.com/code-examples/javascrip
Thumbnail
接續上一篇,navbar元件其實寫的不是很好,還不能說是可真正reuse,我們把程式改成這樣,透過props傳入navbar的items,定義好navbar title, li的href/name/active等等,就可以達到navbar元件無須改code就能重用的目的! Navbar 元件中用m
Thumbnail
接續上一篇,這邊要來寫一個React hello world app,最後安裝webpack-dev-server來提升開發效率。 使用npm安裝react, react-dom: $ npm install react react-dom --save dependencies下紀錄的是生產環境會
Thumbnail
React開發有兩種方式,一種是使用CDN方式include react的官方lib,然後使用babel來將JSX編譯成瀏覽器看得懂的javascript。 但是在react中還會使用到sass, scss等等,還需要額外編譯成css瀏覽器才看得懂。 而webpack的誕生,就是為了解決上述的問題,