React render fonksiyonunda boş olarak dönmek mümkün müdür?


135

Bir bildirim bileşenim var ve bunun için bir zaman aşımı ayarım var. zaman aşımından sonra ararım this.setState({isTimeout:true}).

Yapmak istediğim şey, zaten zaman aşımına uğradıysa, hiçbir şey oluşturmak istemiyorum:

  render() {
    let finalClasses = "" + (this.state.classes || "");
    if (isTimeout){
      return (); // here has some syntax error
    }
    return (<div>{this.props.children}</div>);
  }

sorun şudur: return (); // burada bazı sözdizimi hatası var

Yanıtlar:


246

Evet yapabilirsiniz, ancak boş yerine, bileşenden herhangi bir şey nullistemiyorsanız geri dönün render, örneğin:

return (null);

Bir diğer önemli nokta, JSX içinde, öğeyi koşullu olarak oluşturuyorsanız, bu durumda condition=false, bu değerlerden herhangi birini döndürebilirsiniz false, null, undefined, true. DOC uyarınca :

booleans (true/false), null, and undefinedHangi geçerli çocuklar , onlar sadece render yoktur demektir Sayılan edilecektir.

Tüm bu JSXifadeler aynı anlama gelecek:

<div />

<div></div>

<div>{false}</div>

<div>{null}</div>

<div>{undefined}</div>

<div>{true}</div>

Misal:

Çift değerler için döndürdüğümüzden, yalnızca tek sayılar işlenecektir null.

const App = ({ number }) => {
  if(number%2) {
    return (
      <div>
        Number: {number}
      </div>
    )
  }
  
  return (null);           //===> notice here, returning null for even values
}

const data = [1,2,3,4,5,6];

ReactDOM.render(
  <div>
    {data.map(el => <App key={el} number={el} />)}
  </div>,
  document.getElementById('app')
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id='app' />


7
Neden sadece boş değil de (boş) dönüyorsunuz?
wederer

6
@wederer arasında hiçbir fark yok return nullve return (null)bunlar aynı :)
Mayank Shukla

Ancak bu şekilde, işlevinizden çıkamazsınız (bu, tanımsız döndürmekle aynıdır). Eğer elinizde yoksa returnReact bir hata verir. Yani return nullgerekli.
John Henckel

19

Bazı yanıtlar biraz yanlıştır ve belgelerin yanlış kısmına işaret eder:

Eğer bir bileşen şey işlemek istiyorsanız, sadece dönmek nulluyarınca, doc :

Nadir durumlarda, bir bileşenin başka bir bileşen tarafından oluşturulmuş olsa bile kendisini gizlemesini isteyebilirsiniz. Bunu yapmak için render çıktısı yerine null döndürür.

undefinedÖrneğin geri dönmeye çalışırsanız , aşağıdaki hatayı alırsınız:

Oluşturmadan hiçbir şey döndürülmedi. Bu genellikle bir return ifadesinin eksik olduğu anlamına gelir. Veya hiçbir şey oluşturmak için boş döndür.

Diğer cevaplar işaret ettiği gibi, null, true, falseve undefinedkoşullu render için yararlıdır geçerli çocuklardır içeride sizin JSX, ancak bu postu için bileşeni istiyorum / hiçbir şey işlemek, sadece dönmek null.


6

Evet, bir React oluşturma yönteminden boş bir değer döndürebilirsiniz.

Aşağıdakilerden herhangi birini iade edebilirsiniz: false, null, undefined, or true

Dokümanlara göre :

false, null, undefinedVe truegeçerli çocuklardır. Onlar sadece render etmezler.

Yazabilirsin

return null; or
return false; or
return true; or
return undefined; 

Ancak return null, hiçbir şeyin iade edilmediğini gösterdiği için en çok tercih edilenidir


1
tanımsız dönüş yanlıştır. hata verirdi. Bunun yerine <div> {undefined} </div> doğru yoldur.
jay dhawan

3

Biraz konu dışı, ancak hiçbir zaman hiçbir şeyi oluşturmayan sınıf tabanlı bir bileşene ihtiyacınız varsa ve henüz standartlaştırılmamış ES sözdizimini kullanmaktan memnunsanız, gitmek isteyebilirsiniz:

render = () => null

Bu temelde şu anda dönüşüm sınıfı özellikleri Babel eklentisini gerektiren bir ok yöntemidir . React, renderfonksiyon olmadan bir bileşeni tanımlamanıza izin vermez ve bu, aklıma gelen bu gereksinimi karşılayan en özlü biçimdir.

Şu anda bu numarayı belgelerden ödünç alınan ScrollToTop'un bir varyantında kullanıyorum react-router. Benim durumumda, bileşenin yalnızca tek bir örneği var ve hiçbir şey oluşturmuyor, bu nedenle kısa bir "null render" biçimi oraya uyuyor.


1
Kod zaten tamamlandı, ancak bu stili beğendim, en basit kod gibi görünüyor.
Xin

0

Böyle dönebiliriz

return <React.Fragment />;

2
Bu geri dönmekten daha nullmı iyi yoksa daha mı kötü ?
strider

@bitstrider'ın null yerine Fragment kullanması bellek kaybını tetikler.
koo

1
Bu cevabın neden olumsuz oy verildiğinden emin değilim, bu, geliştiricinin niyetini açıkça gösteriyor
ktingle

0

Render () işlevinde yanlış değer döndürmek hiçbir şey oluşturmaz. Yani yapabilirsin

 render() {
    let finalClasses = "" + (this.state.classes || "");
    return !isTimeout && <div>{this.props.children}</div>;
  }
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.