为什么`Export Default Const`无效?

Kay*_*ote 296 javascript scope default export const

我看到以下情况很好:

const Tab = connect( mapState, mapDispatch )( Tabs );
export default Tab;
Run Code Online (Sandbox Code Playgroud)

但是,这是不正确的:

export default const Tab = connect( mapState, mapDispatch )( Tabs );
Run Code Online (Sandbox Code Playgroud)

这很好:

export default Tab = connect( mapState, mapDispatch )( Tabs );
Run Code Online (Sandbox Code Playgroud)

可以解释一下,为什么const无效export default?这是一个不必要的补充和任何宣称为export default假定的东西const吗?

Pau*_* S. 253

const就像是let,它是用于在块中定义标识符LexicalDeclaration(VariableStatement,Declaration).

您正在尝试将此与default关键字混合使用,该关键字需要使用HoistableDeclaration,ClassDeclarationAssignmentExpression.

因此它是一个SyntaxError.


如果你想要const某些东西,你需要提供标识符而不是使用default.

export它本身接受一个VariableStatement声明.


AFAIK导出本身不应该为您当前的范围添加任何内容.


以下是好的export default Tab;

Tab成为AssignmentExpression,因为它的名称是默认的

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

Tab = connect( mapState, mapDispatch )( Tabs );是一个AssignmentExpression.

  • 答案是如何成为一个错误.问题仍然是为什么?它以这种方式防止滥用const的一个原因是:export default const a = 1,b = 3,c = 4; (21认同)
  • `"AFAIK导出本身不应该向你当前的范围添加任何东西"`这不是那么准确,因为`export const a = 1`会在你当前的上下文中添加`a`.即使在类的情况下使用`export default`,因为`export default class MyClass {}`也会将`MyClass`添加到当前上下文中. (7认同)
  • @SergeyOrlov同意,这可以解释这是如何产生错误的,但对于必要的原因却鲜有了解。尽管我不确定这是唯一的原因,但您可能应该将其发布为单独的答案,而不是对此内容发表评论。 (4认同)
  • 我同意@Pavel1114——这回答了为什么解析器将其作为语法错误拒绝,但没有解释_为什么语法被设计为防止`export default const ...`_,尽管这种结构似乎很有意义是非法的。我非常怀疑 @Kayote 是在询问解析器。 (4认同)
  • 答案是针对另一个问题的。原来的问题没有答案。 (3认同)

Ade*_*ran 40

如果你想导出默认的const/let而不是,你也可以这样做

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

你可以做这样的事情,我个人不喜欢.

let MyComponent;
export default MyComponent = ({ }) => (<p>Now Export On SameLine</p>);
Run Code Online (Sandbox Code Playgroud)

  • 是的,那是可行的——但感觉_太错误了_,我实际上发现自己希望你没有发布它。有人会将其复制并粘贴到源代码中的某个地方! (4认同)

Kev*_*ski 12

如果在文件名中解释了组件名称MyComponent.js,则不要为组件命名,使代码保持苗条.

import React from 'react'

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

  • 你有没有堆栈跟踪的问题?对我而言,它导致在任何地方显示"未知",其中未命名的默认导出 (10认同)
  • 虽然这是有效的,但毫无疑问,这是玩具应用程序开发之外的每个 React 开发人员都应该不惜一切代价努力_避免_的事情。 (4认同)
  • @sudip 创建一个没有名称的组件对于 React 组件模型和渲染来说并不好。 (3认同)
  • 然而看起来很干净,Dan Abramov 也建议我们应该在组件声明中使用正确的函数/const 名称:https://twitter.com/dan_abramov/status/1255229440860262400 ;)“- 将在堆栈跟踪中显示为匿名 - 将显示在 DevTools 中为 Unknown - 不会通过特定于 React 的 lint 规则进行检查 - 不适用于快速刷新等某些功能” (2认同)

Bha*_*Raj 11

保罗分享的答案是最好的。为了扩大,

每个文件只能有一个默认导出。而可以有多个 const 导出。默认变量可以使用任何名称导入,而 const 变量可以使用其特定名称导入。

var message2 = 'I am exported';
export default message2;
export const message = 'I am also exported'
Run Code Online (Sandbox Code Playgroud)

在导入端,我们需要像这样导入它:

import { message } from './test';
Run Code Online (Sandbox Code Playgroud)

或者

import message from './test';
Run Code Online (Sandbox Code Playgroud)

第一次导入时,会导入 const 变量,而第二次导入时,将导入默认变量。


com*_*ike 10

使用 时export default,您不会导出变量的名称(在本例中)。

错误的:

export default const Tab = connect( mapState, mapDispatch )( Tabs );
Run Code Online (Sandbox Code Playgroud)

正确的:

export default connect( mapState, mapDispatch )( Tabs );
Run Code Online (Sandbox Code Playgroud)

您可以使用任何您喜欢的名称导入它


Tom*_*Tom 8

保罗的答案是你正在寻找的答案.但是,实际上,我认为您可能对我在自己的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 { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

(注意:我使用术语"场景"作为任何路线的顶级组件).

我希望这是有帮助的.我认为它比传统的更清洁connect( mapState, mapDispatch )( BareComponent )


Man*_*ham 5

default 基本上是 const someVariableName

您不需要命名标识符,因为它是文件的默认导出,您可以在导入时随意命名,因此default只需将变量赋值压缩为单个关键字。