2016-03-28 16 views
103

tôi thấy rằng đây là tốt:Tại sao `Xuất Default Const` không hợp lệ?

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

Tuy nhiên, điều này là không chính xác:

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

Tuy nhiên, điều này là tốt:

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

này có thể được giải thích xin vui lòng tại sao const là không hợp lệ với export default? Đó có phải là sự bổ sung không cần thiết & bất kỳ điều gì được khai báo là export default được giả định là const hay không?

Trả lời

120

const là như let, it is a LexicalDeclaration (VariableStatement, Tuyên bố) được sử dụng để xác định một định danh trong khối của bạn.

Bạn đang cố gắng kết hợp điều này với từ khóa default, which expects a HoistableDeclaration, ClassDeclaration or AssignmentExpression để theo dõi.

Vì vậy, đây là Cú phápError.


Nếu bạn muốn const điều bạn cần cung cấp số nhận dạng và không sử dụng default.

export tự nó chấp nhận mã số Biến số hoặc Tuyên bố cho đúng.


AFAIK tự xuất không nên thêm bất kỳ thứ gì vào phạm vi hiện tại của bạn.


Sau đây là tốt export default Tab;

Tab trở thành một AssignmentExpression khi nó được đặt tên là mặc định?

export default Tab = connect(mapState, mapDispatch)(Tabs); là tốt

Dưới đây là một Tab = connect(mapState, mapDispatch)(Tabs);AssignmentExpression.

+4

Câu trả lời là cách nó trở thành lỗi. Câu hỏi vẫn là lý do tại sao? Một lý do nó ngăn cản lạm dụng const theo cách này: xuất khẩu mặc định const a = 1, b = 3, c = 4; –

+1

'" AFAIK tự xuất không nên thêm bất kỳ thứ gì vào phạm vi hiện tại của bạn "' Điều này không chính xác lắm, bởi vì 'xuất khẩu const a = 1' thêm' a' vào ngữ cảnh hiện tại của bạn. Và ngay cả với 'mặc định xuất' trong trường hợp các lớp, vì 'lớp mặc định xuất MyClass {}' cũng thêm 'MyClass' vào ngữ cảnh hiện tại của bạn. – Ernesto

+1

@SergeyOrlov đồng ý rằng điều này giải thích cách điều này tạo ra một lỗi, nhưng làm sáng tỏ chút ít là tại sao cần thiết. Mặc dù tôi không chắc chắn đó là lý do duy nhất, bạn có lẽ nên đăng bài đó như là một câu trả lời riêng biệt, không phải là một bình luận cho điều này. – Herick

18

Bạn cũng có thể làm điều gì đó như thế này nếu bạn muốn xuất mặc định một const/let, thay vì

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

Bạn có thể làm một cái gì đó như thế này, mà tôi không thích cá nhân.

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

'const MyComponent;' không phải là cú pháp hợp lệ - một 'const' phải được gán trong cùng một câu lệnh được xác định trong. – configurator

+1

Tôi xin lỗi vì xấu, tôi đã sửa chữa điều đó. –

3

Câu trả lời của Paul là câu trả lời bạn đang tìm kiếm.Tuy nhiên, như một vấn đề thực tế, tôi nghĩ rằng bạn có thể quan tâm đến mô hình mà tôi đã sử dụng trong các ứng dụng React + Redux của riêng tôi.

Dưới đây là một ví dụ lột xuống từ một trong những tuyến đường của tôi, cho thấy làm thế nào bạn có thể xác định thành phần của bạn và xuất nó như là mặc định với một tuyên bố duy nhất:

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

(Lưu ý: Tôi sử dụng thuật ngữ "Scene" cho thành phần cấp cao nhất của bất kỳ tuyến đường nào).

Tôi hy vọng điều này hữu ích. Tôi nghĩ nó đẹp hơn nhiều so với thông thường connect(mapState, mapDispatch)(BareComponent)

Các vấn đề liên quan