2016-06-20 8 views
0

Ich habe eine Präsentationskomponente namens Navbar.jsx, die eine weitere Präsentationskomponente basierend darauf zurückgibt, ob der Benutzer authentifiziert ist oder nicht. Wenn ich Webpack starte, bekomme ich eine Fehlermeldung, dass das "if" in meiner if-Anweisung ein unerwartetes Token ist. Sie sehen die if else-Anweisung im Navbar-Collapse-div. Hier ist Navbar.jsx:Die if-Anweisung in der return-Anweisung meiner Präsentationskomponente wirft einen unerwarteten Token-Fehler

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; 

Antwort

2

Sie können nicht if-else Aussagen in JSX verwenden. Schauen Sie sich the relevant docs an.


Verwenden Sie stattdessen den ternären Operator:

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

Wissen Sie, warum eine sofort aufgerufene Funktion in JSX funktioniert, aber wenn sonst Anweisung nicht? – Mjuice

+0

@Mjuice JSX Tags sind Zucker für Funktionsaufrufe (oder Objektliterale) - es funktioniert nicht aus dem gleichen Grund eine 'if' /' else' Anweisung in einem anderen Funktionsaufruf würde nicht funktionieren - es ist kein Ausdruck, der zurückgibt ein Wert, während ein IIFE ist. –

+0

Also wenn ich hier ein IIFE in meine geschweiften Klammern steckte, und dann eine If else-Anweisung innerhalb des IIFE mit einem "Return" -Aufruf auf irgendeinen Wert verwendete, sollte das nicht funktionieren? – Mjuice

3

IIFE und ternäre Ausdrücke können in JSX arbeiten, weil sie Javascript expressions sind; if Aussagen sind nicht.

Eine kleine Änderung am Beispiel des offiziellen doc es deutlicher zu machen: 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); 

Sie mit Babel REPL spielen, um für einige gültige Ausdrücke, um zu sehen, wie Ihr JSX umgewandelt wird.

+0

Wenn ich eine if else Kette in eine IIFE wickelte und dann in meine jsx steckte, würde das funktionieren? Ich sehe in den React-Dokumenten, die Sie verlinkt haben, sie verwenden eine switch-Anweisung in einem IIFE, ich habe wirklich Schwierigkeiten, den Unterschied zwischen dem, was ein Ausdruck ist, und dem, was nicht ist, zu verstehen. – Mjuice

+0

Ja, wenn Sie sonst in IIFE arbeiten würden, solange Sie ein Element für jeden Fall zurückgeben. Ausdruck ist etwas, das einen Wert erzeugt. Siehe diesen Link: http://www.2ality.com/2012/09/expressions-vs-statements.html?m=1 – xyc

+0

Stellen Sie sich vor, Sie lassen activeUser = wenn ... sonst ... Es würde nicht funktionieren. Tausche das mit IIFE es wird. – xyc