是否可以在React render函数中使用if ... else ...语句?


101

基本上,我有一个react组件,其render()功能主体如下:(这是我的理想组件,这意味着它当前不起作用)

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

是的,这是一个很常见的问题,也是一个很大的问题!也许在措辞上略有不同,并显示运行此特定代码会发生什么(还考虑对它进行格式化)将有助于准确地解决问题。
ZekeDroid

是的,这是错误的选择(理想选择)。我刚刚更新了问题以解决问题。谢谢
Xin

1
糟糕的话就不能写,如果...否则渲染
vijay 17-10-31

Answers:


194

不完全一样,但是有解决方法。在React的文档中有一部分关于条件渲染,您应该看一下。这是您可以使用内联if-else的示例。

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

您也可以在render函数中处理它,但是要在返回jsx之前。

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

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

还值得一提的是ZekeDroid在评论中提到了什么。如果您只是检查条件而又不想呈现不符合要求的特定代码,则可以使用&& operator

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

15
JS的短路功能也是一个不错的窍门!为了避免做类似的事情,isTrue ? <div>Something</div> : null您可以做isTrue && <div>Something</div>
ZekeDroid

1
另外,您可以查看以下文章,以了解有关React中更多条件渲染的信息
罗宾·维鲁克

我想处理循环中的情况,例如“ data.map(item =>(<tr> <td> if(item.type =='image'){<image src =“ {image.src}”>} else {{item}} </ td> </ tr>))“”这样的东西
Vikas Chauhan

55

实际上,有一种方法可以准确地执行OP的要求。只需渲染并调用匿名函数,如下所示:

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

6

您可以使用任何渲染conditional声明一样ifelse

 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

您应该记住关于TERNARY运算符

因此您的代码将像这样,

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

如果希望条件显示元素,则可以使用类似这样的内容。

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

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

然后在render函数中调用help方法。

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

或者,您可以在return内部使用其他条件。

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

4

类型1: If语句样式

{props.hasImage &&

  <MyImage />

}


类型2: If else语句样式

   {props.hasImage ?

      <MyImage /> :

      <OtherElement/>

    }

2

if else结构的简写可以在JSX中正常工作

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

您可以在DevNacho的博文中找到其他选项,但更常用速记来实现。如果你需要有if语句一个更大的,你应该写一个函数,返回成分A部件B.

例如:

this.setState({overlayHovered: true});

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

如果将其作为参数,则可以从this.state解构overlayHovered。然后在您的render()方法中执行该函数:

renderComponentByState(this.state)



1

可能我来不及了。但是我希望这会对某人有所帮助。首先将这两个元素分开。

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

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

然后,您可以使用if else语句从render函数调用这些函数。

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

这对我有用。:)



1

如果您有两个不同的依赖项,也可以在条件运算符中使用条件(三元)运算符。

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

1

尝试使用Switch大小写或三元运算符

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

这对我有用,应该对其他人也有用。尝试三元运算符

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.