Javascript 为什么“导出默认常量”无效?
我认为以下几点很好:Javascript 为什么“导出默认常量”无效?,javascript,scope,export,constants,default,Javascript,Scope,Export,Constants,Default,我认为以下几点很好: 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
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
与导出默认值
一起无效?这是一个不必要的添加&任何声明为导出默认值
的内容都被假定为常量
或类似的内容 const
类似于let
,(VariableStatement,Declaration),用于定义块中的标识符
您正试图将其与default
关键字混合,以遵循它
因此,它是一个语法错误
如果要
const
某些内容,则需要提供标识符,而不是使用default
export
本身接受右侧的可变语句或声明
以下是精细的
导出默认选项卡代码>
选项卡
成为AssignmentExpression,因为它被指定为默认名称
导出默认选项卡=连接(mapState,mapDispatch)(选项卡)代码>很好
这里Tab=connect(mapState,mapsdispatch)(Tabs)代码>是一个赋值表达式
更新:想象问题的另一种方式
如果您试图从概念上理解这一点,而上面的规范推理没有帮助,请将其视为“如果default
是合法标识符而不是保留令牌,那么编写export default Foo;
和export default const Foo=1;
的不同方式是什么?”
在这种情况下,扩展的编写方法是
//伪代码,这个思维实验是无效的
导出默认Foo;
//就像
export const default=Foo;
导出默认常量Foo=1;
//就像
导出常量默认常量Foo=1;
//那么下面这句话有意义吗?
常数棒常数Foo=1;
有一个有效的论点是,展开式应该是这样的
//伪代码,这个思维实验是无效的
导出默认常量Foo=1;
//就像
常数Foo=1;
export const default=Foo;
但是,这将变得不明确,因此显式地编写此模式更为合理。如果要导出默认的const/let,而不是
const MyComponent = ({ attr1, attr2 }) => (<p>Now Export On other Line</p>);
export default MyComponent
constmycomponent=({attr1,attr2})=>(现在导出到另一行上);
导出默认MyComponent
你可以这样做,我个人不喜欢
let MyComponent;
export default MyComponent = ({ }) => (<p>Now Export On SameLine</p>);
let MyComponent;
导出默认MyComponent=({})=>(现在在SameLine上导出);
保罗的答案就是你想要的答案。然而,作为一个实际问题,我认为您可能对我在自己的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)
要干净得多。如果在文件名MyComponent.js
中解释了组件名称,只需不命名组件,即可保持代码精简
import React from 'react'
export default (props) =>
<div id='static-page-template'>
{props.children}
</div>
从“React”导入React
导出默认值(道具)=>
{props.children}
更新:由于这会在堆栈跟踪中将其标记为未知,因此不建议这样做
更新2:我只使用了下面的es5版本,因为它将名称保留在堆栈跟踪和react dev工具上
import React from 'react'
export default function MyComponent(props) {
return (<div id='static-page-template'>
{props.children}
</div>)
}
从“React”导入React
导出默认函数MyComponent(道具){
返回(
{props.children}
)
}
保罗给出的答案是最好的。要扩大,
每个文件只能有一个默认导出。然而,可以有多个常量导出。默认变量可以使用任何名称导入,而const变量可以使用其特定名称导入
var message2='我被导出';
导出默认消息2;
export const message='我也被导出'
在导入端,我们需要像这样导入它:
从“/test”导入{message};
或
从“/test”导入消息;
在第一次导入中,const变量被导入,而在第二次导入中,默认变量将被导入。对我来说,这只是typescript的许多特性(强调特性(t))中的一个,这些特性会导致人们拔出头发诅咒开发人员。也许他们可以想出更容易理解的错误信息 默认值
基本上是常量someVariableName
您不需要命名标识符,因为它是文件的默认导出,您可以在导入时根据需要命名它,因此default
只是将变量赋值压缩为单个关键字。答案是它如何变成错误。问题仍然是为什么?它以这种方式防止常量滥用的一个原因是:导出默认常量a=1,b=3,c=4“AFAIK导出本身不应向当前范围添加任何内容”
这不太准确,因为export const a=1
将a
添加到当前上下文中。即使在类的情况下使用export default
,因为export default class MyClass{}
也会将MyClass
添加到当前上下文中。@SergeyOrlov同意这解释了如何产生错误,但没有说明为什么需要这样做。虽然我不确定这是唯一的原因,但你可能应该把它作为一个单独的答案,而不是对这个问题的评论;导出默认值a当变量a已经导入到另一个模块中时,代码>然后更新变量a,为什么e