本文最后更新于 69 天前,其中的信息可能已经有所发展或是发生改变。
| + 性能提升:虚拟DOM重写,速度提升2倍+ |
| + 体积优化:Tree-shaking支持,核心包仅11kb |
| + 组合式API:更好的逻辑复用与TypeScript支持 |
| + 响应式升级:基于Proxy实现全语言特性支持 |
| npm create vue@latest |
| Project name: vue3-demo |
| Add TypeScript? Yes |
| Add Pinia? Yes |
| Add Vue Router? Yes |
| Add ESLint? Yes |
| src/ |
| ├── main.ts |
| ├── App.vue |
| ├── views/ |
| ├── components/ |
| ├── router/ |
| ├── stores/ |
| └── assets/ |
| npm run dev |
| npm run build |
| <script setup> |
| import { ref, computed } from 'vue' |
| |
| |
| const count = ref(0) |
| |
| |
| const double = computed(() => count.value * 2) |
| |
| |
| const increment = () => count.value++ |
| </script> |
| |
| <template> |
| <button @click="increment"> |
| {{ count }} → {{ double }} |
| </button> |
| </template> |
| const user = reactive({ |
| name: 'Alice', |
| age: 25, |
| skills: ['Vue', 'TypeScript'] |
| }) |
| |
| |
| watchEffect(() => { |
| console.log(`用户名更新为:${user.name}`) |
| }) |
| |
| <Child :msg="message" @update="handleUpdate" /> |
| |
| |
| <script setup> |
| defineProps(['msg']) |
| defineEmits(['update']) |
| </script> |
| <template> |
| <header>导航栏</header> |
| <main>内容区</main> |
| <footer>底部信息</footer> |
| </template> |
| <teleport to="#modal-container"> |
| <div class="modal"> |
| <slot /> |
| </div> |
| </teleport> |
| |
| export const useCounterStore = defineStore('counter', { |
| state: () => ({ count: 0 }), |
| actions: { |
| increment() { this.count++ } |
| } |
| }) |
| |
| |
| const counter = useCounterStore() |
| // router/index.ts |
| const routes = [ |
| { |
| path: '/', |
| component: HomeView, |
| meta: { requiresAuth: true } |
| }, |
| { |
| path: '/login', |
| component: () => import('@/views/LoginView.vue') |
| } |
| ] |
| <script setup> |
| const AsyncComponent = defineAsyncComponent(() => |
| import('./components/HeavyComponent.vue') |
| ) |
| </script> |
优化方向 |
实现方法 |
效果提升 |
代码分割 |
路由级组件动态导入 |
首屏加载快 60% |
响应式优化 |
使用 shallowRef/shallowReactive |
内存消耗降 40% |
列表渲染 |
v-for 搭配 key 属性 |
更新速度提升 3x |
静态提升 |
编译器自动优化 |
Patch 速度提升 2x |
| |
| const { x, y } = reactivePos |
| |
| |
| const pos = reactive({ x: 0, y: 0 }) |
| const x = toRef(pos, 'x') |
| const y = toRef(pos, 'y') |
| Vue2选项式API Vue3组合式API |
| beforeCreate → setup() |
| created → setup() |
| beforeMount → onBeforeMount |
| mounted → onMounted |
| beforeUpdate → onBeforeUpdate |
| updated → onUpdated |
| beforeUnmount → onBeforeUnmount |
| unmounted → onUnmounted |
| interface User { |
| id: number |
| name: string |
| } |
| |
| const user = reactive<User>({ id: 1, name: 'John' }) |
| + 官方推荐学习路径:Vue3 → Pinia → Vue Router → Vite |
| + 最新特性:尝试 Composition API + <script setup> 语法 |
| - 注意:避免在reactive中使用解构操作 |
写的不错,对新手用户十分友好,易懂,继续加油!!!