让我详细说明Vue3和Vue2的主要区别,并提供实例说明:

  1. 响应式系统
    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 }
  }
}
  1. 组合式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
    }
  }
}
  1. 生命周期钩子
    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(() => {})
  }
}
  1. 多根节点组件(Fragment)
    Vue2:只允许一个根节点
<!-- Vue2 -->
<template>
  <div>
    <header>...</header>
    <main>...</main>
    <footer>...</footer>
  </div>
</template>

Vue3:支持多根节点

<!-- Vue3 -->
<template>
  <header>...</header>
  <main>...</main>
  <footer>...</footer>
</template>
  1. 更好的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 }
  }
})
  1. 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>
  1. 性能优化
    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 }
  }
})

主要改进总结:

  1. 性能提升:
  • 更小的打包体积
  • 更快的渲染速度
  • 更低的内存占用
  1. 更好的代码组织:
  • Composition API提供更灵活的代码复用
  • 更好的逻辑复用和组织
  • 更好的TypeScript支持
  1. 新特性:
  • Teleport组件
  • Fragments
  • Suspense组件
  • 自定义渲染器API
  1. 开发体验改进:
  • 更好的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
    }
  }
}