本文章主要是为有 Vue 2 经验的用户希望了解 Vue 3 的新功能和更改而提供的。需要用户熟悉Vue 2。
Vue3.x文档地址:https://v3.cn.vuejs.org/
片段
Vue3的新特性中,组件template不在要求返回一个根节点,可以返回多个根节点
2.x语法
<!-- Layout.vue -->
<template>
<div>
<header>...</header>
<main>...</main>
<footer>...</footer>
</div>
</template>
3.x语法,组件可以包含多个根节点!
<!-- Layout.vue -->
<template>
<header>...</header>
<main v-bind="$attrs">...</main>
<footer>...</footer>
</template>
Teleport
Teleport(传送),3.x中提供一种新标签,被teleport标签包裹的部分,不会显示在当前组件中,而是会被插入到"to“指定的DOM中
<template>
<button @click="modalOpen = true">
Open full screen modal! (With teleport!)
</button>
<teleport to="body">
<div v-if="modalOpen" class="modal">
<div>
I'm a teleported modal!
(My parent is "body")
<button @click="modalOpen = false">
Close
</button>
</div>
</div>
</teleport>
</template>
触发组件选项
Vue3.x中可以绑定多个v-model,并且可以通过update:[prop参数]方法,在子组件中直接更新父组件的元素,新的特性结合了v-model和props的写法
<user-name
v-model:first-name="firstName"
v-model:last-name="lastName"
></user-name>
app.component('user-name', {
props: {
firstName: String,
lastName: String
},
emits: ['update:firstName', 'update:lastName'],
template: `
<input
type="text"
:value="firstName"
@input="$emit('update:firstName', $event.target.value)">
<input
type="text"
:value="lastName"
@input="$emit('update:lastName', $event.target.value)">
`
})
Provide / Inject
在项目中经常会遇到父组件向子组件传值的情况,或者很多子组件,孙子组件或更深层的组件传值的问题,需要用到props传递,对于这种情况,我们可以使用一对
provide和inject。无论组件层次结构有多深,父组件都可以作为其所有子组件的依赖提供者。这个特性有两个部分:父组件有一个provide选项来提供数据,子组件有一个inject选项来开始使用这些数据
const app = Vue.createApp({})
app.component('todo-list', {
data() {
return {
todos: ['Feed a cat', 'Buy tickets']
}
},
provide: {
user: 'John Doe'
},
template: `
<div>
{{ todos.length }}
<!-- 模板的其余部分 -->
</div>
`
})
app.component('todo-list-statistics', {
inject: ['user'],
created() {
console.log(`Injected property: ${this.user}`) // > 注入 property: John Doe
}
})
组合式API
2.x中的写法被称为Option Api,在一个json中提前配置好props,data,computed,watch,methods,生命周期等
export default {
components: { },
props: {
},
data () {
return {
}
},
computed: {
},
watch: {
},
methods: {
},
mounted () {
}
}
3.x中提供了新的API setup
WARNING
由于在执行
setup时,组件实例尚未被创建,因此在setup选项中没有this。这意味着,除了props之外,你将无法访问组件中声明的任何属性——本地状态、计算属性或方法。
// src/components/UserRepositories.vue
export default {
components: { RepositoriesFilters, RepositoriesSortBy, RepositoriesList },
props: {
user: {
type: String,
required: true
}
},
setup(props,context) {
console.log(props) // { user: '' }
return {} // 这里返回的任何内容都可以用于组件的其余部分
}
}
在setup中可以实现props,data,computed,watch,methods,生命周期等特性
// src/components/UserRepositories.vue `setup` function
import { fetchUserRepositories } from '@/api/repositories'
import { ref, onMounted, watch, toRefs } from 'vue'
// 在我们组件中
setup (props) {
// 使用 `toRefs` 创建对prop的 `user` property 的响应式引用
const { user } = toRefs(props)
const repositories = ref([])
const getUserRepositories = async () => {
// 更新 `prop.user` 到 `user.value` 访问引用值
repositories.value = await fetchUserRepositories(user.value)
}
onMounted(getUserRepositories)
// 在用户 prop 的响应式引用上设置一个侦听器
watch(user, getUserRepositories)
return {
repositories,
getUserRepositories
}
}