2016-03-28 52 views
103

vedo che quanto segue va bene:Perché 'Esporta valore predefinito' non è valido?

const Tab = connect(mapState, mapDispatch)(Tabs); 
export default Tab; 

Tuttavia, questo non è corretto:

export default const Tab = connect(mapState, mapDispatch)(Tabs); 

Ma questo va bene:

export default Tab = connect(mapState, mapDispatch)(Tabs); 

si può spiegare prega perché const è non valido con export default? E 'un'aggiunta non necessaria & qualsiasi cosa dichiarata come export default si presume uno const o simile?

risposta

120

const è come let, it is a LexicalDeclaration (VariableStatement, Dichiarazione) usato per definire un identificatore nel blocco.

Si sta provando a mescolare questo con la parola chiave default, which expects a HoistableDeclaration, ClassDeclaration or AssignmentExpression per seguirlo.

Pertanto è un SintassiErrore.


Se si vuole const qualcosa è necessario fornire l'identificativo e non usare default.

export da solo accetta un VariableStatement o Dichiarazione alla sua destra.


AFAIK l'esportazione di per sé non dovrebbe aggiungere nulla alla portata attuale.


Quello che segue è bene export default Tab;

Tab diventa un AssignmentExpression come è dato il nome di default ?

export default Tab = connect(mapState, mapDispatch)(Tabs); va bene

Qui Tab = connect(mapState, mapDispatch)(Tabs); è un AssignmentExpression.

+4

La risposta è come è diventato un errore. La domanda è ancora perché? L'unica ragione per cui previene l'abuso di const in questo modo: export default const a = 1, b = 3, c = 4; –

+1

'" AFAIK l'esportazione di per sé non dovrebbe aggiungere nulla al tuo ambito corrente "' Questo non è molto accurato, perché 'export const a = 1' aggiunge' a' al tuo contesto attuale. E anche con 'export default' in caso di classi, dato che' esporta la classe di default MyClass {} 'aggiunge' MyClass' al tuo contesto corrente. – Ernesto

+1

@SergeyOrlov concorda sul fatto che questo spiega come questo genera un errore, ma getta poca luce sul motivo per cui è necessario. Anche se non sono sicuro che sia l'unica ragione, probabilmente dovresti postarla come una risposta separata, non un commento a questo. – Herick

18

si può anche fare una cosa del genere, se si desidera esportare predefinito un const/lasciare che, invece di

const MyComponent = ({ attr1, attr2 }) => (<p>Now Export On other Line</p>); 
export default MyComponent 

Si può fare qualcosa di simile, che non mi piace personalmente.

let MyComponent; 
export default MyComponent = ({ }) => (<p>Now Export On SameLine</p>); 
+2

'const MyComponent;' non è una sintassi valida - un 'const' deve essere assegnato nella stessa istruzione in cui è definito. – configurator

+1

Mi dispiace, mio ​​male, ho corretto quella cosa. –

3

La risposta di Paul è quella che stai cercando.Tuttavia, in termini pratici, penso che potresti essere interessato allo schema che ho utilizzato nelle mie app React + Redux.

Ecco un esempio stripped-down da uno dei miei percorsi, che mostra come è possibile definire il componente ed esportarlo come default con una singola istruzione:

import React from 'react'; 
import { connect } from 'react-redux'; 

@connect((state, props) => ({ 
    appVersion: state.appVersion 
    // other scene props, calculated from app state & route props 
})) 
export default class SceneName extends React.Component { /* ... */ } 

(Nota: io uso il termine "Scene" per il componente di livello superiore di qualsiasi percorso).

Spero che questo sia utile. Penso che sia molto più pulito rispetto al convenzionale connect(mapState, mapDispatch)(BareComponent)