Чому компонент es6 react працює лише з "експортом за замовчуванням"?


241

Цей компонент працює:

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

Якщо я видаляю останній рядок, він не працює.

Uncaught TypeError: Cannot read property 'toUpperCase' of undefined

Я думаю, я щось не розумію в синтаксисі es6. Хіба це не доведеться експортувати без знаку "за замовчуванням"?


7
ви можете написати як export default class Template extends React.Component {
andykenward

Я знаю. Але як я можу імпортувати компонент, який експортувався без "за замовчуванням"? Це повинно бути можливо
stkvtflw

2
@stkvtflw Якщо я відповів на ваше запитання, прийміть його, щоб і інші користувачі могли отримати користь.
Джед Річардс

Відповіді:


571

Експорт без defaultзасобів означає, що це "названий експорт". Ви можете мати кілька імпортованих експортів в одному файлі. Тож якщо ви це зробите,

class Template {}
class AnotherTemplate {}

export { Template, AnotherTemplate }

тоді вам доведеться імпортувати цей експорт, використовуючи їх точні назви. Отже, щоб використовувати ці компоненти в іншому файлі, який вам доведеться зробити,

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

Якщо ви експортуєте такий defaultекспорт,

export default class Template {}

Потім в інший файл ви імпортуєте експорт за замовчуванням, не використовуючи {}, наприклад,

import Template from './components/templates'

На файл може бути лише один експорт за замовчуванням. У React це домовленість експортувати один компонент з файлу, а експортувати його як експорт за замовчуванням.

Ви можете перейменувати експорт за замовчуванням під час імпорту,

import TheTemplate from './components/templates'

І ви можете одночасно імпортувати експорт за замовчуванням та ім’я,

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

12
ГАРАЗД. Але це здається ще одним, здавалося б, довільним рішенням, яке я не бачу в обґрунтуванні, але мушу запам'ятати. Я пропускаю якусь вагому причину, що це так? У багатьох проектах буде десятки компонентів React. Маючи у кожного свій файл, яким би малим він не здавався, ну і трохи анальним. Особливо боляче стає, якщо багато з них поділяють груди допоміжних функцій. Це забезпечує можливість синхронізувати більше рядків матеріалів, що здається трохи протизаконним. Що я пропускаю?

9
Дякую. Я думаю , що ви відповісте прекрасно пояснив це: import React, {Component} from 'react';.
Qian Chen

10
Хороша відповідь. Я маю щось додати до цього: спробуйте використовувати такі заяви про імпорт: import RaisedButton from 'material-ui/RaisedButton'; замість import {RaisedButton} from 'material-ui'; цього ви зробите ваш процес збирання швидшим, а ваш збірник - меншим.
Шехар Кумар


4
@ShekharKumar У вас є джерело import Binding from 'module/Binding'ефективності, ніж import {Binding} from 'module'?
Jeevan Takhar

4

Додати {} під час імпорту та експорту: export { ... };| import { ... } from './Template';

експортimport { ... } from './Template'

експорт за замовчуваннямimport ... from './Template'


Ось робочий приклад:

// 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 />
    </>
  );
}

OrРобота в пісочниці для гри: https://codesandbox.io/s/export-import-example-react-jl839?fontsize=14&hidenavigation=1&theme=dark

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.