一. 動機
以下的例子簡潔清晰的反映了fragments的作用,在生產(chǎn)過程中,經(jīng)常會遇到這種情況:
首先,是在Table組件中插入Columns組件:
class Table extends React.Component {
render() {
return (
<table>
<tr>
<Columns />
</tr>
</table>
);
}
}
因為React組件最外層需要一個元素包裹,如果這時使用div標簽包裹,那么最終生成的HTML將是無效的。
class Columns extends React.Component {
render() {
return (
<div>
<td>Hello</td>
<td>World</td>
</div>
);
}
}
這時候Fragment就派上用場了
1.1 使用
class Columns extends React.Component {
render() {
return (
<React.Fragment>
<td>Hello</td>
<td>World</td>
</React.Fragment>
);
}
}
這時候,Table組件就能被正確渲染如下:
<table>
<tr>
<td>Hello</td>
<td>World</td>
</tr>
</table>
1.2 簡寫語法
有一個新的,更短的語法可以用來聲明片段(fragments)。他看起來像是空標簽:
class Columns extends React.Component {
render() {
return (
<>
<td>Hello</td>
<td>World</td>
</>
);
}
}
您可以像使用其他元素一樣使用<></>,只是它不支持 鍵(keys) 或 屬性(attributes)。
注:目前很多工具都不支持這個簡寫語法,所欲可能需要明確地使用
<React.Fragment>,直到工具支持這個語法。
1.3 帶key的片段(fragments)
<React.Fragment />可以傳遞key值,如下:
function Glossary(props) {
return (
<dl>
{props.items.map(item => (
// 沒有`key`,將會觸發(fā)一個key警告
<React.Fragment key={item.id}>
<dt>{item.term}</dt>
<dd>{item.description}</dd>
</React.Fragment>
))}
</dl>
);
}
注:
key是唯一可以傳遞給Fragment的屬性。在將來,可能會增加額外的屬性,比如事件處理。