Импорт и экспорт

Когда твое приложение перевалило за сотню строк кода, а количество компонентов стало больше двух, настает час задуматься о том, как бы не запутаться во всем этом.

Именованный импорт

Представь себе, что у тебя есть какой-то компонент, который ты хочешь использовать в двух других компонентах. Каждый компонент находится в своем файле:

Если мы хотим использовать этот компонент в каком-то другом файле, его надо экспортировать, приписав в начале определения ключевое слово export:

export function Button() {
  return <button></button>;
}

А в месте, где нужно использовать этот компонент, мы его импортируем:

import { Button } from './a';

Та же самая механика экспорта/импорта относится и к переменным, и к функциям, (строго говоря, функция — это вид переменной) которые не являются реакт-компонентами. Это не единственный способ, но его вполне достаточно.

Дополнительная информация

Кроме именованного импорта есть еще два вида импортов: Default и Namespace. Их необязательно использовать (мало того, у default-импорта есть противники!).

Default-импорт

В дальнейшем ты много раз будешь встречать такую строчку:

import React from 'react';

Как видишь, тут нет фигурных скобок. Отсутствие их означает, что какая-то переменная (или функция) была экспортирована с ключевым словом export default . Обычно таким методом пользуются создатели библиотек (таких, как React), чтобы обозначить какое-то значение как "главное". Кстати, при дефолтном импорте мы можем выбрать какое угодно имя для импортируемой переменной.

Namespace-импорт

В переводе с английского namespace — "пространство имен". Что это означает?

Допустим, у тебя есть два компонента, каждый из них экспортирует

  • компонент с именем "Button"

  • переменную с именем info:

export function Button () {/.../}
export const info = "Информация";

Ты хочешь использовать их в третьем компоненте

import {Button, info} from './a'
import {Button, info} from './b'

Но — о нет! — у тебя образовалась коллизия имен, то есть две разных переменных с одним и тем же именем. Чтобы избежать такой ситуации, ты создаешь пространство имен для каждого импорта:

import * as A from './a'
import * as B from './b'

A.Button // кнопка из А
B.info // переменная из B

Такой способ подходит для тех случаев, когда импортируется много переменных, если же нужно разрешить всего один конфликт, можно использовать именованный импорт таким образом:

import {Button as ButtonA} from './a'
import {Button as ButtonB} from './b'

Last updated