React render fonksiyonunda if… else… ifadesi kullanmak mümkün mü?


94

Temel olarak bir tepki bileşenim var, render()işlev gövdesi aşağıdaki gibi: (Benim idealim, şu anda çalışmıyor demektir)

render(){
    return (
        <div>
            <Element1/>
            <Element2/>
            // note: code does not work here
            if (this.props.hasImage) <MyImage />
            else <OtherElement/>
        </div>
    )
}

Evet, bu çok yaygın bir sorundur ve harika bir sorudur! Belki biraz farklı bir şekilde ifade etmek ve bu belirli kodu çalıştırdığınızda ne olduğunu göstermek (biraz biçimlendirmeyi de düşünün) sorunu tam olarak çözmenize yardımcı olabilir.
ZekeDroid

Evet, yanlış olan (ideal olan). Sorunu gidermek için soruyu yeni güncelledim. Teşekkürler
Xin

1
kötü, eğer ... başka
renderda

Yanıtlar:


179

Tam olarak öyle değil ama geçici çözümler var. React'in belgelerinde , göz atmanız gereken koşullu oluşturma hakkında bir bölüm var . Inline if-else kullanarak yapabileceklerinize bir örnek aşağıda verilmiştir.

render() {
  const isLoggedIn = this.state.isLoggedIn;
  return (
    <div>
      {isLoggedIn ? (
        <LogoutButton onClick={this.handleLogoutClick} />
      ) : (
        <LoginButton onClick={this.handleLoginClick} />
      )}
    </div>
  );
}

Bununla, render işlevi içinde de ilgilenebilirsiniz, ancak jsx'i döndürmeden önce.

if (isLoggedIn) {
  button = <LogoutButton onClick={this.handleLogoutClick} />;
} else {
  button = <LoginButton onClick={this.handleLoginClick} />;
}

return (
  <div>
    <Greeting isLoggedIn={isLoggedIn} />
    {button}
  </div>
);

Ayrıca ZekeDroid'in yorumlarda ortaya çıkardığından da bahsetmeye değer. Yalnızca bir koşulu kontrol ediyorsanız ve uygun olmayan belirli bir kod parçasını oluşturmak istemiyorsanız && operator,.

  return (
    <div>
      <h1>Hello!</h1>
      {unreadMessages.length > 0 &&
        <h2>
          You have {unreadMessages.length} unread messages.
        </h2>
      }
    </div>
  );

14
Şık bir numara da JS'nin kısa devre özelliğini kullanıyor! isTrue ? <div>Something</div> : nullYapabileceğiniz gibi bir şey yapmaktan kaçınmak içinisTrue && <div>Something</div>
ZekeDroid

1
Ek olarak, React'te başka koşullu renderlemeler dışında daha fazla koşullu render hakkında bilgi edinmek için aşağıdaki makaleye göz atabilirsiniz .
Robin Wieruch

Döngüdeki koşulu "data.map (item => (<tr> <td> if (item.type == 'image') {<image src =" {image.src} ">} else gibi işlemek istiyorum {{item}} </td> </tr>)) "böyle bir şey
Vikas Chauhan

51

Aslında OP'nin istediğini tam olarak yapmanın bir yolu var. Anonim bir işlevi şu şekilde oluşturun ve çağırın:

render () {
  return (
    <div>
      {(() => {
        if (someCase) {
          return (
            <div>someCase</div>
          )
        } else if (otherCase) {
          return (
            <div>otherCase</div>
          )
        } else {
          return (
            <div>catch all</div>
          )
        }
      })()}
    </div>
  )
}

5

Sen kullanarak şey işleyebilen conditionalgibi deyimi if, else:

 render() {
    const price = this.state.price;
    let comp;

    if (price) {

      comp = <h1>Block for getting started with {this.state.price}</h1>

    } else {

      comp = <h1>Block for getting started.</h1>

    }

    return (
      <div>
        <div className="gettingStart">
          {comp}
        </div>
      </div>
    );
  }

5

ÜÇLÜ operatörü hakkında hatırlamalısınız

:

yani kodunuz böyle olacak,

