22Fragment和短语法/App.jsx
import Table from './Table';
class App extends React.Component {
render() {
return (
<Table />
)
}
}
ReactDOM.render(<App />, document.getElementById('app'));
Fragment 场景:
tr、th 元素需要拆分,把 th 拆成组件,但由于组件需要根元素,一般会用 div 包裹,然而 th 不能作为子元素出现在 div 下,此时,就需要类似 DOM 的 document.createDocumentFragment
的方案,用临时“容器”组装 th,最后再放进 tr 里
Fragment 有简写形式,叫「短语法」: <>...</>
,它会声明一个 React.Fragment
注意点:
22Fragment和短语法/Table.jsx
class Table extends React.Component {
state = {
headers: [
'Name',
'Id',
'Age'
],
info: [
'Lance',
123123123,
26
]
}
render() {
return (
<table border="1">
<caption>Private Information</caption>
<thead>
<tr>
<TableHeaders headers={ this.state.headers } />
</tr>
</thead>
<tbody>
<tr>
<TableCells info={ this.state.info } />
</tr>
</tbody>
</table>
)
}
}
class TableHeaders extends React.Component {
render() {
return (
// 用 div 包裹,会导致React报警告:
// validateDOMNesting(...): <th> cannot appear as a child of <div>.
// 所以我们可以用 React.Fragment 代替
// <div>
// {
// this.props.headers.map((item, index) => {
// return (
// <th key={ index }>{ item }</th>
// )
// })
// }
// </div>
<React.Fragment>
{
this.props.headers.map((item, index) => {
return (
<th key={ index }>{ item }</th>
)
})
}
</React.Fragment>
)
}
}
class TableCells extends React.Component {
render() {
return (
<>
{
this.props.info.map((item, index) => {
return (
<td key={ index }>{ item }</td>
)
})
}
</>
)
}
}
export default Table;