Как импортировать и экспортировать компоненты с помощью React + ES6 + webpack?
я играю с React
и ES6
используя babel
и webpack
. Я хочу построить несколько компонентов в разных файлах, импортировать в один файл и связать их с webpack
допустим, у меня есть несколько таких компонентов:
my-navbar.jsx
import React from 'react';
import Navbar from 'react-bootstrap/lib/Navbar';
export class MyNavbar extends React.Component {
render(){
return (
<Navbar className="navbar-dark" fluid>
...
</Navbar>
);
}
}
главная-страница.jsx
import React from 'react';
import ReactDOM from 'react-dom';
import MyNavbar from './comp/my-navbar.jsx';
export class MyPage extends React.Component{
render(){
return(
<MyNavbar />
...
);
}
}
ReactDOM.render(
<MyPage />,
document.getElementById('container')
);
используя webpack и следуя их учебнику, у меня есть main.js
:
import MyPage from './main-page.jsx';
после построения проекта и запуска это, я получаю следующую ошибку в консоли браузера:
Error: Invariant Violation: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: undefined. Check the render method of `MyPage`.
что я делаю не так? Как правильно импортировать и экспортировать компоненты?
6 ответов:
попробовать по умолчаниюing экспорт в ваших компонентах:
import React from 'react'; import Navbar from 'react-bootstrap/lib/Navbar'; export default class MyNavbar extends React.Component { render(){ return ( <Navbar className="navbar-dark" fluid> ... </Navbar> ); } }
используя значение по умолчанию, вы выражаете, что это будет член в этом модуле, который будет импортирован, если не указано конкретное имя члена. Вы также можете выразить, что хотите импортировать определенный член с именем MyNavbar, сделав это: import {MyNavbar} from './комп - /мой-навигации.jsx'; в этом случае значение по умолчанию не требуется
обертывание компонентов фигурными скобками, если экспорт по умолчанию отсутствует:
import {MyNavbar} from './comp/my-navbar.jsx';
или импортировать несколько компонентов из одного файла модуля
import {MyNavbar1, MyNavbar2} from './module';
для экспорта одного компонента в ES6 можно использовать
export default
следующим образом:class MyClass extends Component { ... } export default MyClass;
и теперь вы используете следующий синтаксис для импорта этого модуля:
import MyClass from './MyClass.react'
если вы хотите экспортировать несколько компонентов из одного файла декларации будет выглядеть следующим образом:
export class MyClass1 extends Component { ... } export class MyClass2 extends Component { ... }
и теперь вы можете использовать следующий синтаксис для импорта этих файлов:
import {MyClass1, MyClass2} from './MyClass.react'
MDN имеет действительно хорошую документацию для всех новых способов импорта и экспорта модулей ES 6 Import-MDN . Краткое описание этого в отношении вашего вопроса Вы могли бы либо:
объявленный компонент, который вы экспортировали, как компонент "по умолчанию", который экспортировал этот модуль:
export default class MyNavbar extends React.Component {
, и поэтому при импорте вашего "MyNavbar" вам не нужно ставить фигурные скобки вокруг него :import MyNavbar from './comp/my-navbar.jsx';
. Не ставьте фигурные скобки вокруг импорта хотя говорит документ, что этот компонент был объявлен как "экспорт по умолчанию". Если это не так, вы получите ошибку (как и вы).если вы не хотите объявлять свой "MyNavbar" в качестве экспорта по умолчанию при экспорте:
export class MyNavbar extends React.Component {
, тогда вам придется обернуть импорт ' MyNavbar в фигурные скобки:import {MyNavbar} from './comp/my-navbar.jsx';
Я думаю, что, поскольку у вас только один компонент в свой './комп - /мой-навигации.файл jsx' это здорово, чтобы сделать его по умолчанию экспорт. Если бы у вас было больше компонентов, таких как MyNavbar1, MyNavbar2, MyNavbar3, то я бы не сделал их по умолчанию и не импортировал выбранные компоненты модуля, когда модуль не объявил ни одну вещь по умолчанию, которую вы можете использовать:
import {foo, bar} from "my-module";
где foo и bar-это несколько элементов вашего модуля.определенно прочитайте документ MDN у него есть хорошие примеры для синтаксиса. Надеюсь, это поможет с немного большим объяснением для тех, кто хочет поиграть с ES 6 и компонентом импорт/экспорт в реакцию.
Я надеюсь, что это полезно
Шаг 1: Приложение.js is (основной модуль) импортирует модуль входа
import React, { Component } from 'react'; import './App.css'; import Login from './login/login'; class App extends Component { render() { return ( <Login /> ); } } export default App;
Шаг 2: создайте папку Login и Create логин.js-файл и настроить ваши потребности он автоматически отображает в приложение.JS пример входа в систему.js
import React, { Component } from 'react'; import '../login/login.css'; class Login extends Component { render() { return ( <div className="App"> <header className="App-header"> <h1 className="App-title">Welcome to React</h1> </header> <p className="App-intro"> To get started, edit <code>src/App.js</code> and save to reload. </p> </div> ); } } export default Login;
есть два разных способа импорта компонентов в react, и рекомендуемый способ-это component way
- путь библиотеки (не рекомендуется)
- компонент пути(рекомендуется)
PFB подробное объяснение
библиотека способ импорта
import { Button } from 'react-bootstrap'; import { FlatButton } from 'material-ui';
это приятно и удобно, но это не только связывает кнопку и FlatButton (и их зависимости), но и весь библиотеки.
компонентный способ импорта
один из способов облегчить это-попытаться только импортировать или требовать то, что необходимо, скажем, компонентный способ. Используя тот же пример:
import Button from 'react-bootstrap/lib/Button'; import FlatButton from 'material-ui/lib/flat-button';
это будет только кнопка bundle, FlatButton и их соответствующие зависимости. Но не всю библиотеку. Поэтому я бы попытался избавиться от всех ваших импортных библиотек и использовать вместо этого компонентный способ.
Если вы не используете много компонентов, то это должно значительно уменьшить размер вашего файла в комплекте.