javascript - 为什么在浏览器中运行 expo 应用程序时导出默认会引发错误?
问题描述
我有一个使用导出默认值的组件:
export default CategoryCard = (props) => {
const {name, color, onPress } = props
return ( ..my code
所以导入语句是import CategoryCard
.
当我尝试使用 Expo Client 在浏览器中运行时,浏览器返回错误“ReferenceError: CategoryCard is not defined”
如果我更改
export default CategoryCard
为export const CategoryCard
并更改import CategoryCard
为,import { CategoryCard }
则浏览器中的一切正常。
我理解这些陈述之间的区别,我在这里并不过分担心,因为这是一个最终不会在浏览器中运行的本机应用程序 - 但我只是好奇我自己了解这里发生了什么以及为什么浏览器没有'不喜欢导出默认值。
解决方案
如果你有一些东西可以让你在没有const
(或let
)的情况下执行版本,那么它实现的模块不正确。线
export default CategoryCard = (props) => {
说“将此值(箭头函数)分配给已经存在的变量CategoryCard
并将该值导出为该模块的默认导出。” 模块总是处于严格模式,所以如果你没有CategoryCard
任何地方的声明,那就是引用错误。(如果没有严格模式,您可以通过分配给未声明的变量来创建全局变量,但这是一个坏主意™。:-))
由于模块总是严格的,你需要它const
或let
在那里:
export default const CategoryCard = (props) => {
// −−−−−−−−−−−−^^^^^
给你错误的浏览器是正确的,因为它是一个 ReferenceError (在严格模式下)分配给一个未声明的标识符。
这并不是说您总是必须拥有const
orlet
或function
or 。您不需要,您可以将任意表达式的结果导出为默认导出。这是有效的代码,例如:class
export
export default 6 * 7;
因此,如果您在CategoryCard
其他地方申报,您的出口将是有效的:
let CategoryCard;
export default CategoryCard = (props) => {
我当然不是建议这样做,只是指出它是有效的。:-)
推荐阅读
- python - 如何映射两个 Pandas 数据框之间的多对一关系?
- python - 如何根据python selenium中的父元素获取子元素
- micronaut-data - 以编程方式获取 Micronaut 数据源
- firebase - Flutter Firebase FCM 未收到消息
- node.js - 为什么不制作没有后端的 React 应用程序?
- android - android jetpack compose中的可组合注释
- angular - mat-autocomplete 输入元素在组件初始化时显示 [object object]
- mongodb - 在mongodb中搜索更多嵌套对象或更多文档是否更快
- amazon-web-services - Cloudformation 错误:无效的可用区:[ap-southeast-2](服务:AmazonEC2;状态代码:400;错误代码:InvalidParameterValue
- python - 文件名作为字典中的键 - 熊猫