Я вижу, что следующее хорошо:
const Tab = connect( mapState, mapDispatch )( Tabs );
export default Tab;
Однако это неверно:
export default const Tab = connect( mapState, mapDispatch )( Tabs );
Все же это хорошо
export default Tab = connect( mapState, mapDispatch )( Tabs );
Можно ли это объяснить, пожалуйста, почему const
недействительно с export default
? Является ли это ненужным дополнением и чем-либо, объявленным как export default
предполагаемое const
или таким?
export default Tab = connect( mapState, mapDispatch )( Tabs );
должно бытьexport default connect( mapState, mapDispatch )( Tabs );
. Вы экспортируете результат вызова функции, а не переменную Tab.Ответы:
const
это какlet
, это LexicalDeclaration ( ВыраженияПрисваивания, декларация ) используется для определения идентификатора в вашем блоке.Вы пытаетесь смешать это с
default
ключевым словом, которое ожидает, что HoistableDeclaration, ClassDeclaration или AssignmentExpression последуют за ним.Следовательно, это ошибка синтаксиса .
Если вы хотите
const
что-то, вы должны предоставить идентификатор, а не использоватьdefault
.export
сам по себе принимает VariableStatement или декларацию справа от себя.AFAIK экспорт сам по себе не должен ничего добавлять к вашей текущей области.
Tab
становится выражением AssignmentExpression, так как ему присваивается имя по умолчанию ?Вот
Tab = connect( mapState, mapDispatch )( Tabs );
выражение AssignmentExpression .источник
"AFAIK the export in itself should not add anything to your current scope"
Это не так точно, потому чтоexport const a = 1
добавляетa
к вашему текущему контексту. И дажеexport default
в случае с классами, потому чтоexport default class MyClass {}
добавляетMyClass
к вашему текущему контексту также.let a; export default a;
а затем обновлю переменную a, если она уже была импортирована в другой модуль, почему переменная экспорта по умолчанию не обновляется?const foo = function bar() {}
а такжеconst Foo = class Bar {}
, но не такconst foo = const bar = 1
. То же самоеexport default
, это так же, какconst foo =
.Вы также можете сделать что-то вроде этого, если вы хотите экспортировать по умолчанию const / let вместо
Вы можете сделать что-то подобное, что мне не нравится лично.
источник
Если имя компонента объясняется в имени файла
MyComponent.js
, просто не называйте компонент, сохраняя код тонким.Обновление : так как это помечает это как неизвестное в трассировке стека, это не рекомендуется
источник
Unknown
везде, где экспорт по умолчанию безымянныйОтвет Павла тот, который вы ищете. Однако, с практической точки зрения, я думаю, что вас может заинтересовать шаблон, который я использовал в своих собственных приложениях React + Redux.
Вот упрощенный пример одного из моих маршрутов, показывающий, как вы можете определить свой компонент и экспортировать его по умолчанию с помощью одного оператора:
(Примечание: я использую термин «сцена» для компонента верхнего уровня любого маршрута).
Я надеюсь, что это полезно. Я думаю, что это выглядит намного чище, чем обычные
connect( mapState, mapDispatch )( BareComponent )
источник
@connect
единственный декоратор, который я использую, я использую его только с компонентами, которые подключены к хранилищу с избыточностью, почти каждый из них является «маршрутом», и почти каждый маршрут должен иметь состояние (и, следовательно, не может быть чистой функцией) ,Ответ Пола - лучший. Чтобы расширить больше,
Для каждого файла может быть только один экспорт по умолчанию. Принимая во внимание, что может быть больше чем один постоянный экспорт. Переменная по умолчанию может быть импортирована с любым именем, тогда как переменная const может быть импортирована с ее конкретным именем.
Что касается импорта, нам нужно импортировать его так:
или
При первом импорте импортируется переменная const, тогда как со вторым импортируется переменная по умолчанию.
источник
default
в основномconst someVariableName
Вам не нужен именованный идентификатор, потому что это экспорт по умолчанию для файла, и вы можете называть его как хотите, когда импортируете его, поэтому
default
просто уплотняете присвоение переменной в одно ключевое слово.источник
Для меня это всего лишь одна из многих специфических особенностей (акцент на idio (t)) машинописи, которая заставляет людей вырывать волосы и проклинать разработчиков. Возможно, они могли бы работать над более понятными сообщениями об ошибках.
источник