让我详细说明Vue3和Vue2的主要区别,并提供实例说明:
- 响应式系统
Vue2:使用Object.defineProperty()
// Vue2
export default {
data() {
return {
user: {
name: '张三'
}
}
}
}
Vue3:使用Proxy
// Vue3
import { reactive } from 'vue'
export default {
setup() {
const state = reactive({
user: {
name: '张三'
}
})
return { state }
}
}
- 组合式API (Composition API)
Vue2:选项式API
// Vue2
export default {
data() {
return {
count: 0
}
},
methods: {
increment() {
this.count++
}
},
mounted() {
console.log('组件挂载完成')
}
}
Vue3:组合式API
// Vue3
import { ref, onMounted } from 'vue'
export default {
setup() {
const count = ref(0)
function increment() {
count.value++
}
onMounted(() => {
console.log('组件挂载完成')
})
return {
count,
increment
}
}
}
- 生命周期钩子
Vue2:
export default {
beforeCreate() {},
created() {},
beforeMount() {},
mounted() {},
beforeUpdate() {},
updated() {},
beforeDestroy() {},
destroyed() {}
}
Vue3:
import {
onBeforeMount,
onMounted,
onBeforeUpdate,
onUpdated,
onBeforeUnmount,
onUnmounted
} from 'vue'
export default {
setup() {
onBeforeMount(() => {})
onMounted(() => {})
onBeforeUpdate(() => {})
onUpdated(() => {})
onBeforeUnmount(() => {})
onUnmounted(() => {})
}
}
- 多根节点组件(Fragment)
Vue2:只允许一个根节点
<!-- Vue2 -->
<template>
<div>
<header>...</header>
<main>...</main>
<footer>...</footer>
</div>
</template>
Vue3:支持多根节点
<!-- Vue3 -->
<template>
<header>...</header>
<main>...</main>
<footer>...</footer>
</template>
- 更好的TypeScript支持
Vue3实例:
import { defineComponent, ref } from 'vue'
interface User {
name: string;
age: number;
}
export default defineComponent({
setup() {
const user = ref<User>({
name: '张三',
age: 25
})
return { user }
}
})
- Teleport组件
<!-- Vue3 Teleport示例 -->
<template>
<button @click="showModal = true">打开模态框</button>
<teleport to="body">
<div v-if="showModal" class="modal">
<h2>模态框内容</h2>
<button @click="showModal = false">关闭</button>
</div>
</teleport>
</template>
- 性能优化
Vue3实例:
// Vue3优化示例
import { defineComponent, ref } from 'vue'
export default defineComponent({
setup() {
// 响应式引用
const list = ref([])
// 无需声明的计算属性
const filteredList = computed(() => {
return list.value.filter(item => item.active)
})
return { list, filteredList }
}
})
主要改进总结:
- 性能提升:
- 更小的打包体积
- 更快的渲染速度
- 更低的内存占用
- 更好的代码组织:
- Composition API提供更灵活的代码复用
- 更好的逻辑复用和组织
- 更好的TypeScript支持
- 新特性:
- Teleport组件
- Fragments
- Suspense组件
- 自定义渲染器API
- 开发体验改进:
- 更好的IDE支持
- 更详细的警告信息
- 更好的调试支持
实际项目中的最佳实践:
// 可复用的组合式函数
import { ref, onMounted, watch } from 'vue'
export function useUserData() {
const userData = ref(null)
const loading = ref(false)
const error = ref(null)
async function fetchUserData(id) {
loading.value = true
try {
const response = await fetch(`/api/users/${id}`)
userData.value = await response.json()
} catch (e) {
error.value = e
} finally {
loading.value = false
}
}
return {
userData,
loading,
error,
fetchUserData
}
}
// 组件中使用
export default {
setup() {
const { userData, loading, error, fetchUserData } = useUserData()
onMounted(() => {
fetchUserData(1)
})
return {
userData,
loading,
error
}
}
}
评论区