2015-11-04 17 views
36

Ich hatte den Eindruck, dass diese Syntax:ES6 Destrukturierung und Modulimporte

import Router from 'react-router'; 
var {Link} = Router; 

das gleiche Endergebnis wie diese hat:

import {Link} from 'react-router'; 

Kann jemand erklären, was der Unterschied ist?

(Ursprünglich dachte ich, es war ein React Router Bug.)

+3

Leider die gleiche Stenografie Syntax sie haben, aber wenn man ihre langen Formen überprüfen sind sie deutlich anders : 'var {" Link ": Link} = Router;' vs 'Importieren {Link als Link} von '...';' – Bergi

Antwort

60
import {Link} from 'react-router'; 

die Eigenschaft ein namens Export von react-router, also so etwas wie

export const Link = 42; 

import Router from 'react-router'; 
const {Link} = Router; 

zieht importiert Link von der Standardexport, unter der Annahme, dass es sich um ein Objekt handelt, z.B.

(der Standard-Export ist eigentlich nichts anderes als ein standardisierter benannter Export mit dem Namen "default").

Siehe auch export on MDN.

Komplettes Beispiel:

// react-router.js 
export const Link = 42; 
export default { 
    Link: 21, 
}; 


// something.js 
import {Link} from './react-router'; 
import Router from './react-router'; 
const {Link: Link2} = Router; 

console.log(Link); // 42 
console.log(Link2); // 21 

Mit Babel 5 und unten Ich glaube, sie wegen der Art und Weise ES6 Module transpiled bis Commonjs wurden austauschbar waren. Aber das sind zwei verschiedene Konstrukte, soweit es die Sprache betrifft.

+3

Große Antwort. Die Syntax zum Importieren eines benannten Exports wird sehr leicht für die dekonstruierende Syntax eines Objekts verwechselt. – Federico

+0

Babel 6 macht * nicht * macht die beiden austauschbar. In acht nehmen! – sdgfsdh

4

dies zu tun:

import {purple, grey} from 'themeColors'; 

Ohne export const für jedes Symbol zu wiederholen, nur tun:

export const 
    purple = '#BADA55', 
    grey = '#l0l', 
    gray = grey, 
    default = 'this line actually causes an error';