Tại sao thành phần phản ứng es6 chỉ hoạt động với dịch vụ xuất khẩu mặc định của Cameron?


241

Thành phần này không hoạt động:

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

Nếu tôi loại bỏ hàng cuối cùng, nó không hoạt động.

Uncaught TypeError: Cannot read property 'toUpperCase' of undefined

Tôi đoán, tôi không hiểu gì về cú pháp es6. Không phải nó phải xuất mà không có dấu "mặc định" sao?


7
bạn có thể viết dưới dạng export default class Template extends React.Component {
andykenward

Tôi biết. Nhưng làm thế nào tôi có thể nhập thành phần đã được xuất mà không có "mặc định"? Điều đó là có thể
stkvtflw 6/08/2015

2
@stkvtflw Nếu tôi trả lời câu hỏi của bạn, vui lòng chấp nhận nó để người dùng khác cũng có thể hưởng lợi.
Jed Richards

Câu trả lời:


571

Xuất khẩu mà không defaultcó nghĩa là "xuất khẩu có tên". Bạn có thể có nhiều xuất khẩu được đặt tên trong một tệp duy nhất. Vì vậy, nếu bạn làm điều này,

class Template {}
class AnotherTemplate {}

export { Template, AnotherTemplate }

sau đó bạn phải nhập các hàng xuất khẩu này bằng tên chính xác của chúng. Vì vậy, để sử dụng các thành phần này trong một tệp khác bạn phải làm,

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

Ngoài ra, nếu bạn xuất dưới dạng defaultxuất như thế này,

export default class Template {}

Sau đó, trong một tệp khác, bạn nhập xuất mặc định mà không sử dụng {}, như thế này,

import Template from './components/templates'

Chỉ có thể có một xuất mặc định cho mỗi tệp. Trong React, đó là một quy ước để xuất một thành phần từ một tệp và để xuất nó dưới dạng xuất mặc định.

Bạn có thể đổi tên xuất khẩu mặc định khi bạn nhập nó,

import TheTemplate from './components/templates'

Và bạn có thể nhập xuất khẩu mặc định và được đặt tên cùng một lúc,

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

12
ĐỒNG Ý. Nhưng điều này có vẻ như là một quyết định dường như tùy tiện khác mà tôi không thấy lý do căn bản mà phải ghi nhớ. Tôi có thiếu một số lý do tốt nó là như thế này? Trong nhiều dự án sẽ có hàng tá thành phần React. Có mỗi tập tin riêng của nó, cho dù nhỏ như thế nào, tốt, một chút hậu môn. Nó đặc biệt trở nên đau đớn nếu nhiều người trong số họ chia sẻ các nhóm chức năng của người trợ giúp. Nó làm cho nhiều dòng công cụ hơn để giữ đồng bộ có vẻ hơi phản tác dụng. Tôi đang thiếu gì?

9
Cảm ơn bạn. Tôi nghĩ rằng bạn trả lời hoàn toàn giải thích điều này : import React, {Component} from 'react';.
Qian Chen

10
Câu trả lời tốt. Tôi có một cái gì đó để thêm vào nó: Hãy thử sử dụng các câu lệnh nhập như thế này: import RaisedButton from 'material-ui/RaisedButton'; thay vì import {RaisedButton} from 'material-ui'; Điều này sẽ làm cho quá trình xây dựng của bạn nhanh hơn và đầu ra bản dựng của bạn nhỏ hơn.
Shekhar Kumar


4
@ShekharKumar Bạn có nguồn import Binding from 'module/Binding'nào hiệu quả hơn import {Binding} from 'module'không?
Jeevan Takhar

4

Thêm {} trong khi nhập và xuất: export { ... };| import { ... } from './Template';

xuấtimport { ... } from './Template'

xuất mặc địnhimport ... from './Template'


Dưới đây là một ví dụ hoạt động:

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

Làm việc với hộp cát để chơi xung quanh: https://codesandbox.io/s/export-import-example-react-jl839?fontsize=14&hidenavlation=1&theme=dark

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.