這篇筆記主要整理自:官方文件 Passing Props to a Component
Props 就是你傳給 JSX tag 的資料!
<img/>
裡的 className, src, alt, width, height...function Avatar() {
return (
<img
className="avatar"
src="https://i.imgur.com/1bX5QH6.jpg"
alt="Lin Lanying"
width={100}
height={100}
/>
);
}
function Profile() {
return (
<Avatar
person={{ name: 'Lin Lanying', imageId: '1bX5QH6' }}
size={100}
/>
);
}
看了上面兩個 code block 應該可以猜到,props 可以傳的資料是任何資料型別
文件說:「Props might remind you of HTML attributes, but you can pass any JavaScript value through them, including objects, arrays, and functions.」
我們撰寫的元件唯一接受的參數就是 props!
承接上一個 code block,Avatar 元件要取用 Profile 元件傳的資料就可以這樣寫:
function Avatar(props) {
let person = props.person; // person 變數就會收到物件資料
let size = props.size; // size 變數就會收到數字資料
// ...
}
🌟 但比起上方的寫法,實務上更常直接在接收 props 的參數時進行物件解構賦值,code 會簡潔很多!
function Avatar({ person, size }) {
// ...
}
🌟 進階應用:為 props 設定預設值
function Avatar({ person, size = 100 }) {
// ...
}
🌟 延伸思考:元件接收到很多 props,但其實自己沒有要用,只是單純要往下傳給子元件怎麼寫?
Before:直覺思考可能會這樣寫,缺點是重複性高,優點是看得清楚傳了什麼
function Profile({ person, size, isSepia, thickBorder }) {
return (
<div className="card">
<Avatar
person={person}
size={size}
isSepia={isSepia}
thickBorder={thickBorder}
/>
</div>
);
}
After:這樣寫會簡潔許多,但可能會忘記傳什麼
function Profile(props) {
return (
<div className="card">
<Avatar {...props} />
</div>
);
}
⚠️ 文件有提到,如果發現開發時太常使用到上方 <Avatar {...props} />
這樣的寫法,可能代表還能再思考重構、拆分元件,不然整體易讀性會降低許多,進而影響到維護性
撰寫元件時很常會寫出巢狀的 tag,像是:
<div>
<img />
</div>
<Card>
<Avatar />
</Card>
當 JSX tag 有包裹 content,包住 content 的那個父元件就會接收到叫「children」的 props,值就為該 content
<h1>App</h1>
就為 Test 元件 props.children 的值function Test({children}) {
return <div>{children}</div>;
}
function App() {
return (
<Test>
<h1>App</h1>
</Test>
);
}
function Test(props) {
console.log(props); // 在這裡印出
return <div>{props.children}</div>;
}
function App() {
return (
<Test size={100}> // 補一個隨意的 props
<h1>App</h1>
<h2>App2</h2> // 新增一個元素
</Test>
);
}
以下為官方文件的 Recap,不做翻譯,只畫重點
function Avatar({ person, size })
destructuring syntax.size = 100
, which is used for missing and undefined
props.<Avatar {...props} />
JSX spread syntax, but don’t overuse it!<Card><Avatar /></Card>
will appear as Card
component’s children
prop.以上,有任何想法或文內有誤、不清楚歡迎提出,謝謝大家 🙏🏻
.
筆者小記:認識 props 時,腦中就會浮現家長把資料傳給孩子的畫面,然後孩子可以使用這些資料做些事情~