'기본 불변 수출'이 유효하지 않은 이유


352

다음과 같은 것이 좋습니다.

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있습니까?



1
export default Tab = connect( mapState, mapDispatch )( Tabs );이어야합니다 export default connect( mapState, mapDispatch )( Tabs );. 변수 탭이 아닌 함수 호출 결과를 내보내고 있습니다.
ThaJay

2
반출 모듈에는 const 또는 let이 필요하며 관련이 있지만 반입 모듈에는 관련이 없습니다. 반입 된 식별자는 항상 읽기 전용입니다 (할당 할 수 없음). "기본 내보내기"의 구문이 기본이 아닌 "내보내기"와 다른 이유를 설명하지는 않습니다.
Denis Howe

답변:


305

const처럼 let, 그것은이다 LexicalDeclaration ( VariableStatement 선언 하여 블록 식별자를 정의하는 데 사용).

default키워드를 HoistableDeclaration, ClassDeclaration 또는 AssignmentExpression 이 따라 것으로 예상하는 키워드 와 혼합하려고 합니다.

따라서 SyntaxError 입니다.


const무언가 를 원한다면 식별자를 제공하고 사용하지 않아야합니다 default.

export그 자체로는 VariableStatement 또는 Declaration 을 그 자체로 받아들 입니다.


AFAIK 내보내기 자체는 현재 범위에 아무것도 추가하지 않아야합니다.


다음은 괜찮습니다export default Tab;

Tab된다 AssignmentExpression 는 이름이 주어진 것 같은 기본은 ?

export default Tab = connect( mapState, mapDispatch )( Tabs ); 괜찮습니다

다음 Tab = connect( mapState, mapDispatch )( Tabs );AssignmentExpression 입니다.


27
대답은 그것이 오류가되는 방법입니다. 문제는 여전히 왜? 이 방법으로 const 남용을 방지하는 한 가지 이유는 다음과 같습니다. export default const a = 1, b = 3, c = 4;
Sergey Orlov

7
"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.
Ernesto

4
@SergeyOrlov는 이것이 어떻게 오류가 발생하는지 설명하지만 왜 필요한지에 대해서는 거의 밝히지 않습니다. 그것이 단일 이유인지 확실하지 않지만, 아마도이 질문에 대한 의견이 아니라 별도의 답변으로 게시해야합니다.
Herick

다음을 수행 한 다음 let a; export default a;다른 모듈로 이미 가져 왔을 때 변수 a를 업데이트하면 내보내기 기본 변수가 업데이트되지 않는 이유는 무엇입니까?
K-SO의 독성이 증가하고 있습니다.

내 이해는 간단히 말해서 글을 쓸 수 있지만 쓸 수 const foo = function bar() {}const Foo = class Bar {}없다는 것 const foo = const bar = 1입니다. 동일에 export default, 그냥 같다 const foo =.
zetavg

47

대신 기본 const / let을 내보내려면 다음과 같이 할 수 있습니다

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

나는 개인적으로 좋아하지 않는 이와 같은 것을 할 수 있습니다.

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

19

구성 요소 이름이 파일 이름에 설명되어 있으면 구성 요소 이름을 지정 MyComponent.js하지 말고 코드를 줄이십시오.

import React from 'react'

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

업데이트 : 스택 추적에서 알 수없는 것으로 표시되므로 권장하지 않습니다.


14
스택 추적에 문제가 없습니까? 나에게는이 표시 일으키는 Unknown모든 곳은 어디 익명의 기본 내보내기입니다
Jurosh

2
이것이 작동하는 동안, 의심의 여지없이 장난감 응용 프로그램 개발 이외의 모든 반응 개발자 는 모든 비용 을 피하기 위해 노력해야합니다 .
li x

1
@lix 왜이 구문을 사용하지 않아야하는지 이해할 수 없었습니다. 링크를 설명하거나 공유 하시겠습니까? 감사.
sudip

3
@sudip 이름이없는 구성 요소를 만드는 것은 반응 구성 요소 모델 및 렌더링에 적합하지 않습니다.
li x

1
외모 깨끗한 그러나, 또한 단 아브라모프는 우리가 적절한 기능 / 구성 요소 선언 const를 이름을 사용해야한다는 제안 : twitter.com/dan_abramov/status/1255229440860262400를 ) "- 스택 추적에 익명으로 표시됩니다 - DevTools로에서 알 수 없음으로 표시됩니다 -React 특정 보푸라기 규칙으로 확인되지 않음-Fast Refresh와 같은 일부 기능에서는 작동하지 않습니다 "
Zoltan

9

폴의 대답은 당신이 찾고있는 것입니다. 그러나 실제로는 내 React + Redux 앱에서 사용한 패턴에 관심이있을 것입니다.

다음은 내 경로 중 하나에서 제거 된 예제입니다. 단일 명령문으로 구성 요소를 정의하고 기본값으로 내보내는 방법을 보여줍니다.

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 { /* ... */ }

(참고 : 모든 루트의 최상위 구성 요소에 "장면"이라는 용어를 사용합니다).

도움이 되길 바랍니다. 기존보다 훨씬 깨끗해 보인다고 생각합니다connect( mapState, mapDispatch )( BareComponent )


너무 나쁜 데코레이터는 기능 컴포넌트에 사용될 수없는 것 같습니다
Eric Kim

@EricKim Bummer. 그러나 데코레이터 사양이 아직 최종적이지 않다는 점을 명심해야합니다. "레거시"데코레이터를 사용하여 기능적 구성 요소를 장식 할 수는 없지만 레거시 디자인의 제한 때문인지 레거시 데코레이터의 구현이 불완전하거나 버그가 있는지 모르겠습니다. FWIW : @connect내가 사용하는 유일한 데코레이터입니다. 나는 redux 저장소에 연결된 구성 요소와 함께 사용합니다. 거의 모든 경로는 "경로"이며 거의 모든 경로에는 상태가 있어야합니다 (따라서 순수한 기능은 아닙니다) .
Tom

8

바울이 공유 한 답이 가장 좋습니다. 더 확장하려면

파일 당 하나의 기본 내보내기 만있을 수 있습니다. const 내보내기가 둘 이상있을 수 있습니다. 기본 변수는 임의의 이름으로 가져올 수 있지만 const 변수는 특정 이름으로 가져올 수 있습니다.

var message2 = '내보냈습니다.';

기본 메시지 내보내기 2;

const 메시지 내보내기 = '내보냈습니다.'

수입 측에서는 다음과 같이 수입해야합니다 :

'./test'에서 {message} 가져 오기;

또는

'./test'에서 메시지 가져 오기;

첫 번째 가져 오기에서는 const 변수를 가져오고 두 번째 가져 오기에서는 기본 변수를 가져옵니다.


0

default 기본적으로 const someVariableName

파일의 기본 내보내기이기 때문에 이름 지정된 식별자가 필요하지 않으며 파일을 가져올 때 원하는 이름을 지정할 수 있으므로 default변수 할당을 단일 키워드로 압축하면됩니다.


-3

나에게 이것은 사람들이 머리카락을 뽑아 개발자를 저주하게하는 많은 종류의 특이성 중 하나 (idio (t) 강조)입니다. 더 이해하기 쉬운 오류 메시지가 표시 될 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.