React Children 屬性

使用組件時,大多數都是這樣寫:

1
<Component />

但我們其實可以在組件中寫入其他內容:

1
2
3
<Component>
<p>Hello World!</p>
</Component>

除了在組件中寫入內容以外,組件本身也要加入 props.children 的屬性才會出現內容,如果沒有寫入任何內容,則 props.children 返回 null。

App.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import React, { Component } from 'react';
import Card from './Card';

class App extends Component {
render() {
return (
<Card>
<h1>Hello World!</h1>
</Card>
);
}
}

export default App;

Card.js

1
2
3
4
5
6
7
8
9
const Card = (props) => {
return (
<div>
{props.children}
</div>
);
}

export default Card;

網頁呈現:


陣列處理

React.Children.map

除了文字以外,children 也可以傳遞陣列,這邊我們使用 React 提供的方法 React.Children.map 來處理資料。

App.js

1
2
3
4
5
6
7
8
9
10
11
12
13
class App extends Component {
render() {
return (
<Card>
{
function printData() {
return ['Apple', 'Orange', 'Banana'];
}()
}
</Card>
);
}
}

Card.js

1
2
3
4
5
6
7
8
9
10
11
12
13
const Card = (props) => {
return (
<div>
{
React.Children.map(props.children,
(child, i) => {
return <h1>{child}</h1>;
}
)
}
</div>
);
}

網頁呈現:

React.Children.forEach

React.Children.map 的使用方式相同,但是不會回傳陣列。


Child 數量計算

React.Children.count

這個方法用來計算 child 的數量,舉例來說:

1
2
3
4
5
<Component>
<p>Hello World!</p>
<p>Hello World!</p>
<p>Hello World!</p>
</Component>

裡面包含了三個 <p>Hello World!</p>,所以數量 = 3。

App.js

1
2
3
4
5
6
7
8
9
10
11
class App extends Component {
render() {
return (
<Card>
<h1>我是第一個child</h1>
<h1>我是第二個child</h1>
<h1>我是第三個child</h1>
</Card>
);
}
}

Card.js

1
2
3
4
5
6
7
const Card = (props) => {
return (
<div>
child 數量:{ React.Children.count(props.children) }
</div>
);
}

網頁呈現:


只呈現一個 Child

React.Children.only

這個方法是讓組件只呈現一個 child,如果 children 不只一個 child 將會報錯:

App.js

1
2
3
4
5
6
7
8
9
class App extends Component {
render() {
return (
<Card>
<h1>我是唯一的child</h1>
</Card>
);
}
}

Card.js

1
2
3
4
5
6
7
const Card = (props) => {
return (
<div>
{ React.Children.only(props.children) }
</div>
);
}

網頁呈現:


將 Child 轉成陣列

React.Children.toArray

React.Children.toArray 方法會將 child 轉成一個扁平的陣列,並對每個 child 指定一個 key。

下面示範用這個方法將每個 child 數字以小到大排序:

App.js

1
2
3
4
5
6
7
8
9
10
11
class App extends Component {
render() {
return (
<Card>
<h1>196</h1>
<h1>165</h1>
<h1>178</h1>
</Card>
);
}
}

Card.js

1
2
3
4
5
6
7
8
9
10
11
12
const Card = (props) => {
let child = React.Children.toArray(props.children);
child = child.sort((a, b) => {
return a.props.children > b.props.children ? 1 : -1;
});

return (
<div>
{child}
</div>
);
}

網頁呈現:

文章結束囉~

如果我的文章對你有幫助,可以幫我拍個手,感謝支持!