Dlaczego składnik ES6 React działa tylko z „domyślnym eksportem”?

241

Ten komponent działa:

export class Template extends React.Component {
    render() {
        return (
            <div> component </div>
        );
    }
};
export default Template;

Jeśli usunę ostatni wiersz, to nie zadziała.

Uncaught TypeError: Cannot read property 'toUpperCase' of undefined

Chyba nie rozumiem czegoś w składni es6. Czy to nie musi eksportować bez znaku „default”?

stkvtflw
źródło
7
możesz napisać jako export default class Template extends React.Component {
andykenward
Wiem. Ale jak mogę zaimportować komponent, który został wyeksportowany bez „domyślnego”? Powinno być możliwe
stkvtflw
2
@stkvtflw Jeśli odpowiedziałem na twoje pytanie, zaakceptuj je, aby inni użytkownicy również mogli skorzystać.
Jed Richards,

Odpowiedzi:

571

Eksportowanie bez defaultoznacza, że ​​jest to „nazwany eksport”. Możesz mieć wiele nazwanych eksportów w jednym pliku. Więc jeśli to zrobisz,

class Template {}
class AnotherTemplate {}

export { Template, AnotherTemplate }

następnie musisz zaimportować te eksporty, używając ich dokładnych nazw. Aby użyć tych składników w innym pliku, który musisz zrobić,

import {Template, AnotherTemplate} from './components/templates'

Alternatywnie, jeśli eksportujesz jako taki defaulteksport,

export default class Template {}

Następnie w innym pliku importowania domyślny eksport bez użycia {}, tak,

import Template from './components/templates'

Może istnieć tylko jeden domyślny eksport na plik. W React konwencją jest eksportowanie jednego komponentu z pliku i eksportowanie go jako domyślnego eksportu.

Podczas importowania możesz zmienić nazwę domyślnego eksportu,

import TheTemplate from './components/templates'

Możesz jednocześnie importować domyślny i nazwany eksport,

import Template,{AnotherTemplate} from './components/templates'
Jed Richards
źródło
12
DOBRZE. Ale wydaje się to kolejną pozornie arbitralną decyzją, dla której nie widzę uzasadnienia, ale muszę ją zapamiętać. Czy brakuje mi jakiegoś dobrego powodu, że tak jest? W wielu projektach będą dziesiątki komponentów React. Posiadanie każdego własnego pliku, bez względu na to, jak małe, wydaje się nieco analne. Jest to szczególnie bolesne, gdy wielu z nich korzysta z grup pomocników. Powoduje to, że więcej linii rzeczy pozostaje w synchronizacji, co wydaje się nieco sprzeczne z dobrem. czego mi brakuje?
9
Dziękuję Ci. Myślę, że odpowiedź doskonale wyjaśnił następująco: import React, {Component} from 'react';.
Qian Chen
10
Dobra odpowiedź. Mam coś do dodania: spróbuj użyć instrukcji importu w następujący sposób: import RaisedButton from 'material-ui/RaisedButton'; zamiast tego Sprawi import {RaisedButton} from 'material-ui'; to, że proces kompilacji będzie szybszy, a wydajność kompilacji mniejsza.
Shekhar Kumar
4
@ShekharKumar Czy masz źródło import Binding from 'module/Binding'większej wydajności niż import {Binding} from 'module'?
Jeevan Takhar
4

Dodaj {} podczas importowania i eksportowania: export { ... };| import { ... } from './Template';

eksportimport { ... } from './Template'

eksportuj domyślnieimport ... from './Template'


Oto działający przykład:

// ExportExample.js
import React from "react";

function DefaultExport() {
  return "This is the default export";
}

function Export1() {
  return "Export without default 1";
}

function Export2() {
  return "Export without default 2";
}

export default DefaultExport;
export { Export1, Export2 };

// App.js
import React from "react";
import DefaultExport, { Export1, Export2 } from "./ExportExample";

export default function App() {
  return (
    <>
      <strong>
        <DefaultExport />
      </strong>
      <br />
      <Export1 />
      <br />
      <Export2 />
    </>
  );
}

⚡️ Robocza piaskownica do zabawy: https://codesandbox.io/s/export-import-example-react-jl839?fontsize=14&hidenavigation=1&theme=dark

Hasan Sefa Ozalp
źródło