react.js의 ng-if에 해당하는 것은 무엇입니까?


81

나는 angular를 사용하여 반응하기 위해오고 있으며 조건에 따라 요소를 렌더링하거나 렌더링하지 않는 angular의 ng-if 지시문에 대한 좋은 반응 대안을 찾으려고합니다. 예를 들어이 코드를 사용하십시오. 나는 typescript (tsx) btw를 사용하고 있지만 그다지 중요하지 않습니다.

"use strict";

import * as React from 'react';

interface MyProps {showMe: Boolean}
interface MyState {}

class Button extends React.Component <MyProps, MyState>{
  constructor(props){
    super(props);
    this.state = {};
  }

  render(){
    let button;
    if (this.props.showMe === true){
       button = (
        <button type="submit" className="btn nav-btn-red">SIGN UP</button>
      )
    } else {
      button = null;
    }
    return button;

}
}
export default Button;

이 솔루션은 작동하지만 일반적으로이 효과를 달성하는 데 사용되는 다른 방법이 있습니까? 난 그냥 추측하는거야



1
당신이 사용한 방법은 반응에서 올바른 방법입니다. 삼항 연산자를 사용하면 코드가 한 줄로 줄어들지 만 논리는 여전히 동일합니다. ''요소를 렌더링하지 않으려면 null 또는 빈 문자열 (따옴표 만)을 사용할 수 있습니다.
Kishore Barik

가장 최근의 공식 문서는이를위한 몇 가지 깔끔한 방법을 게시했습니다. facebook.github.io/react/docs/...
Downhillski

답변:


88

방법에 대한 삼항 연산자 ?

render() {
  return (
    this.props.showMe ? <button type="submit" className="btn nav-btn-red">SIGN UP</button> : null
  );
}

다음을 사용할 수도 있습니다 &&.

render() {
  return (
    this.props.showMe && <button type="submit" className="btn nav-btn-red">SIGN UP</button>
  );
}

주석에서와 같이 큰 블록은 JSX를 ()s 로 래핑하여 쉽게 처리 할 수 ​​있습니다 .

render() {
  return this.props.showMe && (
    <div className="container">
      <button type="submit" className="btn nav-btn-red">
        SIGN UP
      </button>
    </div>
  );
}

또한 인라인 :

render() {
  return (
    <div className="container">
      {this.props.showMe && <button type="submit" className="btn nav-btn-red">SIGN UP</button>}
    </div>
  );
}

6
더 큰 코드 블록에 사용하는 방법? 그냥 인라인?
Asqan

18
나는 또한 그것은 꽤 괜찮다고 생각하지만 여전히 추악한 PHP & HTML 혼합을 상기시킨다
unlimited101

