Импорт и экспорт компонентов
Магия компонентов заключается в их повторном использовании: вы можете создавать компоненты, состоящие из других компонентов. Но по мере вложенности компонентов часто имеет смысл начать разделять их на разные файлы. Это позволяет сохранять файлы легкими для сканирования и повторно использовать компоненты в большем количестве мест.
Вы узнаете
- Что такое файл корневого компонента
- Как импортировать и экспортировать компонент
- Когда использовать импорт и экспорт по умолчанию и именованные импорты и экспорты
- Как импортировать и экспортировать несколько компонентов из одного файла
- Как разделить компоненты на несколько файлов
Файл корневого компонента
В Вашем первом компоненте, вы создали Profile компонент и Gallery компонент, который его отображает:
function Profile() { return ( <img src="https://i.imgur.com/MK3eW3As.jpg" alt="Katherine Johnson" /> ); } export default function Gallery() { return ( <section> <h1>Amazing scientists</h1> <Profile /> <Profile /> <Profile /> </section> ); }
В настоящее время они находятся в файле корневого компонента, названного App.js в этом примере. Однако, в зависимости от вашей настройки, ваш корневой компонент может находиться в другом файле. Если вы используете фреймворк с маршрутизацией на основе файлов, например, Next.js, ваш корневой компонент будет отличаться для каждой страницы.
Экспорт и импорт компонента
Что если в будущем вы захотите изменить стартовую страницу и поместить туда список научных книг? Или разместить все профили где-то еще? Имеет смысл переместить Gallery и Profile из файла корневого компонента. Это сделает их более модульными и многократно используемыми в других файлах. Вы можете переместить компонент в три шага:
- Создайте новый JS-файл для размещения компонентов.
- Экспортируйте ваш функциональный компонент из этого файла (используя либо экспорт по умолчанию, либо именованный экспорт).
- Импортируйте его в файл, где вы будете использовать компонент (используя соответствующий метод для импорта экспорта по умолчанию или именованного экспорта).
Вот как Profile и Gallery были перемещены из App.js в новый файл под названием Gallery.js. Теперь вы можете изменить App.js для импорта Gallery из Gallery.js.
import Gallery from './Gallery.js'; export default function App() { return ( <Gallery /> ); }
Обратите внимание, как этот пример теперь разделен на два файла компонентов:
-
Gallery.js:- Определяет компонент
Profile, который используется только в этом же файле и не экспортируется. - Экспортирует компонент
Galleryв качестве экспорта по умолчанию.
- Определяет компонент
-
App.js:- Импортирует
Galleryв качестве импорта по умолчанию изGallery.js. - Экспортирует корневой компонент
Appв качестве экспорта по умолчанию.
- Импортирует
Примечание
Вы можете столкнуться с файлами, которые опускают расширение файла .js следующим образом:
import Gallery from './Gallery';
Как './Gallery.js', так и './Gallery' будут работать с React, хотя первый вариант ближе к тому, как работают собственные модули ES.
Подробный разбор
Экспорт по умолчанию против именованных экспортов
Существует два основных способа экспорта значений с помощью JavaScript: экспорт по умолчанию и именованные экспорты. До сих пор наши примеры использовали только экспорт по умолчанию. Но вы можете использовать один или оба из них в одном файле. Файл может содержать не более одного экспорта по умолчанию, но он может содержать любое количество именованных экспортов.
Способ экспорта компонента определяет способ его импорта. Если вы попытаетесь импортировать экспорт по умолчанию так же, как и именованный экспорт, вы получите ошибку! Эта таблица поможет вам отслеживать это:
| Синтаксис | Выражение экспорта | Выражение импорта |
|---|---|---|
| Экспорт по умолчанию | export default function Button() {} |
import Button from './Button.js'; |
| Именованный экспорт | export function Button() {} |
import { Button } from './Button.js'; |
Когда вы пишете импорт по умолчанию, вы можете ввести любое имя после import. Например, вы можете написать import Banana from './Button.js' и это по-прежнему обеспечит вам тот же экспорт по умолчанию. В отличие от импорта по имени, имя должно совпадать с обеих сторон. Вот почему они называются именованными импортами!
Люди часто используют экспорт по умолчанию, если файл экспортирует только один компонент, и используют именованные экспорты, если он экспортирует несколько компонентов и значений. Независимо от того, какой стиль программирования вы предпочитаете, всегда давайте осмысленные имена вашим функциям компонентов и файлам, которые их содержат. Компоненты без имен, такие как export default () => {}, не рекомендуются, поскольку они затрудняют отладку.
Экспорт и импорт нескольких компонентов из одного файла
Что если вам нужно отобразить только один Profile вместо галереи? Вы также можете экспортировать компонент Profile. Но у Gallery.js уже есть экспорт по умолчанию, а у вас не может быть двух экспортов по умолчанию. Вы можете создать новый файл с экспортом по умолчанию или добавить именованный экспорт для Profile. Файл может содержать только один экспорт по умолчанию, но множество именованных экспортов!
Примечание
Чтобы уменьшить потенциальную путаницу между экспортом по умолчанию и именованными экспортами, некоторые команды предпочитают придерживаться одного стиля (экспорт по умолчанию или именованный экспорт) или избегать их смешивания в одном файле. Делайте то, что лучше всего подходит для вас!
Сначала, экспортируйте Profile из Gallery.js с помощью именованного экспорта (без ключевого слова default):
export function Profile() {
// ...
} Затем, импортируйте Profile из Gallery.js в App.js с помощью именованного импорта (с фигурными скобками):
import { Profile } from './Gallery.js'; Наконец, отобразите <Profile /> из компонента App.
export default function App() {
return <Profile />;
} Теперь Gallery.js содержит два экспорта: экспорт по умолчанию Gallery и именованный экспорт Profile. App.js импортирует оба из них. Попробуйте изменить <Profile /> на <Gallery /> и обратно в этом примере:
import Gallery from './Gallery.js'; import { Profile } from './Gallery.js'; export default function App() { return ( <Profile /> ); }
Теперь вы используете смесь экспортов по умолчанию и именованных экспортов:
-
Gallery.js:- Экспортирует компонент
Profileкак именованный экспорт с именемProfile. - Экспортирует компонент
Galleryкак экспорт по умолчанию.
- Экспортирует компонент
-
App.js:- Импортирует
Profileкак именованный импорт с именемProfileизGallery.js. - Импортирует
Galleryкак импорт по умолчанию изGallery.js. - Экспортирует корневой компонент
Appкак экспорт по умолчанию.
- Импортирует
Обзор
На этой странице вы узнали:
- Что такое файл корневого компонента
- Как импортировать и экспортировать компонент
- Когда и как использовать импорты и экспорты по умолчанию и именованные
- Как экспортировать несколько компонентов из одного файла
Попробуйте выполнить некоторые задания
Задача 1 из 1:
Разделить компоненты дальше
В настоящее время Gallery.js экспортирует как Profile, так и Gallery, что немного запутанно.
Переместите компонент Profile в свой собственный Profile.js, а затем измените компонент App для отображения компонентов <Profile /> и <Gallery /> друг за другом.
Вы можете использовать экспорт по умолчанию или именованный экспорт для Profile, но убедитесь, что вы используете соответствующий синтаксис импорта в App.js и Gallery.js. Вы можете обратиться к таблице из подробного раздела выше:
| Синтаксис | Заявление об экспорте | Заявление об импорте |
|---|---|---|
| По умолчанию | export default function Button() {} |
import Button from './Button.js'; |
| Именованный | export function Button() {} |
import { Button } from './Button.js'; |
// Move me to Profile.js! export function Profile() { return ( <img src="https://i.imgur.com/QIrZWGIs.jpg" alt="Alan L. Hart" /> ); } export default function Gallery() { return ( <section> <h1>Amazing scientists</h1> <Profile /> <Profile /> <Profile /> </section> ); }
После того, как вы получите работу с одним типом экспортов, сделайте это с другим типом.
© 2013–present Facebook Inc.
Licensed under the Creative Commons Attribution 4.0 International Public License.
https://18.react.dev/learn/importing-and-exporting-components