如何在jsx中使用if else条件?

时间:2018-04-02 19:07:25

标签: javascript reactjs ecmascript-6 jsx

class Wrapper extends React.Component {
  content() {
    if (this.props.isLoading) {
      return (
        <Layout>
            <Loader />
        </Layout>
      );
    } else if (this.props.isError) {
      return (
        <Layout>
          <Error errorMsg={this.props.error} />
        </Layout>
      );
    } else {
      return (
        <Layout>
            {this.props.isSuccess ? <h1>success</h1> : <h1>some failure</h1>}
        </Layout>
      );
    }
  }

  render() {
    return this.content();
  }
}

export default Wrapper;
<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>

我有上面的代码,这里我在各种条件下使用布局, 实际的<Layout>组件非常重,所以我想只使用一次布局并尝试重写代码,如下面的代码。 但除了布局外,它不会渲染任何东西。

class Wrapper extends React.Component {
  content() {
  return (
        <Layout>
        {(()=>{
        if (this.props.isLoading) {
             <Loader />
           }else if(this.props.isError){
        
              <Error errorMsg={this.props.error} />
              
                }else if(this.props.isSuccess){
              
               <h1>success</h1>
               
              }
              
        })()}
            
        </Layout>
      );
  }

  render() {
    return this.content();
  }
}

export default Wrapper;

3 个答案:

答案 0 :(得分:2)

这样的事情怎么样?

class Wrapper extends React.Component {
    render() {
        return (
            <Layout>
                {this.props.loading &&
                    <Loader />
                }
                {this.props.error &&
                    <Error errorMsg={this.props.error} />
                }
                {this.props.succes &&
                    <h1>success</h1>
                }
            </Layout>
        );
    }
}

export default Wrapper;

答案 1 :(得分:1)

因为忘记返回元素,默认情况下函数返回undefined。您定义了一个iife,它不会自动返回结果,您需要这样做。

像这样写:

{(()=>{
    if (this.props.isLoading) {
        return <Loader />
    }else if(this.props.isError){
        return <Error errorMsg={this.props.error} />
    }else if(this.props.isSuccess){  
        return <h1>success</h1>   
    }

})()}

考虑这个例子使图片更清晰,在这种情况下renderElement函数将返回undefined,并且不会呈现任何内容。

render(){
    return (
        <div>
            {this.renderElement()}
        </div>
    )
}


// it will not return anything    
renderElement(){
    if (this.props.isLoading) {
        <Loader />
    }else if(this.props.isError){
        <Error errorMsg={this.props.error} />
    }else if(this.props.isSuccess){  
        <h1>success</h1>   
    }
}

答案 2 :(得分:1)

class Wrapper extends React.Component {

  render() {
   let content, message;

   this.props.error ? message = <Error errorMsg={this.props.error}> : null
   this.props.success ? message =  <h1>success</h1> : null
   this.props.isLoading ? content = <Loader/> : content = message

   return (
      <Layout>
         {content}
      </Layout>
    )}
}

export default Wrapper;