2015-08-26 14 views
16

To jest część pytania ES6 Pytanie odpowiedzi. Próbuję użyć namespaced components w React z klasami ES6 i Babel. Więc myślę, że prawdziwe pytanie brzmi jak nazwa klasy ES6 przestrzeń więc mogę robić to, co jest wyjaśnione tutaj: https://facebook.github.io/react/docs/jsx-in-depth.html#namespaced-componentsJak nazwać klasę es6 (dla komponentów React)

Ponieważ otrzymuję nieoczekiwane tokena błąd:

class Headline extends Component { ... } 

class Headline.Primary extends Component { ... 
      ^
+1

Chyba problably powinien pracować z modułami [] (http: // www.2ality.com/2014/09/es6-modules-final.html), ponieważ ES6 nie ma pojęcia przestrzeni nazw. –

Odpowiedz

13

To naprawdę nie zmienia się z ES6, nadal będzie musiał wykonać zadanie:

Headline.Primary = class Primary extends Component { … }; 

Jednak , używając klas takich jak Headline, ponieważ przestrzenie nazw stają się dość przestarzałe w przypadku ES6 (i tak jak poprzednio były wątpliwą praktyką), powinieneś zamiast tego wykorzystać nowy system modułów. Wyeksportuj Primary jako nazwany eksport i zamiast importować klasę Headline, należy wykonać raczej import * as headlines from ….

+0

wszystkie dobre odpowiedzi, skończyło się importowanie * – Ben

+0

Możesz bezpiecznie zmienić 'klasę podstawową' na" klasa "i uczynić ją * anonimowym * wyrażeniem klasy.(W przeciwnym razie nazwa 'Primary' (bez prefiksu przestrzeni nazw) byłaby dostępna * wewnątrz * tej klasy oprócz prefiksowanej nazwy.) – caw

+0

@ caw Nie, nazwane wyrażenia' class' nie udostępniają identyfikatora w swoim zakresie , w przeciwieństwie do nazwanych wyrażeń 'function'. To tylko sprawia, że ​​nazwa jest jednoznaczna (i, w niektórych przypadkach, konieczne jest nadanie konstruktorowi jego własności '.name') – Bergi

19

Składnia ECMAScript-6 class declaration oczekuje standardowy BindingIdentifer jako nazwa klasy. Kropka nie jest poprawnym znakiem w nazwie identyfikatora.

W kontekście używanym w łączu w OP "przestrzeń nazw" jest obiektem, a właściwości są dodawane do tego obiektu, jeden po drugim, przy użyciu zapisu punktowego dla dostępu do właściwości.

Można replikować, że za pomocą ekspresji klasy zamiast:

'use strict' 
 

 
var ns = {} 
 

 
ns.MyClass = class { 
 
    constructor() { 
 
    console.log('in constructor') 
 
    } 
 
} 
 

 
new ns.MyClass()

+1

Yeees, yeeeesss, tego właśnie szukałem! Nie wiedziałeś, że możesz pisać tak, jak gdyby 'coś.something = klasa rozszerza coś.baseSomething {}' –

+2

To podejście z anonimową klasą wydaje się nieudane w połączeniu z 'extends'. :( – faintsignal

+0

@faintsignal Czy to naprawdę? Powinno działać dobrze, ponieważ nazwa w wyrażeniu klasowym jest opcjonalna – caw

8

Ten link również odnosi się do tego pytania.

w module obiektów sekcji opisano, że można zrobić coś takiego:

// headline.js file 
export {Headline, Primary} 
class Headline {} 
class Primary {} 

// In another module... 

import * as Headline from "headline"; 

let h = new Headline.Headline(); 
let hp = new Headline.Primary(); 

To nie jest dokładnie to, co staramy się robić, ale jest alternatywa.

Innym sposobem robi to jest prawie jak @Bergi wskazał już, ale ja po prostu wyjaśnienia go dalej:

let Headline = class Headline extends Component { } 
Headline.Primary = class Primary extends Component { } 

export {Headline as default} 

// in another module: 
import Headline from 'headline'; 

let headline = new Headline(); 
let primary = new Headline.Primary(); 
+0

Jeśli chodzi o twój drugi fragment, nie zrobiłbyś "* as" z tym domyślnym eksportem, prawda? – Bergi

+1

Zgadza się. Skopiowałem i wkleiłem tekst i zapomniałem edytować. Thank's =] –

Powiązane problemy