javascript - 我可以从一个 Vue.js 组件中导出两个对象吗?
问题描述
我想知道是否可以从 Vue.js 组件中导出两个对象,以便其他组件可以选择使用哪一个。
这是我正在使用的示例:
关于FooBar.vue:
<template>
<span>{{ text }}</span>
</template>
<script>
export default {
name: 'Foo',
data: () => {
return {
text: 'foo'
}
}
}
const Bar = {
name: 'Bar',
data: () => {
return {
text: 'bar'
}
}
}
export { Bar }
</script>
然后我在 About.vue 中同时导入 Foo 和 Bar:
<template>
<div class="about">
<h1>This is the about page</h1>
<Foo /><br/>
<Bar />
</div>
</template>
<script>
import Foo from './AboutFooBar'
import { Bar } from './AboutFooBar'
export default {
name: 'About',
components: {
Foo,
Bar
},
data: () => {
return {
}
}
}
</script>
我期望在页面上看到的是:
This is the about page
Foo
Bar
...但相反,我看到:
This is the about page
Foo
所以它似乎无法识别 Bar。我期望我可以选择要导入的对象,并且该对象的数据将确定填充到模板中的内容(因此组件 Foo 的文本“foo”和组件 Bar 的“bar”)。
有没有办法做我想做的事?谢谢。
解决方案
首先,我认为这几乎肯定不是一个好的模式。组件应该被适当地减少和封装,并且可读。
如果像示例一样Foo
并且Bar
相似,则它们应该是一个组件,被调用两次,并且每次都被赋予不同的道具。另一方面,如果它们不同,它们应该是不同的组件。
尽管如此,为了回答这个问题: Vue 加载器期望并需要默认导出来包含组件。这就是您注意到的行为的原因。
其他人对此提出了疑问,Evan You(Vue 的创建者)在此功能请求中发表了评论。我也会在这里包括他的评论:
组件本身必须是默认导出。这是一个要求。
模块热替换、CSS 注入、作用域 CSS、SSR 关键 CSS 集合等功能都依赖于能够精确定位导出的组件 - 如果组件可以导出为任意命名的组件,则它将不起作用。此外,还有一些工具(例如 ESLint 插件)基于组件是默认导出的假设。
TL;DR:组件必须是默认导出,这不会改变。
推荐阅读
- javascript - 浏览器中的大数字算术,速度快得令人怀疑?
- node.js - 架构中的属性值采用默认值而不是 MongoDB/Mongoose 中定义的值
- matlab - 在 Matlab 中通过重建进行形态闭合
- reactjs - 在项目中使用两个不同的 React/React-Dom 版本
- google-api - 无法获取 Chrome Web Store API 的刷新令牌以发布 Chrome 扩展
- ionic-framework - 打包安卓。support.v4.content 不存在
- r - 计算不同日期同一时间的平均值
- ios - 目前无法安装此应用 Xcode 11
- php - 卸载shopify应用任何回调或设置
- python - 当方法被孩子覆盖时,在 super().__init__ 中调用父方法