render(){
    return (
        <div>
            <Element1/>
            <Element2/>
            // note: code does not work here
            { 
               this.props.hasImage ?  // if has image
               <MyImage />            // return My image tag 
               :
               <OtherElement/>        // otherwise return other element  

             }
        </div>
    )
}

4

Bir koşulun öğeleri göstermesini istiyorsanız, bunun gibi bir şey kullanabilirsiniz.

renderButton() {
    if (this.state.loading) {
        return <Spinner size="small" spinnerStyle={styles.spinnerStyle} />;
    }

    return (
        <Button onPress={this.onButtonPress.bind(this)}>
            Log In
        </Button>
    );
}

Ardından render işlevi içindeki yardım yöntemini çağırın.

<View style={styles.buttonStyle}>
      {this.renderButton()}
</View>

Ya da dönüşte başka bir koşul yöntemi kullanabilirsiniz.

{this.props.hasImage ? <element1> : <element2>}

2

If else yapısının kısaltması JSX'te beklendiği gibi çalışır

this.props.hasImage ? <MyImage /> : <SomeotherElement>

DevNacho'nun bu blog gönderisinde başka seçenekler de bulabilirsiniz , ancak bunu steno ile yapmak daha yaygındır. Daha büyük bir if cümlesine ihtiyacınız varsa, dönen bir fonksiyon veya bileşen A veya bileşen B yazmalısınız .

Örneğin:

this.setState({overlayHovered: true});

renderComponentByState({overlayHovered}){
    if(overlayHovered) {
        return <overlayHoveredComponent />
    }else{
        return <overlayNotHoveredComponent />
    }
}

Parametre olarak verirseniz overlayHovered from this.state dosyanızı yok edebilirsiniz. Ardından bu işlevi render () yönteminizde çalıştırın:

renderComponentByState(this.state)


2

Birden fazla koşula ihtiyacınız varsa, bunu deneyebilirsiniz.

https://www.npmjs.com/package/react-if-elseif-else-render

import { If, Then, ElseIf, Else } from 'react-if-elseif-else-render';

class Example extends Component {

  render() {
    var i = 3; // it will render '<p>Else</p>'
    return (
      <If condition={i == 1}>
        <Then>
          <p>Then: 1</p>
        </Then>
        <ElseIf condition={i == 2}>
          <p>ElseIf: 2</p>
        </ElseIf>
        <Else>
          <p>Else</p>
        </Else>
      </If>
    );
  }
}

2

Tip 1: If ifade stili

{props.hasImage &&

  <MyImage />

}


Tip 2: If else ifade stili

   {props.hasImage ?

      <MyImage /> :

      <OtherElement/>

    }

1

Belki burada çok geç kaldım. Ama umarım bu birine yardımcı olur. Önce bu iki öğeyi ayırın.

renderLogout(){
<div>
   <LogoutButton onClick={this.handleLogoutClick} />
<div>
}

renderLogin(){
<div>
   <LoginButton onClick={this.handleLoginClick} />
<div>
}

Sonra bu işlevleri render işlevinden if else deyimini kullanarak çağırabilirsiniz.

render(){
if(this.state.result){
  return this.renderResult();
}else{
  return this.renderQuiz();
}}

Bu benim için çalışıyor. :)


1

Üçlü operatör kullandım ve benim için iyi çalışıyor.

> {item.lotNum == null ? ('PDF'):(item.lotNum)}


1

2 farklı bağımlılığınız olması durumunda koşullu operatör içinde koşullu (üçlü) operatörü de kullanabilirsiniz.

{
(launch_success)
  ?
  <span className="bg-green-100">
    Success
  </span>
  :
  (upcoming)
    ?
    <span className="bg-teal-100">
      Upcoming
    </span>
    :
    <span className="bg-red-100">
      Failed
    </span>
}

0

Anahtar durumu veya üçlü operatör ile gitmeyi deneyin

render(){
    return (
        <div>
            <Element1/>
            <Element2/>
            // updated code works here
            {(() => {
                        switch (this.props.hasImage) {
                            case (this.props.hasImage):
                                return <MyImage />;
                            default:
                                return (
                                   <OtherElement/>; 
                                );
                        }
                    })()}
        </div>
    )
}

Bu benim için çalıştı ve sizin için çalışmalı. Üçlü Operatörü Deneyin

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.