ReactJS에서 반복되는 요소를 렌더링하는 코드를 작성했지만 얼마나 못 생겼는지 싫어합니다.
render: function(){
var titles = this.props.titles.map(function(title) {
return <th>{title}</th>;
});
var rows = this.props.rows.map(function(row) {
var cells = [];
for (var i in row) {
cells.push(<td>{row[i]}</td>);
}
return <tr>{cells}</tr>;
});
return (
<table className="MyClassName">
<thead>
<tr>{titles}</tr>
</thead>
<tbody>{rows}</tbody>
</table>
);
}
이것을 달성하는 더 좋은 방법이 있습니까?
( for
템플릿 코드 또는 유사한 접근 방식 내에 루프 를 포함하고 싶습니다 .)
답변
중괄호 안에 표현식을 넣을 수 있습니다. 컴파일 된 JavaScript에서 for
JSX 구문 내 에서 루프가 불가능한 이유에 주목하십시오 . JSX는 함수 호출과 설탕 함수 인수에 해당합니다. 표현식 만 허용됩니다.
(또한 : key
루프 내부에서 렌더링 된 구성 요소 에 속성 을 추가해야합니다 .)
JSX + ES2015 :
render() {
return (
<table className="MyClassName">
<thead>
<tr>
{this.props.titles.map(title =>
<th key={title}>{title}</th>
)}
</tr>
</thead>
<tbody>
{this.props.rows.map((row, i) =>
<tr key={i}>
{row.map((col, j) =>
<td key={j}>{col}</td>
)}
</tr>
)}
</tbody>
</table>
);
}
자바 스크립트 :
render: function() {
return (
React.DOM.table({className: "MyClassName"},
React.DOM.thead(null,
React.DOM.tr(null,
this.props.titles.map(function(title) {
return React.DOM.th({key: title}, title);
})
)
),
React.DOM.tbody(null,
this.props.rows.map(function(row, i) {
return (
React.DOM.tr({key: i},
row.map(function(col, j) {
return React.DOM.td({key: j}, col);
})
)
);
})
)
)
);
}
답변
Ross Allen의 답변을 확장하기 위해 ES6 화살표 구문을 사용하는 약간 더 깨끗한 변형이 있습니다.
{this.props.titles.map(title =>
<th key={title}>{title}</th>
)}
JSX 부분이 분리되어 있다는 장점이있어 (아니오 return
또는 ;
) 주위에 루프를 더 쉽게 배치 할 수 있습니다.
답변
반복 불가능한 배열Array(3)
을 생성 하므로 Array 메서드 를 사용할 수 있도록 채워야합니다 . “변환”하는 방법은 Array-brackets 내부에서 그것을 파괴하는 것입니다. 이것은 Array가 다음과 같은 값 으로 채워지도록 “강제”하는 것입니다.map
undefined
Array(N).fill(undefined)
<table>
{ [...Array(3)].map((_, index) => <tr key={index}/>) }
</table>
또 다른 방법은 Array를 사용하는 것입니다 fill()
.
<table>
{ Array(3).fill(<tr/>) }
</table>
위의 예제와 문제의 부족 key
이다 소품, 필수 .
(반복자를 사용하는 것 index
같은 key
권장하지 않습니다)
중첩 노드 :
const tableSize = [3,4]
const Table = (
<table>
<tbody>
{ [...Array(tableSize[0])].map((tr, trIdx) =>
<tr key={trIdx}>
{ [...Array(tableSize[1])].map((a, tdIdx, arr) =>
<td key={trIdx + tdIdx}>
{arr.length * trIdx + tdIdx + 1}
</td>
)}
</tr>
)}
</tbody>
</table>
);
ReactDOM.render(Table, document.querySelector('main'))
td{ border:1px solid silver; padding:1em; }
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<main></main>
답변
함수형 프로그래밍의 정신으로 추상화를 사용하여 구성 요소 작업을 좀 더 쉽게 만들어 보겠습니다.
// converts components into mappable functions
var mappable = function(component){
return function(x, i){
return component({key: i}, x);
}
}
// maps on 2-dimensional arrays
var map2d = function(m1, m2, xss){
return xss.map(function(xs, i, arr){
return m1(xs.map(m2), i, arr);
});
}
var td = mappable(React.DOM.td);
var tr = mappable(React.DOM.tr);
var th = mappable(React.DOM.th);
이제 다음과 같이 렌더링을 정의 할 수 있습니다.
render: function(){
return (
<table>
<thead>{this.props.titles.map(th)}</thead>
<tbody>{map2d(tr, td, this.props.rows)}</tbody>
</table>
);
}
jsbin
map2d의 대안은 카레 맵 기능이지만 사람들은 카레를 피하는 경향이 있습니다.
답변
이것은 imo, 가장 우아한 방법입니다 (ES6 사용). 7 개의 인덱스로 빈 배열을 인스턴스화하고 한 줄로 매핑합니다.
Array.apply(null, Array(7)).map((i)=>
<Somecomponent/>
)
https://php.quicoto.com/create-loop-inside-react-jsx/에 대한 찬사