React render 함수에서 if… else… 문을 사용할 수 있습니까?


93

기본적으로 반응 구성 요소가 있으며 그 render()기능 본문은 다음과 같습니다. (현재 작동하지 않는다는 것을 의미하는 이상적인 구성 요소 입니다)

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

예, 이것은 매우 일반적인 문제이며 훌륭한 질문입니다! 약간 다르게 표현하고이 특정 코드를 실행하는 과정을 보여 주면 (또한 약간의 형식을 지정하는 것도 고려) 문제를 정확히 해결하는 데 도움이 될 것입니다.
ZekeDroid

예, 잘못된 것입니다 (이상적인 것). 문제를 해결하기 위해 질문을 업데이트했습니다. 감사
신화

1
다른 사람의 렌더링하면 ... 나쁜 쓸 수 없습니다
비제이

답변:


178

정확히는 아니지만 해결 방법이 있습니다. 리 액트 문서 에 조건부 렌더링에 대한 섹션 이 있습니다. 다음은 인라인 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>
  );

14
멋진 트릭은 JS의 단락 기능을 사용하는 것입니다! 같은 일을 방지하기 위해 isTrue ? <div>Something</div> : null당신은 그냥 할 수있는isTrue && <div>Something</div>
ZekeDroid

1
또한 다음 기사를 확인하여 다른 경우와 별도로 React의 조건부 렌더링에 대해 알아볼 수 있습니다.
Robin Wieruch 2017

"data.map (item => (<tr> <td> if (item.type == 'image') {<image src ="{image.src} ">} else와 같은 루프의 조건을 처리하고 싶습니다. {{항목}} </ TD> </ TR>)) "이 같은
카스 차우

51

실제로 OP가 요구하는 것을 정확히 수행하는 방법이 있습니다. 다음과 같이 익명 함수를 렌더링하고 호출하십시오.

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

5

당신이 사용하는 어떤을 렌더링 할 수 conditional처럼 문을 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

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>}

2

if else 구조의 속기는 JSX에서 예상대로 작동합니다.

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

DevNacho 블로그 게시물에서 다른 옵션을 찾을 수 있지만 속기 사용이 더 일반적입니다. 당신이 절 경우 더 큰이해야 할 경우 함수를 작성해야하는 반환 또는 A 성분 또는 구성 요소 B.

예를 들면 :

this.setState({overlayHovered: true});

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

오버레이 Hovered를 매개 변수로 제공하면 this.state에서 구조를 해제 할 수 있습니다. 그런 다음 render () 메서드에서 해당 함수를 실행합니다.

renderComponentByState(this.state)


2

둘 이상의 조건이 필요한 경우이를 시도해 볼 수 있습니다.

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

유형 1 : If 문 스타일

{props.hasImage &&

  <MyImage />

}


유형 2 : If else 문 스타일

   {props.hasImage ?

      <MyImage /> :

      <OtherElement/>

    }

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

삼항 연산자를 사용했으며 잘 작동합니다.

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


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>
}

0

Switch 케이스 또는 삼항 연산자를 사용해보십시오

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

이것은 나를 위해 일했으며 다른 사람들에게도 효과적입니다. 삼항 연산자 시도

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.