객체 배열에서 React 컴포넌트 렌더링


99

객체를 포함하는 배열 인 스테이션이라는 데이터가 있습니다.

stations : [
  {call:'station one',frequency:'000'},
  {call:'station two',frequency:'001'}
]

각 배열 위치에 대한 UI 구성 요소를 렌더링하고 싶습니다. 지금까지 쓸 수 있습니다

 var stationsArr = []
 for (var i = 0; i < this.data.stations.length; i++) {
     stationsArr.push(
         <div className="station">
             {this.data}
         </div>
     )
 }

그리고 렌더링

render(){
 return (
   {stationsArr}
 )
}

문제는 모든 데이터가 인쇄되고 있다는 것입니다. 대신 키를 표시하고 {this.data.call}싶지만 아무것도 인쇄하지 않습니다.

이 데이터를 반복하고 배열의 각 위치에 대해 새 UI 요소를 반환하려면 어떻게해야합니까?


내가 틀릴 수 있지만 함수 내부 stationsArr대신 사용해야한다고 생각합니다 . stationsrender
Tahir Ahmed

답변:


151

스테이션 목록을 ReactElements에 매핑 할 수 있습니다.

React> = 16을 사용하면 추가 html 요소 래퍼없이 동일한 구성 요소에서 여러 요소를 반환 할 수 있습니다. 16.2부터 조각을 만드는 새로운 구문 <> 이 있습니다. 이것이 작동하지 않거나 IDE에서 지원되지 않는 경우 <React.Fragment>대신 사용할 수 있습니다 . 16.0과 16.2 사이 에서는 조각에 매우 간단한 폴리 필 을 사용할 수 있습니다 .

다음을 시도하십시오

// Modern syntax >= React 16.2.0
const Test = ({stations}) => (
  <>
    {stations.map(station => (
      <div className="station" key={station.call}>{station.call}</div>
    ))}
  </>
); 

// Modern syntax < React 16.2.0
// You need to wrap in an extra element like div here

const Test = ({stations}) => (
  <div>
    {stations.map(station => (
      <div className="station" key={station.call}>{station.call}</div>
    ))}
  </div>
); 

// old syntax
var Test = React.createClass({
    render: function() {
        var stationComponents = this.props.stations.map(function(station) {
            return <div className="station" key={station.call}>{station.call}</div>;
        });
        return <div>{stationComponents}</div>;
    }
});

var stations = [
  {call:'station one',frequency:'000'},
  {call:'station two',frequency:'001'}
]; 

ReactDOM.render(
  <div>
    <Test stations={stations} />
  </div>,
  document.getElementById('container')
);

key속성을 잊지 마세요 !

https://jsfiddle.net/69z2wepo/14377/


@thatgibbyguy : 오 그래! 정답이 될 수 있습니다. 하위 구성 요소를 감싸 야합니다. 귀하의 render기능은 하나 개의 요소를 반환해야합니다.
Tahir Ahmed

각 스테이션 요소에 대한 키 속성을 제안하는 이유는 무엇입니까? 내가 묻는 것은 지금 필요하지 않다면 무엇이 변할까요?
thatgibbyguy 18:32에

4
이 경우 @thatgibbyguy는 많은 이점을 가져다주지 않습니다. 고급 예제에서는 React가 기존 노드가 스테이션 배열의 다른 위치로 이동되었는지 쉽게 알 수 있으므로 기존 dom 노드를 파괴하고 다시 생성하는 것을 피할 수 있으므로 더 나은 렌더링 성능을 가질 수 있습니다 (또한 dom 노드를 마운트 된 상태로 유지). . 반응 문서에 있습니다 : facebook.github.io/react/docs/reconciliation.html#keys
세바스티앙 Lorber

주제에서 약간 벗어 났지만 질문을 생성하는 방법을 잘 모르겠습니다. 위의 예에서 ES6 구문을 사용할 때지도에서 색인을 전달하는 방법은 무엇입니까? IOW, 내가 어레이의 마지막 노드에 있는지 어떻게 알 수 있습니까? 나는 괄호로 포장을 시도했지만 잘 안되는 것 같았다.
Lane Goolsby

@ElHombre은 stations.map((station,index) => { })나를 위해 잘 작동합니다
세바스티앙 Lorber에게


6

this.data 아마도 모든 데이터가 포함되어 있으므로 다음과 같이해야합니다.

var stations = [];
var stationData = this.data.stations;

for (var i = 0; i < stationData.length; i++) {
    stations.push(
        <div key={stationData[i].call} className="station">
            Call: {stationData[i].call}, Freq: {stationData[i].frequency}
        </div>
    )
}

render() {
  return (
    <div className="stations">{stations}</div>
  )
}

또는 mapES6를 사용하는 경우 및 화살표 기능을 사용할 수 있습니다 .

const stations = this.data.stations.map(station =>
    <div key={station.call} className="station">
      Call: {station.call}, Freq: {station.frequency}
    </div>
);

2
현재 React 버전에서는 작동하지 않으며 배열을 반환 할 수 없습니다.
Aftab Naveed

@AftabNaveed 감사합니다 내가 그것을 업데이트했습니다, 렌더링은 하나의 요소를 반환해야하지만 그 안에 요소의 배열을 갖는 것은 유효합니다
Dominic

@AftabNaveed가 말했듯이 반응 버전이 16 미만이면 위의 코드를 사용해야합니다. 그렇지 않으면 그냥 사용할 수 있습니다 return stations;( codepen.io/pawelgrzybek/pen/WZEKWj )
Chicken Soup

1

사용할 수있는 몇 가지 방법이 있습니다.

const stations = [
  {call:'station one',frequency:'000'},
  {call:'station two',frequency:'001'}
];
const callList = stations.map(({call}) => call)

해결책 1

<p>{callList.join(', ')}</p>

해결 방법 2

<ol>    
  { callList && callList.map(item => <li>{item}</li>) }
</ol>

kind-antonelli-z8372 수정

물론 다른 방법도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.