组件基础 组件允许我们将UI拆分为独立和可重用的部分,并单独考虑每个部分。一个应用通常组织成嵌套组件的树
这与我们嵌套原生的HTML元素非常相似,但Vue实现了自己的组件模型,允许我们在每个组件中封装自定义内容和逻辑。Vue也与原生的Web组件很好地配合。如果您对Vue组件和原生Web组件之间的关系感兴趣,请在此了解更多。
定义组件 当使用构建步骤时,我们通常使用.vue扩展名定义每个Vue组件在专用文件中,称为单文件组件(SFC)
vue
export default {
data() {
return {
count: 0
}
}
}
vue
import { ref } from 'vue'
const count = ref(0)
当不使用构建步骤时,Vue组件可以定义为一个包含Vue特定选项的普通JavaScript对象
jsexport default {
data() {
return {
count: 0
}
},
template: `
You clicked me {{ count }} times.
`
}jsimport { ref } from 'vue'
export default {
setup() {
const count = ref(0)
return { count }
},
template: `
You clicked me {{ count }} times.
`
// Can also target an in-DOM template:
// template: '#my-template-element'
}这里将模板内联为JavaScript字符串,Vue会即时编译它。您还可以使用ID选择器指向一个元素(通常是原生的元素)- Vue将使用其内容作为模板源。
上述示例定义了一个单个组件,并将其作为 .js 文件的默认导出导出,但您可以使用命名导出从同一文件中导出多个组件。
使用组件 提示
本指南的其余部分将使用 SFC 语法 - 无论是否使用构建步骤,组件的概念都是相同的。《示例》部分显示了两种情况下的组件使用。
要使用子组件,我们需要在父组件中导入它。假设我们将计数器组件放在名为 ButtonCounter.vue 的文件中,该组件将作为文件的默认导出
vue
import ButtonCounter from './ButtonCounter.vue'
export default {
components: {
ButtonCounter
}
}
Here is a child component!
为了将导入的组件暴露给我们的模板,我们需要使用 components 选项将其注册。然后,组件将可以使用其注册的键作为标签使用。
vue
import ButtonCounter from './ButtonCounter.vue'
Here is a child component!
使用
{{ title }}
当值传递给 prop 属性时,它成为该组件实例的一个属性。该属性的值在模板和组件的 this 上下文中都是可访问的,就像任何其他组件属性一样。
vue
defineProps(['title'])
{{ title }}
defineProps 是一个编译时宏,仅在 vue
defineProps(['title'])
defineEmits(['enlarge-text'])
这记录了组件发出的所有事件,并可选择 验证它们。它还允许Vue避免将它们隐式地应用于子组件根元素的原生监听器。
与 defineProps 类似,defineEmits 只能在 另请参阅: 组件发出事件的类型化
如果您不使用