В принципе, у меня есть компонент React, его render()
тело функции выглядит следующим образом: (Это мой идеальный вариант, что означает, что в настоящее время он не работает)
render(){
return (
<div>
<Element1/>
<Element2/>
// note: code does not work here
if (this.props.hasImage) <MyImage />
else <OtherElement/>
</div>
)
}
Ответы:
Не совсем так, но есть обходные пути. В документации React есть раздел об условном рендеринге, который вам следует изучить. Вот пример того, что можно сделать с помощью встроенного if-else.
render() { const isLoggedIn = this.state.isLoggedIn; return ( <div> {isLoggedIn ? ( <LogoutButton onClick={this.handleLogoutClick} /> ) : ( <LoginButton onClick={this.handleLoginClick} /> )} </div> ); }
Вы также можете справиться с этим внутри функции рендеринга, но перед возвратом 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> );
источник
isTrue ? <div>Something</div> : null
, просто сделайтеisTrue && <div>Something</div>
На самом деле есть способ сделать именно то, что просит OP. Просто визуализируйте и вызовите анонимную функцию следующим образом:
render () { return ( <div> {(() => { if (someCase) { return ( <div>someCase</div> ) } else if (otherCase) { return ( <div>otherCase</div> ) } else { return ( <div>catch all</div> ) } })()} </div> ) }
источник
Вы можете оказать ничего используя
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> ); }
источник
Вы должны помнить об операторе 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> ) }
источник
Если вы хотите, чтобы условие отображало элементы, вы можете использовать что-то вроде этого.
renderButton() { if (this.state.loading) { return <Spinner size="small" spinnerStyle={styles.spinnerStyle} />; } return ( <Button onPress={this.onButtonPress.bind(this)}> Log In </Button> ); }
Затем вызовите вспомогательный метод внутри функции рендеринга.
<View style={styles.buttonStyle}> {this.renderButton()} </View>
Или вы можете использовать другой способ выражения внутри return.
{this.props.hasImage ? <element1> : <element2>}
источник
Сокращение для структуры 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 /> } }
Вы можете деструктурировать свой overlayHovered из this.state, если укажете его как параметр. Затем выполните эту функцию в своем методе render ():
renderComponentByState(this.state)
источник
Если вам нужно более одного условия, вы можете попробовать это
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> ); } }
источник
Тип 1:
If
стиль заявления{props.hasImage && <MyImage /> }
Тип 2:
If else
стиль заявления{props.hasImage ? <MyImage /> : <OtherElement/> }
источник
Может, я здесь слишком поздно. Но я надеюсь, что это кому-то поможет. Сначала разделите эти два элемента.
Затем вы можете вызвать эти функции из функции рендеринга, используя оператор if else.
render(){ if(this.state.result){ return this.renderResult(); }else{ return this.renderQuiz(); }}
У меня это работает. :)
источник
источник
Вы также можете использовать условный (тернарный) оператор внутри условного оператора, если у вас есть 2 разные зависимости.
{ (launch_success) ? <span className="bg-green-100"> Success </span> : (upcoming) ? <span className="bg-teal-100"> Upcoming </span> : <span className="bg-red-100"> Failed </span> }
источник
Попробуйте использовать регистр Switch или тернарный оператор
render(){ return ( <div> <Element1/> <Element2/> // updated code works here {(() => { switch (this.props.hasImage) { case (this.props.hasImage): return <MyImage />; default: return ( <OtherElement/>; ); } })()} </div> ) }
Это сработало для меня и должно сработать для вас. Попробуйте тернарный оператор
источник