React의 다른 return 문에서 JSX 여러 줄을 반환하는 방법은 무엇입니까?


100

한 줄이 잘 작동합니다.

render: function () {
  return (
    {[1,2,3].map(function (n) {
      return <p>{n}</p>
    }}
  );
}

여러 줄이 아님

render: function () {
  return (
    {[1,2,3].map(function (n) {
      return (
        <h3>Item {n}</h3>
        <p>Description {n}</p>
      )
    }}
  );
}

감사.


1
이 특정 문제에 대한 자세한 정보 : github.com/facebook/react/issues/2127
plus-

하지 return ("asdf" "asdf");당신이 원하는return ["asdf", "asdf"];
neaumusic

답변:


149

태그를 함수 호출로 생각하십시오 ( docs 참조 ). 그러면 첫 번째는 다음과 같습니다.

{[1,2,3].map(function (n) {
  return React.DOM.p(...);
})}

그리고 두 번째 :

{[1,2,3].map(function (n) {
  return (
    React.DOM.h3(...)
    React.DOM.p(...)
  )
})}

이제 두 번째 스 니펫이 실제로 의미가 없다는 것이 분명합니다 (JS에서 둘 이상의 값을 반환 할 수 없음). 다른 요소 (원하는 것, 유효한 key속성을 제공 할 수도 있음)로 래핑 하거나 다음과 같이 사용할 수 있습니다.

{[1,2,3].map(function (n) {
  return ([
    React.DOM.h3(...),
    React.DOM.p(...)
  ]);
})}

JSX 설탕 사용 :

{[1,2,3].map(function (n) {
  return ([
    <h3></h3>, // note the comma
    <p></p>
  ]);
})}

결과 배열을 평면화 할 필요가 없습니다. React가 자동으로 수행합니다. 다음 바이올린 http://jsfiddle.net/mEB2V/1/를 참조하십시오 . 다시 말하지만, 두 요소를 div / 섹션으로 래핑하는 것이 장기적으로 더 좋습니다.


4
네 실제로 명확하게 문서화 facebook.github.io/react/tips/…
Shawn

1
평탄화 비트없이 return ([...])을 사용하면 원하는대로 정확히 마크 업을 얻을 수 있지만, 반환 된 배열은 평탄화되어서는 안되지만 특정 경우에는 최종 출력에 영향을주지 않습니다. 아니면?
Shawn

감사! TIL! Flatten이 선택 사항임을 보여주는 JSFiddle에 대한 링크를 포함하도록 내 대답을 업데이트합니다. React 문서에 대한 링크도 포함됩니다.
Jan Olaf Krems 2014 년

13
더 이상 작동하지 않습니다 (0.9ish 기준)Uncaught Error: Invariant Violation: Product.render(): A valid ReactComponent must be returned. You may have returned undefined, an array or some other invalid object.
dogmatic69

2
@TimFletcher 구성 요소 렌더링의 일부로 배열을 반환하는 것이 <div>{ this.props.foos.map(function() { return <Foo /> }) }</div>좋습니다. 예 : . 그러나 render구성 요소 의 함수는 예를 들어 div에서 래핑하지 않고 해당 배열을 반환 할 수 없습니다.
Henrik N

35

배열 반환에 대한 오래된 답변이 더 이상 적용되지 않는 것 같습니다 (@ dogmatic69 가 주석에 썼 듯이 React ~ 0.9 이후 ).

문서 에서는 단일 노드를 반환해야한다고 말합니다.

최대 JSX 루트 노드 수

현재 구성 요소의 렌더링에서는 하나의 노드 만 반환 할 수 있습니다. 예를 들어 반환 할 div 목록이있는 경우 구성 요소를 div, 범위 또는 기타 구성 요소로 래핑해야합니다.

JSX가 일반 JS로 컴파일된다는 것을 잊지 마십시오. 두 함수를 반환하는 것은 실제로 구문 상 의미가 없습니다. 마찬가지로 삼항에 둘 이상의 자식을 넣지 마십시오.

대부분의 경우 간단히 a <div>또는 <span>.

제 경우에는 여러 <tr>s 를 반환하고 싶었습니다 . 나는 그것들을 포장했습니다 <tbody>– 테이블은 여러 개의 몸체를 가질 수 있습니다.

편집 : React 16.0부터 각 요소에 https://facebook.github.io/react/blog/2017/09/26/react-v16.0.html 이있는 한 배열 반환이 다시 허용됩니다 key. # new-render-return-types-fragments-and-strings

편집 : 16.2 당신이 가진 요소의 목록 둘러싸고 있습니다 반작용 <Fragment>…</Fragment>또는 심지어 <>…</>, 당신은 배열에 그것을 선호하는 경우 : https://blog.jmes.tech/react-fragment-and-semantic-html/


3
여러 개를 반환하려면 <li>어떻게해야합니까? 난 그냥 모든 것을 포장 할 수없는 가정<ul>
Banjocat

@Banjocat 저는 모르겠습니다 : / 목록 을 중첩 할 수 있으므로 <li><ul><li>one</li><li>two</li></ul></li>상황에 맞는 경우 같은 것을 반환 할 수 있습니다. 또는 : 래핑 div가 엄격하게 유효하지는 않지만 모든 관련 브라우저에서 제대로 렌더링 될 수 있습니까? 시도해 보시면 알려주십시오.
Henrik N

1
@Banjocat ... 질문에 대한 더 나은 답변을 알고 싶습니다. 아마도 당신은 그것을 일반적인 stackoverflow 질문으로 생각하고 다른 대답을 얻는 지 확인해야 할 것입니다.
user1175849

@ user1175849 어쩌면 당신은 : 그 질문을 게시 할 수
헨릭 N

1
@HenrikN FWIW는의 "일부"를 포장 liA의 span또는 div나를 위해 잘 작동하지 않았다. div는 렌더링을 심각하게 중단했으며 적어도 내 사용 사례에서는 범위가 CSS를 엉망으로 만들었습니다. 2 ¢ :li s의 여러 하위 집합을 반환하려는 것은 코드 냄새입니다. 우리 ul는를 일종의 풀다운 메뉴로 사용했고 처음에는 많은 구성 요소가의 "섹션"을 반환하기를 원했습니다 li. 결국 모든 메뉴 코드를 "고정 된"단일 구성 요소에 넣는 것이 여러 소스 ul에서 lis 를 구부리는 것보다 낫습니다 . UI에 대한 멘탈 모델도 좀 더 깔끔하게 만들었다 고 생각합니다.
러핀

13

에서 v16.0.0 반응 이후, 그것은 그 안에 배치로 복귀 여러 요소들 수있다Array

render() {
  return (
    {[1,2,3].map(function (n) {
      return [
        <h3>Item {n}</h3>.
        <p>Description {n}</p>
      ]
    }}
  );
}

또한 React v16.2.0 에서 React Fragments여러 요소를 래핑하는 데 사용할 수 있는 새로운 기능 이 도입되었습니다.

render() {
  return (
    {[1,2,3].map(function (n, index) {
      return (
        <React.Fragment key={index}>
            <h3>Item {n}</h3>
            <p>Description {n}</p>
        </React.Fragment>
      )
    }}
  );
}

문서에 따라 :

React의 일반적인 패턴은 구성 요소가 여러 요소를 반환하는 것입니다. 프래그먼트를 사용하면 DOM에 추가 노드를 추가하지 않고도 자식 목록을 그룹화 할 수 있습니다.

명시 적 구문으로 선언 된 조각에는 키가있을 수 있습니다. 이에 대한 사용 사례는 컬렉션을 조각 배열에 매핑하는 것입니다. 예를 들어 설명 목록을 만들려면 다음과 같이하십시오.

function Glossary(props) {
  return (
    <dl>
      {props.items.map(item => (
        // Without the `key`, React will fire a key warning
        <React.Fragment key={item.id}>
          <dt>{item.term}</dt>
          <dd>{item.description}</dd>
        </React.Fragment>
      ))}
    </dl>
  );
}

key는 Fragment에 전달할 수있는 유일한 속성입니다. 향후 이벤트 핸들러와 같은 추가 속성에 대한 지원을 추가 할 수 있습니다.


7

또한 React 구성 요소 내의 일부 도우미 함수에서 여러 목록 항목을 반환 할 수 있습니다. key속성 과 함께 html 노드 배열을 반환하십시오 .

import React, { Component } from 'react'

class YourComponent extends Component {
  // ...

  render() {
    return (
      <ul>
        {this.renderListItems()}
      </ul>
    )
  }      

  renderListItems() {
    return [
      <li key={1}><a href="#">Link1</a></li>,
      <li key={2}><a href="#">Link2</a></li>,
      <li key={3} className="active">Active item</li>,
    ]
  }
}

2

createFragment여기에서 사용할 수 있습니다 .

https://facebook.github.io/react/docs/create-fragment.html

import createFragment from 'react-addons-create-fragment';
...
{[1,2,3].map((n) => createFragment({
    h: <h3>...</h3>,
    p: <p>...</p>
  })
)}

(여기서 ES6 및 JSX 구문 사용)

먼저 react-addons-create-fragment패키지 를 추가해야 합니다.

npm install --save react-addons-create-fragment

Jan Olaf Krems의 솔루션에 비해 장점 : 반응은 실종에 대해 불평하지 않습니다 key


내가 틀렸다면 나를 수정하지만 단순히 수동으로 키를 추가 할 수 있습니다. 으로 jan의 예를 이용하여 첫째 배열 항목 가져 예 <H3 키 = {I}> </ H3> 및 <p> 키 = {i가 + '-foo'}> </ p>처럼 약간 다른 제 2 어레이 상품 STH
nerdess

2

업데이트 됨

React Fragment를 사용하십시오. 간단 해. 단편 문서에 대한 링크 .

render() {
  return (
    <>
    {[1,2,3].map((value) => <div>{value}</div>)}
    </>
  );
}

이전 답변-구식

React> 16에서는 react-composite를 사용할 수 있습니다 .

import { Composite } from 'react-composite';

// ...

{[1,2,3].map((n) => (
  <Composite>
    <h2>Title {n}</h2>
    <p>Description {n}</p>
  </Composite>
))};

물론 react-composite를 설치해야합니다.

npm install react-composite --save

0

그것은 단편 반응에 의해 간단 <></>하고 React.Fragment:

return (
    <>
      {[1, 2, 3].map(
        (n, index): ReactElement => (
          <React.Fragment key={index}>
            <h3>Item {n}</h3>
            <p>Description {n}</p>
          </React.Fragment>
        ),
      )}
    </>
  );
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.