Kardeş öğeleri bir ana etikete sarmadan nasıl oluştururum?


82

Çoğu durumda, bir ana etikete sahip olmak bir sorun değildir.

React.createClass({
    render: function() {
        return (
            <tbody>
                <tr><td>Item 1</td></tr>
                <tr><td>Item 2</td></tr>
            </tbody>
        );
    }
});

Ancak, bir oluşturma işlevinde bir ebeveyn olmadan kardeş öğelere sahip olmanın mantıklı olduğu bazı durumlar vardır ve özellikle bir tablo söz konusu olduğunda, bir tablo satırını bir div.

React.createClass({
    render: function() {
        return (
            <tr><td>Item 1</td></tr>
            <tr><td>Item 2</td></tr>
        );
    }
});

İkinci örnek aşağıdaki hatayı veriyor: Adjacent XJS elements must be wrapped in an enclosing tag while parsing file.

İki kardeş öğesini bir <div>veya benzer bir şeye sarmadan nasıl render edebilirim ?


3
Bu soruyu / cevabı bulmakta her zaman sorun yaşıyorum, bu yüzden kendim sormaya / cevaplamaya karar verdim. Ek açıklamalar / cevaplar kabul edilir.
thealexbaron

Başka bir örnek seyir ürün olduğunu
Tjorriemorrie

Yanıtlar:


66

Bu şu anda bir sınırlamadır, ancak muhtemelen gelecekte bir noktada düzeltilecektir ( github deposunda bazı açık sorunlar vardır ).

Şimdilik, bir dizi döndüren bir işlev kullanabilirsiniz (bu temelde durumsuz bir bileşendir):

function things(arg, onWhatever){
    return [
        <tr><td>Item 1</td></tr>,
        <tr><td>Item 2</td></tr>
    ];
}

Ve bunu bileşeninizde kullanın.

return (
    <table><tbody>
      {things(arg1, this.handleWhatever)}
      {things(arg2, this.handleWhatever)}
    </tbody></table>
);

Güncelleme

React 16'da render'dan bir dizi döndürebileceksiniz.

Başka Bir Güncelleme

Artık üst düzey bir dizi döndürebilir veya kullanabilirsiniz <React.Fragment>.

React, dinamik olarak oluşturulan bir liste yerine iki öğenin sabit olduğunu bilmediğinden, bir dizi ile her öğeye bir anahtar yerleştirmemiz gerekir:

function RowPair() {
  return [
    <tr key="first"><td>First</td></tr>,
    <tr key="second"><td>Second</td></tr>,
  ]
}

İle React.Fragment, çocukları dinamik olarak inşa etmiyorsak, a'nın gerekli olmadığı bir <div>veya benzerine sarmak gibi çok daha fazla davranır key. İlk olarak, diziyi bir Parçaya sarabiliriz:

function RowPair() {
  return <React.Fragment>{[
    <tr key="first"><td>First</td></tr>,
    <tr key="second"><td>Second</td></tr>,
  ]}</React.Fragment>
}

Ve sonra diziyi keytamamen ortadan kaldırabiliriz :

function RowPair() {
  return <React.Fragment>
    <tr><td>First</td></tr>
    <tr><td>Second</td></tr>
  </React.Fragment>
}

2
Neden herkes bunun işe yaradığını söylüyor ???? Yakalanmamış Hata: x.render (): Geçerli bir React öğesi (veya boş) döndürülmelidir. Tanımsız, bir dizi veya başka bir geçersiz nesne döndürmüş olabilirsiniz.
Xogle

@Xogle React API'de bir şey değişmiş olmalı. Artık işe yaramıyor gibi görünüyor.
Petr Peller

1
@FakeRainBrigand Sorunu görüyorum. Bu "durumsuz bir bileşen" değil, bir dizi döndüren bir işlev. Durumsuz bileşenler dizileri döndüremez ve Redux deposuna basit bir işlev bağlayamazsınız.
Petr Peller

@PetrPeller jsx kullanıyor musunuz? Örnekte bunu bir işlev olarak adlandırıyorum.
Brigand

Tüm olumlu oyları anlamıyorum - bu soruya hiç cevap vermiyor. Soru, ana öğe olmadan kardeş öğelerin nasıl oluşturulacağıdır ve bu yanıt yine de bir ana öğe oluşturur.
Dancrumb

33

