2016-03-28 21 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)

Problemi correlati