`Export Default Const 'neden geçersiz?


352

Aşağıdakilerin iyi olduğunu görüyorum:

const Tab = connect( mapState, mapDispatch )( Tabs );
export default Tab;

Ancak, bu yanlış:

export default const Tab = connect( mapState, mapDispatch )( Tabs );

Yine de bu iyi:

export default Tab = connect( mapState, mapDispatch )( Tabs );

Bu açıklanabilir mi lütfen neden constgeçersiz export default? Gereksiz bir ekleme mi ve export defaulta constya da böyle olduğu varsayılan bir şey mi?



1
export default Tab = connect( mapState, mapDispatch )( Tabs );olmalı export default connect( mapState, mapDispatch )( Tabs );. Sekme değişkeni yerine işlev çağrısının sonucunu dışa aktarıyorsunuz.
ThaJay

2
Dışa aktarma modülünde bir const veya let gereklidir (ve ilgili), ancak içe aktarılan tanımlayıcının her zaman salt okunur olduğu (atanamayacağı), içe aktarma modülüyle ilgisi yoktur. Bu yine de "dışarı aktarma varsayılanı" sözdiziminin neden varsayılan olmayan "dışarı aktarma" ifadesinden farklı olduğunu açıklamamaktadır.
Denis Howe

Yanıtlar:


305

constgibi let, bir olduğu LexicalDeclaration ( VariableStatement, Bildirimi daki bloğun bir tanımlayıcı 'yı tanımlamak için kullanılır).

Bunu bir HoistableDeclaration, ClassDeclaration veya AssignmentExpression ifadesinin izlemesini bekleyendefault anahtar kelimeyle karıştırmaya çalışıyorsunuz .

Bu nedenle bir SyntaxError .


Bir constşey yapmak istiyorsanız, tanımlayıcıyı sağlamanız ve kullanmamanız gerekir default.

exportkendi başına bir VariableStatement veya Declaration kabul eder .


AFAIK ihracat kendi içinde mevcut kapsamınıza bir şey eklememelidir.


Aşağıdaki iyiexport default Tab;

Tabvarsayılan adı verildiğinde AssignmentExpression olur ?

export default Tab = connect( mapState, mapDispatch )( Tabs ); iyidir

İşte Tab = connect( mapState, mapDispatch )( Tabs );bir AssignmentExpression .


27
Cevap, bunun nasıl bir hata olduğu. Soru hala neden? Const'un bu şekilde kötüye kullanılmasını önlemesinin bir nedeni: verme varsayılan const a = 1, b = 3, c = 4;
Sergey Orlov

7
"AFAIK the export in itself should not add anything to your current scope"Bu çok doğru değil, çünkü mevcut bağlamınıza export const a = 1katkıda abulunuyor. export defaultSınıflarda bile , çünkü mevcut bağlamınıza da export default class MyClass {}katkıda bulunur MyClass.
Ernesto

4
@SergeyOrlov, bunun bunun nasıl bir hata oluşturduğunu açıkladığını kabul ediyor, ancak neden gerekli olduğuna dair çok az ışık tutuyor. Bunun tek nedeni olduğundan emin olmasam da, muhtemelen bunu ayrı bir cevap olarak göndermelisiniz, buna bir yorum değil.
Herick

Aşağıdakileri yaparsam: let a; export default a;ve daha sonra başka bir modüle içe aktarıldığında a değişkenini güncellersem, verme varsayılan değişkeni neden güncelleştirilmiyor?
K - SO'da toksisite artıyor.

Benim anlayışım, kısaca, yazabilir const foo = function bar() {}ve yazabilirsiniz const Foo = class Bar {}, ama yazamazsınız const foo = const bar = 1. Aynısı export default, aynen öyle const foo =.
zetavg

47

Ayrıca, varsayılan olarak bir const / let vermek yerine bunun gibi bir şey de yapabilirsiniz.

const MyComponent = ({ attr1, attr2 }) => (<p>Now Export On other Line</p>);
export default MyComponent

Kişisel olarak sevmediğim böyle bir şey yapabilirsiniz.

let MyComponent;
export default MyComponent = ({ }) => (<p>Now Export On SameLine</p>);

19

Bileşen adı dosya adında açıklanırsa, bileşeni adlandırmayın, MyComponent.jskodu ince tutar.

import React from 'react'

export default (props) =>
    <div id='static-page-template'>
        {props.children}
    </div>

Güncelleme : Bu, yığın izlemede bilinmeyen olarak etiketlendiği için önerilmez


14
Stacktraces ile ilgili herhangi bir sorununuz olmadı mı? Benim için Unknownisimsiz varsayılan ihracat olan her yerde görüntülenmesine neden oluyor
Jurosh

2
Bu işe yararken, şüphesiz, oyuncak uygulama geliştirme dışındaki her tepki geliştiricinin her ne pahasına olursa olsun kaçınmaya çalışması gerekir .
li x

1
@lix Bu sözdizimini kullanmaktan neden kaçınmamız gerektiğini anlayamadım. Lütfen bir bağlantıyı açıklar veya paylaşır mısınız? Teşekkürler.
19'da

3
@sudip Adsız bir bileşen oluşturmak, tepki bileşeni modeli ve oluşturma için iyi değildir.
li x

1
Ancak temiz görünüyor, ayrıca Dan Abramov, bileşen bildiriminde uygun işlev / const adlarını kullanmamızı önermektedir: twitter.com/dan_abramov/status/1255229440860262400 ;) "- yığın izlemelerinde Anonim olarak görünecek - DevTools'ta Bilinmeyen olarak görünecek - React'e özgü tiftik kuralları tarafından kontrol edilmez - Hızlı Yenileme "gibi bazı özelliklerle çalışmaz"
Zoltan

9

Paul'ün cevabı aradığınız cevap. Ancak, pratik bir konu olarak, kendi React + Redux uygulamalarımda kullandığım kalıpla ilgilenebileceğinizi düşünüyorum.

Rotalarımdan birinden, bileşeninizi nasıl tanımlayabileceğinizi ve tek bir ifadeyle varsayılan olarak nasıl dışa aktarabileceğinizi gösteren soyulmuş bir örnek:

import React from 'react';
import { connect } from 'react-redux';

@connect((state, props) => ({
    appVersion: state.appVersion
    // other scene props, calculated from app state & route props
}))
export default class SceneName extends React.Component { /* ... */ }

(Not: Herhangi bir rotanın üst düzey bileşeni için "Sahne" terimini kullanıyorum).

Umarım bu yardımcı olur. Bence geleneksel olandan çok daha temiz görünüyorconnect( mapState, mapDispatch )( BareComponent )


Çok kötü dekoratörler bir işlev bileşeninde kullanılamıyor gibi görünüyor
Eric Kim

@EricKim Bummer. Ancak, dekoratör spesifikasyonunun henüz nihai olmadığını unutmayın. Belki fonksiyonel bileşenler "eski" dekoratör kullanılarak dekore edilemez, ancak bunun eski tasarımın bir sınırlamasından mı yoksa eski dekoratörlerin uygulanmasının eksik mi yoksa buggy mi olduğundan bilmiyorum. FWIW: Kullandığım @connecttek dekoratör, sadece redux mağazasına bağlı bileşenlerle kullanıyorum, bunların neredeyse her biri bir "rota" ve neredeyse her rotanın durumu olmalı (ve bu nedenle saf bir işlev olamaz) .
Tom

8

Paul'un paylaştığı cevap en iyisidir. Daha fazla genişletmek için,

Dosya başına yalnızca bir varsayılan dışa aktarma olabilir. Oysa birden fazla inşaat ihracatı olabilir. Varsayılan değişken herhangi bir adla içe aktarılabilirken, const değişkeni özel adıyla içe aktarılabilir.

var message2 = 'Dışa aktarıldım';

varsayılan mesajı gönder2;

export const message = 'Ben de ihraç edildim'

İthalat tarafında bunu şu şekilde içe aktarmamız gerekiyor:

{message} './test' den içe aktar;

veya

'./test' den mesajı içe aktar;

İlk içe aktarma işlemiyle const değişkeni içe aktarılırken, ikincisiyle birlikte varsayılan değişken içe aktarılır.


0

default temelde const someVariableName

Dosya için varsayılan dışa aktarma olduğu için adlandırılmış bir tanımlayıcıya ihtiyacınız yoktur ve dosyayı içe aktarırken istediğiniz her şeyi adlandırabilirsiniz, bu nedenle defaultdeğişken atamasını tek bir anahtar kelimeye yoğunlaştırır.


-3

Bana göre bu, insanların saçlarını çekmelerine ve geliştiricileri lanetlemesine neden olan birçok yazıtipten (idio (t) vurgusu) sadece bir tanesidir. Belki daha anlaşılır hata mesajları bulmaya çalışabilirler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.