เหตุใดส่วนประกอบของปฏิกิริยาตอบสนอง es6 จึงทำงานได้กับ“ การส่งออกเริ่มต้น” เท่านั้น


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 หากฉันตอบคำถามของคุณโปรดยอมรับเพื่อให้ผู้ใช้รายอื่นได้รับประโยชน์เช่นกัน
Jed Richards

คำตอบ:


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 เช่นนี้ import RaisedButton from 'material-ui/RaisedButton'; แทนการทำ import {RaisedButton} from 'material-ui'; เช่นนี้จะทำให้กระบวนการบิลด์ของคุณเร็วขึ้นและบิลด์เอาต์พุตของคุณจะเล็กลง
Shekhar Kumar


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

⚡️การทำงานกับแซนด์บ็อกซ์เพื่อเล่น: https://codesandbox.io/s/export-import-example-react-jl839?fontsize=14&hidenavigation=1&theme=dark

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.