88
나는 Angular를 놓친다 :(
Uday Hiwarale

2
나에게 그것은 끝없는 ng 해킹보다 훨씬 깨끗하며 어느 것을 사용하는 것이 가장 좋을 때입니다. 그리고 저는 개인적으로 자바 스크립트 같은 공간에 머무를 수 있다는 것을 좋아합니다.
Samantha Atkins

1
@PatrickCyiza 문제에 대해 자세히 설명해 주시겠습니까? 얕은 비교 문제처럼 들립니다.
Yuya 2018

25

나는 이것을 역사적인 목적으로 여기에 남겨두고 있습니다. 한동안 반응에서 개발 한 후 NgIf 구성 요소를 만든 후 훨씬 더 나은 솔루션을 위해 아래 편집을 참조하십시오 (이것은 반응 네이티브이지만 아마도 반응을 위해 작동합니다)

암호:

import React, {Component} from "react";

class NgIf extends Component {
  render() {
    if (this.props.show) {
      return (
        this.props.children
      );
    } else {
      return null
    }
  }
}

export default NgIf;

용법:

...
import NgIf from "./path/to/component"
...

class MyClass {
   render(){
      <NgIf show={this.props.show}><Text>This Gets Displayed</Text></NgIf>
   }
}

나는 이것에 익숙하지 않으므로 아마도 개선 될 수 있지만 Angular에서 전환하는 데 도움이됩니다.

편집하다

더 많은 경험이 있으면 더 나은 설명을 위해 아래 편집을 참조하십시오.

아래의 Jay의 의견 덕분에 좋은 아이디어도 있습니다.

render() {
   <View>{this.props.value ? <Text>Yes</Text> : <Text>No</Text>}</View>
}

또는

render() {
   <View>{this.props.value && <Text>Yes</Text>}</View>
}

다른 답변 중 일부와 비슷하지만 전체 렌더 블록 / 함수를 사용하는 대신 인라인으로 작동하며 특별한 구성 요소가 필요하지 않으며 삼항 연산자와 함께 else 문을 사용할 수 있습니다. if 문에 포함 된 Plus 항목은 부모 개체가없는 경우 오류를 발생시키지 않습니다. 즉 props.value, 존재하지 않으면 props.value.value2오류가 발생하지 않습니다.

이 답변을 참조하십시오 https://stackoverflow.com/a/26152067

편집 2 :

위의 링크 ( https://stackoverflow.com/a/26152067 )에 따라 반응 앱 개발에 더 많은 경험을 쌓은 후에는 위의 방법으로 작업을 수행하는 가장 좋은 방법이 아닙니다.

반응의 조건부 연산자는 실제로 머리를 돌리기 매우 쉽습니다. 작업을 수행하는 방법에는 두 가지가 있습니다.

//Show if someItem
{someItem && displayThis}

//Show if else
{someItem ? displayThisIfTrue : displayThisIfFalse}

한 가지주의 할 점은 "someItem"이 부울 표현식이 아닌 경우입니다. 0 인 경우 react는 0을 인쇄하거나 react native는 텍스트 요소에서 "0"을 래핑해야한다는 오류를 표시합니다. 이것은 일반적으로 허위 테스트에는 문제가되지 않지만 진실 테스트에는 문제가 될 것입니다. 예를 들면 :

{!someItem && displayThis} //Will work just fine if item is 0 or null or "" etc
{someItem && displayThis} //Will print the value of someItem if its not falsy

자주 사용하는 트릭? 이중 네거티브.

{!!someItem && displayThis}

이는 결과를 부울 표현식으로 암시 적으로 변환하기 때문에 삼항 연산자 (myVar? true : false) 에는 적용되지 않습니다 .


1
나는 이것이 가장 좋다. 구성 요소 및 속성을 사용하여보기 논리를 설명합니다.
제이 윅

업데이트 : 이러한 답변 을 살펴보면 이것이 이상적이지 않은 것으로 보입니다.
Jay Wick 2016 년

1
나 자신이 처음이어서 좋은 방법이라고 생각합니다. 내가 발견 한 방법의 한 가지 단점은 NgIf 개체에 포함 된 항목이 존재하지 않는 항목을 참조하는 경우 여전히 오류가 발생한다는 것입니다. 그것을 지적 주셔서 감사합니다
라이언의 전조를

1
시간이 지남에 따라 업데이트 해 주셔서 정말 감사합니다. 컨텍스트를 제공합니다. 감사합니다!
asiegf

편집 2 주셔서 감사합니다. 내가 선호하는 솔루션
TrueKojo

21

다른 요소도있는 경우 다음과 같이 조건부 만 래핑 할 수 있습니다.

render() {
  return (
    <div>Stuff</div>
    {this.props.showMe && (
      <button type="submit" className="btn nav-btn-red">SIGN UP</button>
    )}
    <div>More stuff</div>
  );
}

1
다른 제안들만큼 깨끗하지는 않지만 하나의 라이너에 좋습니다!
Joel Davey

11

조금 더 좋습니다.

render() {
  return (
    this.props.showMe && <button type="submit" className="btn nav-btn-red">SIGN UP</button>
  );
}

안녕하세요 저는이 작업을하려고하지만 하나의 구성 요소에 여러 요소가 있고 작동하지 않습니다
user3653796

10

나는 *ngIfangular에서 그것이 연결된 구성 요소를 인스턴스화하지 않는다는 것을 추가하고 싶었 습니다. React에서 문 내에서 if 문을 사용하면 return표시되지 않더라도 구성 요소를 인스턴스화합니다. *ngIfReact에서 진정한 유형 동작 을 달성하려면 return문 외부에 조건부 구성 요소를 보유하는 변수를 만들어야합니다 .

render() {

  const show = false

  return show
     ? <AwesomeComponent />   //still instantiated
     : null
}

render() {

  let c = null
  const show = false

  if (show) {
    c = <AwesomeComponent />   //not instantiated
  }
  return c
}

4

React에서 ng-if 기능을 시뮬레이션하는 적어도 세 가지 방법을 생각할 수 있습니다.

  • 만약
  • 스위치
  • IIFE (즉시 호출 된 함수 표현)

여기에서 게시물을 읽을 수 있습니다 : Angular의 ng-if Equivalent In a React Component

기본적으로 다음과 같이하고 싶습니다.

var IfDemoComponent = React.createClass({
  render: function() {
    var el = null;
    if (this.props.showMe) {
      el = (
        <div>
          I am only included in the DOM if this.props.showMe evaluates to true.
        </div>
      );
    }
   return el;
  }
});

덕분에 나를 완전히 차단 해제하고 하루를 구했습니다! 정말 고맙습니다!
Stephen

4

false, null, undefined, 그리고 true올바른 자녀입니다. 그들은 단순히 렌더링하지 않습니다. 이 JSX 표현식은 모두 동일한 것으로 렌더링됩니다.

그래서 당신은 이것을 시도 할 수 있습니다

const conditional=({condition,someArray})=>{
     return(
        <div>
          {condition && <Header /> // condition being boolean} 
          {someArray.length>0 && <Content />}
        </div>
      )
}

이것은 React 요소를 조건부로 렌더링하는 데 유용 할 수 있습니다. 이 JSX는 if 조건이 true 인 경우에만 렌더링하고 someArray.length> 0 인 경우에만 렌더링합니다.


4

나는 코드에 삼항 연산자가 많은 것을 좋아하지 않습니다. 이것이 제가 몇 가지 유용한 구성 요소로 라이브러리를 만든 이유입니다. "RcIf"

  <RcIf if={condition} >
    <h1>I no longer miss ngif</h1>
  </RcIf>
  <RcIf if={othercondition} >
    <h1>I no longer miss v-if</h1>
    <RcElse>
      <h1>I love react</h1>
    </RcElse>
  </RcIf>

npm에서 설치할 수 있습니다.

https://www.npmjs.com/package/rc-if


3

저는 Tersus-jsx.macro의 작성자이며이 모듈이이 질문에 필요한 것을 정확히 제공한다고 생각합니다.

ng-if 또는 ng-repeat를 달성하기 위해 JSX 표현식과 ES6를 혼합하는 대신이 매크로를 사용하면 React JSX 용 AngularJS에서와 동일한 방식으로 작업을 수행 할 수 있습니다 (예 : ng-if).

<div>
  <button
    tj-if={a === 0}
    id="gotoA"
    className="link"
    onClick={clicking}
  />
</div>

이는

<div>
  {(a === 0) && (
    <button
      id="gotoA"
      className="link"
      onClick={clicking}
    />
  )}
</div>

최신 버전의 create-react-app이 Babel-Macro를 기본적으로 지원한다는 점을 감안할 때, npm이이 모듈을 설치하고 렌더 리턴을 "tersus"로 감싸고 해당 소품을 할당하기 시작하면됩니다.

https://www.npmjs.com/package/tersus-jsx.macro 에서 설치할 수 있습니다.


훌륭한 패키지!
secavfr

2

나는 각진 배경에서도 왔으며 변수에 요소가 있으면 태그를 표시하는 간단한 라이너를 찾고있었습니다. 이것은 나를 위해 일했습니다.

<div className="comic_creators">
    {c.creators.available > 0 ? <h4>Creators</h4> : null }
    {c.creators.items.map((creator,key) =>
        <Creator creator={creator} key={key}></Creator>
    )}
</div>

0

표현이 진실이고 다른 하나가 옵션 인 경우를 대비하여 표현과 두 개의 또 다른 인수를 템플릿으로 취하는 방법을 만듭니다.

export function rif(exp, template, elseTemplate = null) {
    if (exp) {
        return template;
    } else {
        return elseTemplate;
    }
}

이렇게 사용합니다

import { rif } from '../utilities';

...
render() {
        return (
            <main role="main" className="container">

                {rif(
                    this.movies.length > 0,
                    <p>Showing {this.movies.length} movies. </p>,
                    <p>There are no movies..</p>
                )}
            </main>
        );
    }

0

개인적으로 나는 게터를 사용하는 것을 좋아하며 깨끗하고 반응성을 보장합니다.

get toBeDisplayed(){
  const { someLogicState } = this.state;
  if(someLogicState)
    return (
      <div>
        Hi, world !
      </div>
    );
  else
    return null;
}

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

0

나는 각도와 반응을 동시에하고있다. angular다른 지시문을 통해 논리적 조건을 잘 관리 한다고 생각 합니다.

reactjs이 접근 방식 에서는 다른 방식으로 작동합니다.

당신은 사용할 수 있습니다 if else로 조건을 returnrender functionternary operator.

그렇지 않으면

  render(){
    
    const auth = true;
    
    if(!auth)
      return(
      <div className="ps-checkout__login">
        <div className="d-flex flex-row">
            <div className="p-2"><img src="../../../static/img/return-customer.png"></img> 
             Returning Customer?</div>
            <div className="p-2"> 
                <Link href="/account/login">
                    <a>                            
                        Click here to login
                    </a>
                </Link>
            </div>
        </div>
    </div>
    )
  else return null;
    }

삼항 연산자 사용

{ auth?
    (<div className="ps-checkout__login">
        <div className="d-flex flex-row">
            <div className="p-2"><img src="../../../static/img/return-customer.png"></img> 
            Returning Customer?</div>
            <div className="p-2"> 
                <Link href="/account/login">
                    <a>                            
                        Click here to login
                    </a>
                </Link>
            </div>
        </div>
    </div>):null } 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.