2016-06-20 3 views
0

У меня есть презентационный компонент, называемый Navbar.jsx, который возвращает другой презентационный компонент на основе того, аутентифицирован ли пользователь или нет. Когда я запускаю webpack, я получаю сообщение о том, что «if» в моей инструкции if является неожиданным токеном. Вы увидите инструкцию if else в div-bar. Вот Navbar.jsx:Оператор if в операторе return моего текущего компонента бросает непредвиденную ошибку маркера

import React, {PropTypes} from 'react'; 
import PreAuthNavTabs from './PreAuthNavTabs'; 
import PostAuthNavTabs from './PostAuthNavTabs'; 

const Navbar = ({ activeUser, loginUser }) => { 

    return (
     <div> 
      <div className="navbar navbar-default navbar-fixed-top" role="navigation"> 
       <div className="container"> 
       <div className="navbar-header"> 
        <button type="button" className="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> 
        <span className="sr-only">Toggle Navigaton</span> 
         <span className="icon-bar"></span> 
         <span className="icon-bar"></span> 
         <span className="icon-bar"></span> 
        </button> 
        <Link to="/inventory"><img className="navbar-brand" src='../../css/hello_bacsi.png'></img></Link> 
       </div> 
       <div className="navbar-collapse collapse"> 
          { 
           if (activeUser) { 
            return <PostAuthNavTabs activeUser={activeUser} />; 
           } else { 
            return <PreAuthNavTabs loginUser={loginUser} />; 
           } 
          } 
       </div> 
       </div> 
      </div> 
      </div> 
    ); 

}; 

Navbar.propTypes = { 
    activeUser: PropTypes.object, 
    loginUser: PropTypes.func 
}; 

export default Navbar; 

ответ

2

Вы не можете использовать if-else заявления в JSX. Посмотрите на the relevant docs.


Вместо этого используйте тройной оператор:

<div className="navbar-collapse collapse"> 
    {activeUser ? 
     <PostAuthNavTabs activeUser={activeUser} /> : 
     <PreAuthNavTabs loginUser={loginUser} /> 
    } 
</div> 
+0

Знаете ли вы, почему функция, вызываемая немедленно, будет работать в JSX, но если инструкция else отсутствует? – Mjuice

+0

@Mjuice JSX теги - это сахара для вызовов функций (или литералов объектов) - это не работает по той же причине, что и оператор 'if' /' else' в любом другом вызове функции не работает - это не выражение, которое возвращает значение, тогда как IIFE. –

+0

Итак, если я запустил IIFE в свои фигурные скобки здесь, а затем использовал оператор If else внутри IIFE с вызовом «return» на какое-то значение, не должно ли это работать? – Mjuice

3

IIFE и тройные выражения могут работать в JSX, потому что они Javascript expressions; if утверждений нет.

Немного модификации на примере официального дока, чтобы сделать его более ясным: if-else in JSX

// This JSX: 
<div id={if (condition) { 'msg' }}>Hello World!</div> 

// Is transformed to this JS: 
const props = { 
    id: if (condition) { 'msg' } // which isn't valid JavaScript 
} 
const children = "Hello World!" 
React.createElement("div", props, children); 

Вы можете играть с Babel REPL для некоторых корректных выражений, чтобы увидеть, как JSX трансформируются.

+0

Если бы я завернул цепочку if else в IIFE, а затем подключил ее к моему jsx, это сработает? Я вижу в документах React, которые вы связали, они используют оператор switch в IIFE, мне действительно трудно понять разницу между тем, что является выражением, а что нет. – Mjuice

+0

Да, обертка, если еще в IIFE будет работать, пока вы возвращаете элемент для каждого случая. Выражение - это нечто, что дает значение. См. Эту ссылку: http://www.2ality.com/2012/09/expressions-vs-statements.html?m=1 – xyc

+0

Представьте, что вы разрешите activeUser = if ... else ... Это не сработает. Поменяйте это на IIFE. – xyc

Смежные вопросы