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”?


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'

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.