Ivan Zotov
8 years ago
committed by
Dan Abramov
1 changed files with 81 additions and 0 deletions
@ -0,0 +1,81 @@ |
|||
--- |
|||
id: if-else-in-JSX |
|||
title: If-Else в JSX |
|||
layout: tips |
|||
permalink: tips/if-else-in-JSX-ru-RU.html |
|||
prev: inline-styles-ru-RU.html |
|||
next: self-closing-tag.html |
|||
--- |
|||
|
|||
Некоторые конструкции, такие как `if-else`, нельзя использовать внутри JSX, так как JSX в результате преобразуется в вызов функции JS, как показано в примере: |
|||
|
|||
```js |
|||
// JSX: |
|||
ReactDOM.render(<div id="msg">Hello World!</div>, mountNode); |
|||
|
|||
// Преобразованный в JS: |
|||
ReactDOM.render(React.createElement("div", {id:"msg"}, "Hello World!"), mountNode); |
|||
``` |
|||
|
|||
Это означает что оператор `if` нельзя встроить таким образом: |
|||
|
|||
```js |
|||
// JSX: |
|||
<div id={if (condition) { 'msg' }}>Hello World!</div> |
|||
|
|||
// Преобразованный в JS: |
|||
React.createElement("div", {id: if (condition) { 'msg' }}, "Hello World!"); |
|||
``` |
|||
|
|||
В результате преобразования получается неверный JS код. В таких случаях используется тернарный условный оператор: |
|||
|
|||
```js |
|||
ReactDOM.render(<div id={condition ? 'msg' : null}>Hello World!</div>, mountNode); |
|||
``` |
|||
|
|||
Если тернарного оператора недостаточно, вы можете вынести оператор `if`, определяющий выбор компонентов, вне JSX: |
|||
|
|||
```js |
|||
var loginButton; |
|||
if (loggedIn) { |
|||
loginButton = <LogoutButton />; |
|||
} else { |
|||
loginButton = <LoginButton />; |
|||
} |
|||
|
|||
return ( |
|||
<nav> |
|||
<Home /> |
|||
{loginButton} |
|||
</nav> |
|||
); |
|||
``` |
|||
|
|||
Также вы можете обернуть код в [немедленно вызываемую функцию](https://en.wikipedia.org/wiki/Immediately-invoked_function_expression) и расположить её _внутри_ JSX. |
|||
|
|||
```js |
|||
return ( |
|||
<section> |
|||
<h1>Color</h1> |
|||
<h3>Name</h3> |
|||
<p>{this.state.color || "white"}</p> |
|||
<h3>Hex</h3> |
|||
<p> |
|||
{(() => { |
|||
switch (this.state.color) { |
|||
case "red": return "#FF0000"; |
|||
case "green": return "#00FF00"; |
|||
case "blue": return "#0000FF"; |
|||
default: return "#FFFFFF"; |
|||
} |
|||
})()} |
|||
</p> |
|||
</section> |
|||
); |
|||
``` |
|||
|
|||
> Примечание: |
|||
> |
|||
> В приведенном выше примере, используется [функция-стрелка](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions) из ES6 для связи со значением `this`. |
|||
|
|||
Вы можете попробовать этот синтаксис внутри [Babel REPL](https://babeljs.io/repl/). |
Loading…
Reference in new issue