Kiedy należy używać curly szelki do ES6 import?
Wydaje się to oczywiste, ale znalazłem się trochę zdezorientowany, kiedy używać curly szelki do importowania pojedynczego modułu w ES6. Na przykład, w projekcie React-Native, nad którym pracuję, mam następujący plik i jego zawartość:
stan początkowy.jsvar initialState = {
todo: {
todos: [
{id: 1, task: 'Finish Coding', completed: false},
{id: 2, task: 'Do Laundry', completed: false},
{id: 2, task: 'Shopping Groceries', completed: false},
]
}
};
export default initialState;
W TodoReducer.js, muszę go zaimportować bez kręconych szelek:
import initialState from './todoInitialState';
Jeśli załączam initialState
w nawiasach klamrowych, otrzymuję następujący błąd dla następującej linii kodu:
TodoReducer.js:Nie można odczytać właściwości todo of undefined
export default function todos(state = initialState.todo, action) {
// ...
}
Podobne błędy zdarzają się również moim komponentom z klamrami kręconymi. Zastanawiałem się, kiedy powinienem użyć klamry curly do pojedynczego importu, ponieważ oczywiście, podczas importowania wielu komponentów / modułów, trzeba je załączyć w klamry curly, co wiem.
Edit:
Post SO w tutaj nie odpowiada na moje pytanie, zamiast tego pytam kiedy powinienem lub nie powinienem używać klamr do importowania W ES6 nie powinno się używać klamr curly do importowania pojedynczego modułu (widocznie tak nie jest, ponieważ widziałem pojedynczy import z klamrami curly)
8 answers
To jest domyślny import:
// B.js
import A from './A'
Działa tylko wtedy, gdy A
mA domyślny eksport :
// A.js
export default 42
W tym przypadku nie ma znaczenia, jaką nazwę przypisujesz do niego podczas importowania:
// B.js
import A from './A'
import MyA from './A'
import Something from './A'
Ponieważ zawsze będzie rozdzielać się na dowolny domyślny eksport z A
.
To jest nazwa import o nazwie A
:
import { A } from './A'
Działa tylko wtedy, gdy A
zawiera o nazwie export A
:
export const A = 42
W tym przypadku nazwa ma znaczenie, ponieważ importujesz konkretną rzecz po jej nazwie eksportowej :
// B.js
import { A } from './A'
import { myA } from './A' // Doesn't work!
import { Something } from './A' // Doesn't work!
Aby te zadziałały, należy dodać odpowiadającą nazwie export do A
:
// A.js
export const A = 42
export const myA = 43
export const Something = 44
Moduł może mieć tylko jeden domyślny eksport , ale tyle nazwanych eksportów, ile chcesz (zero, jeden, dwa lub wiele). Możesz zaimportować je wszystkie razem:
// B.js
import A, { myA, Something } from './A'
Tutaj importujemy domyślny eksport jako A
, oraz nazwanych eksportów odpowiednio myA
i Something
.
// A.js
export default 42
export const myA = 43
export const Something = 44
Możemy również przypisać im wszystkie różne nazwy podczas importowania:
// B.js
import X, { myA as myX, Something as XSomething } from './A'
Domyślny eksport jest zazwyczaj używany do tego, czego normalnie oczekujesz od modułu. Nazwy eksportu są zazwyczaj używane dla narzędzi, które mogą być przydatne, ale nie zawsze są konieczne. Jednak to do ciebie należy wybór sposobu eksportu rzeczy: na przykład moduł może nie mieć domyślnego eksportu w wszystkie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-30 15:08:59
TL; DR: nawiasy klamrowe są używane, jeśli chcesz zaimportować niestandardowy eksport.
Zobacz odpowiedź dana Abramovsa powyżej, aby uzyskać więcej szczegółów.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-28 14:50:45
Powiedziałbym, że istnieje również zapis gwiazdkowy dla słowa kluczowego import
ES6, o którym warto wspomnieć.
If you try to console log Mix:
import * as Mix from "./A";
console.log(Mix);
Otrzymasz:
Kiedy należy używać curly braces do importu ES6?
Nawiasy są złote, gdy potrzebujesz tylko określonych komponentów z modułu, co sprawia, że mniejsze footprinty dla bundlerów, takich jak webpack.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-30 00:19:11
Dan Abramov odpowiedź powyżej wyjaśnia o domyślnych eksportach i nazwanych eksportach .
Którego użyć?
cytując Davida Hermana : ECMAScript 6 faworyzuje pojedynczy / domyślny styl eksportu i daje najsłodszą składnię importowania domyślnego. Importowanie nazwanego eksportu może, a nawet powinien być nieco mniej zwięzły.
Jednak w maszynopisie o nazwie export jest preferowany ze względu na refaktoryzację. Przykład, jeśli domyślnie eksportujesz klasę i zmieniasz nazwę to, nazwa klasy zmieni się tylko w tym pliku, a nie w innych referencjach, z nazwanym eksportem nazwa klasy zostanie zmieniona we wszystkich referencjach. Eksport nazw jest również preferowany dla narzędzi.
Ogólnie używaj, co chcesz.
Dodatkowe
Default export jest w rzeczywistości nazwanym eksportem z name default, więc default export może być importowany jako:
import {default as Sample} from '../Sample.js';
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-31 06:21:57
Jeśli myślisz o import
jako o cukrze składniowym dla modułów węzłów, obiektów i destrukcji, uważam, że jest to dość intuicyjne.
// bar.js
module = {};
module.exports = {
functionA: () => {},
functionB: ()=> {}
};
// really all that is is this:
var module = {
exports: {
functionA, functionB
}
};
// then, over in foo.js
// the whole exported object:
var fump = require('./bar.js'); //= { functionA, functionB }
// or
import fump from './bar' // same thing, object functionA and functionB props
// just one prop of the object
var fump = require('./bar.js').functionA;
// same as this, right?
var fump = { functionA, functionB }.functionA;
// and if we use es6 destructuring:
var { functionA } = { functionA, functionB };
// we get same result
// so, in import syntax:
import { functionA } from './bar';
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-30 03:44:58
Aby zrozumieć użycie nawiasów klamrowych w wypowiedziach import
, najpierw trzeba zrozumieć pojęcie destrukcji wprowadzone w ES6
-
Destrukcja obiektów
var bodyBuilder = { firstname: 'Kai', lastname: 'Greene', nickname: 'The Predator' }; var {firstname, lastname} = bodyBuilder; console.log(firstname, lastname); //Kai Greene firstname = 'Morgan'; lastname = 'Aste'; console.log(firstname, lastname); // Morgan Aste
-
Destrukcja tablicy
var [firstGame] = ['Gran Turismo', 'Burnout', 'GTA']; console.log(firstGame); // Gran Turismo
Using list matching
var [,secondGame] = ['Gran Turismo', 'Burnout', 'GTA']; console.log(secondGame); // Burnout
Używając operatora spreadu
var [firstGame, ...rest] = ['Gran Turismo', 'Burnout', 'GTA']; console.log(firstGame);// Gran Turismo console.log(rest);// ['Burnout', 'GTA'];
Teraz, gdy mamy to z drogi, w ES6 możesz eksportować wiele modułów. Następnie możesz użyć destrukcji obiektów, jak poniżej
Załóżmy, że masz moduł o nazwie module.js
export const printFirstname(firstname) => console.log(firstname);
export const printLastname(lastname) => console.log(lastname);
Chcesz zaimportować wyeksportowane funkcje do index.js
;
import {printFirstname, printLastname} from './module.js'
printFirstname('Taylor');
printLastname('Swift');
Można również używać różnych nazw zmiennych jak tak
import {printFirstname as pFname, printLastname as pLname} from './module.js'
pFname('Taylor');
pLanme('Swift');
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-07 08:33:07
Zazwyczaj podczas eksportowania funkcji musisz użyć {}
if you have export const x
Używasz
import {x} from ''
if you use export default const x
Musisz użyć import X from ''
tutaj możesz zmienić X na dowolną zmienną
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-07 14:43:09
Nawiasy klamrowe ({}) są używane do importowania nazwanych wiązań i koncepcją stojącą za nimi jest przypisanie destrukcji
Prosta demonstracja działania instrukcji import na przykładzie znajduje się w mojej własnej odpowiedzi na podobne pytanie pod adresem kiedy używamy '{ }' w importach javascript?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-08 19:20:36