Можно ли использовать if... else... в функции React render?
В принципе, у меня есть реагирующий компонент, его тело тела render()
выглядит следующим образом: (Это мой идеальный, что означает, что он в настоящее время не работает)
render(){
return (
<div>
<Element1/>
<Element2/>
// note: code does not work here
if (this.props.hasImage) <MyImage />
else <OtherElement/>
</div>
)
}
Ответы
Ответ 1
Не так, но есть обходные пути. Там раздел в React docs об условном рендеринге, который вы должны посмотреть. Вот пример того, что вы могли бы сделать, используя inline 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>
);
Ответ 2
Сокращение для структуры if else работает как ожидалось в JSX
this.props.hasImage ? <MyImage /> : <SomeotherElement>
Вы можете найти другие варианты этого блога DevNacho, но чаще это делается с сокращением. Если вам нужно иметь более важное предложение if, вы должны написать функцию, которая возвращает компонент или компонент A или.
например:
this.setState({overlayHovered: true});
renderComponentByState({overlayHovered}){
if(overlayHovered) {
return <overlayHoveredComponent />
}else{
return <overlayNotHoveredComponent />
}
}
Вы можете разрушить свой overlayHovered из this.state, если вы укажете его как параметр. Затем выполните эту функцию в методе render():
renderComponentByState(this.state)
Ответ 3
Может быть, я слишком поздно здесь. Но я надеюсь, что это поможет кому-то. Сначала отделите эти два элемента.
renderLogout(){
<div>
<LogoutButton onClick={this.handleLogoutClick} />
<div>
}
renderLogin(){
<div>
<LoginButton onClick={this.handleLoginClick} />
<div>
}
Затем вы можете вызывать эти функции из функции render, используя инструкцию if else.
render(){
if(this.state.result){
return this.renderResult();
}else{
return this.renderQuiz();
}}
Это работает для меня.:)