Bunun eski bir gönderi olduğunu biliyorum, ancak cevabım benim gibi yeni başlayanlar için bir yardımcı olabilir.

React 16.2'de Fragments için geliştirilmiş destek eklendi.

Şimdi bunu şu şekilde iade edebilirsiniz:

return (
  <>
    <tr><td>Item 1</td></tr>
    <tr><td>Item 2</td></tr>
  </>
);

Sen ile sarın <></>veya <Fragment></Fragment>.

Bazı öznitelikleri geçirmek isterseniz , yazma sırasında yalnızca anahtar desteklenir <Fragment />ve kısa sözdizimi <></>öznitelikleri kabul etmediği için kullanmanız gerekir .

Not: Kısa sözdizimini kullanacaksanız, Babel 7 kullandığınızdan emin olun .

Kaynak Referans


1
Tam olarak neyin peşindeydim, teşekkürler! Ayrıca, başka birinin ihtiyacı olması ihtimaline karşı: React'i içe aktarın, {Fragment} '
Chris

Uygulamasını Fragmentkendi deposunda bulamıyorum, birisi, lütfen bana gösterebilir mi? Teşekkürler :)
Ramon Balthazar

Babel-cli'yi kursam bile çalıştıramıyorum ... sadece <> çözümü için bile. Nasıl mümkün olabilir @onoya Yakında bir konu göndereceğim,
Gaelle


3

Bir üst öğeye sahip olmak çoğu durumda yararlıdır, örneğin, alt öğe stilini ve birkaç başka senaryoyu hedefleyebilen bir ebeveyn className'e sahip olabilirsiniz ...

Ancak bunu gerçekten yapmak istemiyorsanız, React.Fragment

Öyleyse basitçe şöyle bir şey yapın:

<React.Fragment>
  <First />
  <Second />
  <Third />
</React.Fragment>

16.2 sürümünden itibaren <>, render işlevinde aşağıdaki gibi görünen kısaltılmış bir sürüm de bulunmaktadır:

render() {
  return (
    <>
      <First />
      <Second />
      <Third />
    </>
  );
}

Ayrıca, sürüm 16.0 ve üstü kullanıyorsanız, aşağıdaki gibi üst sarmalayıcıya ihtiyaç duymayan öğeler dizisi döndürebilirsiniz:

render() {
 return [
  <h1 key="heading">Hello from Alireza!</h1>,
  <p key="first">Here where I'm!</p>,
  <p key="second">And again here :)</p>
 ];
}

0

Parantez içine şu şekilde sarabilirsiniz:

React.createClass({
    render: function() {
        return (
          [
            <tr><td>Item 1</td></tr>
            <tr><td>Item 2</td></tr>
          ]
        );
    }
});

Object.keys()İade içinde de kullanmanız gerekse nasıl olur ?
Juha Untinen

Örneğin. return ( [ <tr><td>Header</td></tr>{ Object.keys(this.props.data).map(function(item) { <tr><td>{data}</td></tr> }) } ] ); 15.4.2 ile Unexpected token, expected ,dönüşte açılış parantezinde veriyor
Juha Untinen

şöyle bir şey deneyin: return ({Object.keys (this.props.data) .map (function (item) {<tr><td>{data}</td> </tr>}). unshift ({< tr> <td> Başlık </td> </tr>})});
Vitaliy Andrusishyn

Bu işe yaramıyor, yine de <tr>
-s'yi

0

Bu örnek benim için iyi çalışıyor:

let values = [];

if (props.Values){
  values = [
    <tr key={1}>
      <td>props.Values[0].SomeValue</td>
    </tr>
  ,
    <tr key={2}>
        <td>props.Values[1].SomeValue</td>
        </tr>
    ];
}

return (
    <table className="no-border-table table">
      <tbody>
        <tr>
            <th>Some text</th>
        </tr>
        {values}
      </tbody>
    </table>
)

0

Bu sözdizimi gibi bir şey benim için çalıştı

this.props.map((data,index)=>{return( [ <tr>....</tr>,<tr>....</tr>];)});

-2

TypeScript kullananlar için doğru sözdizimi şudur:

return [
  (
    <div>Foo</div>
  ),
  (
    <div>Bar</div>
  )
];

1
Bu, @thealexbaron'un cevabıyla aynı ve TypeScript ile ilgisi yok
andrewarchi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.