前端刺客系列----Vue 3 入门介绍

打印 上一主题 下一主题

主题 844|帖子 844|积分 2532

目次
一.什么是 Vue 3?
二.Vue 3 的重要特性
三,Vue3项目实战
四.总结



在前端开发的天下里,Vue.js 作为一款渐进式的 JavaScript 框架,已成为很多开发者的首选工具。自从 Vue 3 发布以来,它带来了很多紧张的改进和新特性,不光提升了性能,还使得开发体验更加流畅。在这篇文章中,我们将详细介绍 Vue 3 的焦点概念,并通过一些简单的代码示例,资助大家快速上手 Vue 3。
一.什么是 Vue 3?

Vue.js 是一款渐进式的 JavaScript 框架,用于构建用户界面。它的设计理念非常机动,可以徐徐引入到项目中,顺应差别规模的需求。Vue 3 是 Vue.js 框架的最新版本,它在 Vue 2 的基础上进行了全面的优化,带来了以下几大亮点:
性能提升:Vue 3 引入了更高效的假造 DOM 和组件渲染机制,使得整体性能得到了明显提升。
组合式 API (Composition API):这是一种全新的编写组件的方式,使得逻辑复用和代码构造变得更加机动和清楚。
TypeScript 支持:Vue 3 在设计时就考虑到了 TypeScript,增强了对类型体系的支持。
更小的包体积:Vue 3 的焦点库相比 Vue 2 更加精简,加载速度更快。
多个其他新特性:如 Teleport、Suspense、Fragment 等。
在这篇文章中,我们会深入探索 Vue 3 的重要新特性,并通过示例资助大家更好地理解它。
二.Vue 3 的重要特性

1. 组合式 API (Composition API)
组合式 API 是 Vue 3 中最为紧张的新增特性之一。它答应开发者通过函数的方式构造和复用逻辑,相比于 Vue 2 中的选项式 API (Options API),组合式 API 提供了更强的机动性和可维护性。
为什么使用组合式 API?
更好的逻辑复用:组合式 API 答应将干系的逻辑封装到函数中,使得代码复用变得更加简洁。
更清楚的代码结构:你可以按照功能进行代码分离,而不再依赖于 Vue 2 中的 data、methods、computed 等选项,避免了大量冗长的逻辑。
TypeScript 更好的支持:组合式 API 更适合与 TypeScript 配合使用,因为它能更好地推导类型。
代码示例:使用组合式 API 创建一个计数器
  1. // App.vue
  2. <template>
  3.   <div>
  4.     <h1>{{ count }}</h1>
  5.     <button @click="increment">Increment</button>
  6.   </div>
  7. </template>
  8. <script setup>
  9. // 引入 Composition API 中的 `ref` 函数
  10. import { ref } from 'vue'
  11. // 定义一个响应式变量 `count`
  12. const count = ref(0)
  13. // 定义一个方法来更新 `count`
  14. const increment = () => {
  15.   count.value++
  16. }
  17. </script>
复制代码
在这个例子中,我们使用了 ref 函数来创建一个响应式变量 count,并用 increment 方法来更新它。ref 会将基本类型(如数字、字符串等)包装成响应式对象,通过 .value 来访问和修改其值。
2. 更高效的假造 DOM 和性能提升
Vue 3 在性能方面做了大量的优化。最明显的改进之一是假造 DOM 的实现变得更加高效。假造 DOM 是 Vue 用来追踪 DOM 变动的技能,它答应 Vue 对 DOM 进行准确的更新,而不是每次都完全重渲染整个页面。Vue 3 在此基础上进行了优化,使得渲染速度更快,尤其是在大规模应用中。
3. TypeScript 支持
Vue 3 从一开始就为 TypeScript 提供了更全面的支持。在 Vue 2 中,TypeScript 的集成不是特殊好,而 Vue 3 则原生支持 TypeScript,提供了更好的类型推导和类型查抄。
代码示例:使用 TypeScript 和 Vue 3
  1. // App.vue
  2. <template>
  3.   <div>
  4.     <h1>{{ count }}</h1>
  5.     <button @click="increment">Increment</button>
  6.   </div>
  7. </template>
  8. <script lang="ts" setup>
  9. import { ref } from 'vue'
  10. const count = ref<number>(0)
  11. const increment = () => {
  12.   count.value++
  13. }
  14. </script>
复制代码
在这个示例中,我们通过 lang="ts" 声明白 Vue 文件使用 TypeScript,并为 count 使用了明确的类型定义 ref<number>(0),这包管了变量 count 始终是数字类型。
4. Teleport
Vue 3 引入了一个新的内置组件 Teleport,它答应将一个组件的内容渲染到页面的任何位置,而不是默认的父组件中。这对于某些特殊场景,比如模态框、关照等非常有用。
代码示例:使用 Teleport 实现一个模态框
  1. <template>
  2.   <div>
  3.     <button @click="showModal = true">Open Modal</button>
  4.     <Teleport to="body">
  5.       <div v-if="showModal" class="modal">
  6.         <div class="modal-content">
  7.           <p>This is a modal!</p>
  8.           <button @click="showModal = false">Close</button>
  9.         </div>
  10.       </div>
  11.     </Teleport>
  12.   </div>
  13. </template>
  14. <script setup>
  15. import { ref } from 'vue'
  16. const showModal = ref(false)
  17. </script>
  18. <style>
  19. .modal {
  20.   position: fixed;
  21.   top: 50%;
  22.   left: 50%;
  23.   transform: translate(-50%, -50%);
  24.   background-color: white;
  25.   padding: 20px;
  26.   box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
  27. }
  28. </style>
复制代码
在这个例子中,我们使用了 Teleport 将模态框内容渲染到 body 元素下,而不是当前组件的 DOM 中。
5. Suspense 和异步组件
Vue 3 引入了 Suspense 组件,它使得异步加载的组件能够在数据加载完毕之前提供一个“加载中”的状态。这对于需要异步加载的应用非常有用,提升了用户体验。
代码示例:使用 Suspense 加载异步组件
  1. <template>
  2.   <Suspense>
  3.     <template #default>
  4.       <AsyncComponent />
  5.     </template>
  6.     <template #fallback>
  7.       <p>Loading...</p>
  8.     </template>
  9.   </Suspense>
  10. </template>
  11. <script setup>
  12. import { defineAsyncComponent } from 'vue'
  13. const AsyncComponent = defineAsyncComponent(() =>
  14.   import('./AsyncComponent.vue')
  15. )
  16. </script>
复制代码

三,Vue3项目实战

项目结构
  1. my-vue3-app/
  2. ├── public/
  3. │   └── index.html
  4. ├── src/
  5. │   ├── assets/
  6. │   ├── components/
  7. │   │   ├── TaskList.vue
  8. │   │   ├── TaskItem.vue
  9. │   │   └── AddTask.vue
  10. │   ├── store/
  11. │   │   └── taskStore.js
  12. │   ├── views/
  13. │   │   ├── Home.vue
  14. │   │   └── NotFound.vue
  15. │   ├── router/
  16. │   │   └── index.js
  17. │   ├── App.vue
  18. │   ├── main.js
  19. ├── package.json
  20. └── vite.config.js
复制代码
1. src/main.js - 项目入口文件
  1. import { createApp } from 'vue'
  2. import App from './App.vue'
  3. import router from './router'
  4. import { createStore } from 'vuex'
  5. const app = createApp(App)
  6. app.use(router)
  7. app.use(createStore({
  8.   state: {
  9.     tasks: []
  10.   },
  11.   mutations: {
  12.     addTask(state, task) {
  13.       state.tasks.push(task)
  14.     },
  15.     deleteTask(state, taskId) {
  16.       state.tasks = state.tasks.filter(task => task.id !== taskId)
  17.     },
  18.     toggleTaskCompletion(state, taskId) {
  19.       const task = state.tasks.find(t => t.id === taskId)
  20.       if (task) {
  21.         task.completed = !task.completed
  22.       }
  23.     },
  24.     editTask(state, { taskId, updatedTask }) {
  25.       const task = state.tasks.find(t => t.id === taskId)
  26.       if (task) {
  27.         Object.assign(task, updatedTask)
  28.       }
  29.     }
  30.   },
  31.   getters: {
  32.     completedTasks: (state) => {
  33.       return state.tasks.filter(task => task.completed)
  34.     },
  35.     pendingTasks: (state) => {
  36.       return state.tasks.filter(task => !task.completed)
  37.     }
  38.   }
  39. }))
  40. app.mount('#app')
复制代码
2. src/router/index.js - 路由配置 
  1. import { createRouter, createWebHistory } from 'vue-router'
  2. import Home from '../views/Home.vue'
  3. import NotFound from '../views/NotFound.vue'
  4. const routes = [
  5.   {
  6.     path: '/',
  7.     name: 'Home',
  8.     component: Home
  9.   },
  10.   {
  11.     path: '/:catchAll(.*)',
  12.     name: 'NotFound',
  13.     component: NotFound
  14.   }
  15. ]
  16. const router = createRouter({
  17.   history: createWebHistory(import.meta.env.BASE_URL),
  18.   routes
  19. })
  20. export default router
复制代码
3. src/views/Home.vue - 主页视图
  1. <template>
  2.   <div class="home">
  3.     <h1>Task Manager</h1>
  4.     <AddTask />
  5.     <h2>Pending Tasks</h2>
  6.     <TaskList :tasks="pendingTasks" />
  7.     <h2>Completed Tasks</h2>
  8.     <TaskList :tasks="completedTasks" />
  9.   </div>
  10. </template>
  11. <script setup>
  12. import { computed } from 'vue'
  13. import { useStore } from 'vuex'
  14. import TaskList from '../components/TaskList.vue'
  15. import AddTask from '../components/AddTask.vue'
  16. const store = useStore()
  17. const pendingTasks = computed(() => store.getters.pendingTasks)
  18. const completedTasks = computed(() => store.getters.completedTasks)
  19. </script>
  20. <style scoped>
  21. .home {
  22.   padding: 20px;
  23. }
  24. h1 {
  25.   color: #42b983;
  26. }
  27. </style>
复制代码
4. src/components/AddTask.vue - 添加任务组件
  1. <template>
  2.   <div class="add-task">
  3.     <input v-model="newTask" placeholder="Add a new task" @keyup.enter="addTask" />
  4.     <button @click="addTask">Add Task</button>
  5.   </div>
  6. </template>
  7. <script setup>
  8. import { ref } from 'vue'
  9. import { useStore } from 'vuex'
  10. const newTask = ref('')
  11. const store = useStore()
  12. const addTask = () => {
  13.   if (newTask.value.trim()) {
  14.     store.commit('addTask', {
  15.       id: Date.now(),
  16.       title: newTask.value,
  17.       completed: false
  18.     })
  19.     newTask.value = ''
  20.   }
  21. }
  22. </script>
  23. <style scoped>
  24. .add-task {
  25.   margin-bottom: 20px;
  26. }
  27. input {
  28.   padding: 8px;
  29.   margin-right: 10px;
  30.   width: 200px;
  31. }
  32. button {
  33.   padding: 8px 12px;
  34. }
  35. </style>
复制代码

5. src/components/TaskList.vue - 任务列表组件
  1. <template>
  2.   <div>
  3.     <ul>
  4.       <TaskItem
  5.         v-for="task in tasks"
  6.         :key="task.id"
  7.         :task="task"
  8.       />
  9.     </ul>
  10.   </div>
  11. </template>
  12. <script setup>
  13. import TaskItem from './TaskItem.vue'
  14. import { defineProps } from 'vue'
  15. const props = defineProps({
  16.   tasks: Array
  17. })
  18. </script>
  19. <style scoped>
  20. ul {
  21.   list-style: none;
  22.   padding-left: 0;
  23. }
  24. </style>
复制代码
6. src/components/TaskItem.vue - 任务项组件
  1. <template>
  2.   <li :class="{ completed: task.completed }">
  3.     <span @click="toggleCompletion">{{ task.title }}</span>
  4.     <button @click="deleteTask">Delete</button>
  5.     <button @click="editTask">Edit</button>
  6.   </li>
  7. </template>
  8. <script setup>
  9. import { defineProps } from 'vue'
  10. import { useStore } from 'vuex'
  11. const props = defineProps({
  12.   task: Object
  13. })
  14. const store = useStore()
  15. const toggleCompletion = () => {
  16.   store.commit('toggleTaskCompletion', props.task.id)
  17. }
  18. const deleteTask = () => {
  19.   store.commit('deleteTask', props.task.id)
  20. }
  21. const editTask = () => {
  22.   const newTitle = prompt('Edit Task Title', props.task.title)
  23.   if (newTitle && newTitle !== props.task.title) {
  24.     store.commit('editTask', {
  25.       taskId: props.task.id,
  26.       updatedTask: { title: newTitle }
  27.     })
  28.   }
  29. }
  30. </script>
  31. <style scoped>
  32. .completed {
  33.   text-decoration: line-through;
  34. }
  35. button {
  36.   margin-left: 10px;
  37.   padding: 5px 10px;
  38.   cursor: pointer;
  39. }
  40. </style>
复制代码
7. src/views/NotFound.vue - 404 页面视图
  1. <template>
  2.   <div class="not-found">
  3.     <h1>404 - Page Not Found</h1>
  4.   </div>
  5. </template>
  6. <script setup>
  7. </script>
  8. <style scoped>
  9. .not-found {
  10.   text-align: center;
  11.   padding: 50px;
  12. }
  13. </style>
复制代码

8. public/index.html - 项目 HTML 模板
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.   <meta charset="UTF-8">
  5.   <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.   <title>Vue 3 Task Manager</title>
  7. </head>
  8. <body>
  9.   <div id="app"></div>
  10. </body>
  11. </html>
复制代码
9. package.json - 项目依赖
  1. {
  2.   "name": "vue3-task-manager",
  3.   "version": "1.0.0",
  4.   "main": "src/main.js",
  5.   "scripts": {
  6.     "dev": "vite",
  7.     "build": "vite build",
  8.     "serve": "vite preview"
  9.   },
  10.   "dependencies": {
  11.     "vue": "^3.2.0",
  12.     "vue-router": "^4.0.0",
  13.     "vuex": "^4.0.0"
  14.   },
  15.   "devDependencies": {
  16.     "vite": "^4.0.0"
  17.   }
  18. }
复制代码

10. vite.config.js - Vite 配置
  1. import { defineConfig } from 'vite'
  2. import vue from '@vitejs/plugin-vue'
  3. // https://vitejs.dev/config/
  4. export default defineConfig({
  5.   plugins: [vue()]
  6. })
复制代码
四.总结

    Vue 3 是 Vue.js 框架的最新版本,它带来了多个令人等待的改进和特性,旨在提升开发者体验和性能。最明显的变化是引入了 组合式 API,通过 setup() 函数和 ref、reactive 等新的响应式机制,开发者可以更机动地构造组件逻辑,避免了 Vue 2 中的复杂选项式 API,提升了代码的可维护性和逻辑复用性。别的,Vue 3 进一步优化了性能,框架的体积比 Vue 2 小了约 30%,并且假造 DOM 的更新算法也得到了改进,使得更新速度更快,启动时间也大大紧缩。同时,Vue 3 完美支持 TypeScript,增强了类型推导和类型查抄,使得大型项目的开发更加安全和高效。Vue 3 还支持 Fragment,答应组件返回多个根节点,从而避免了不必要的 DOM 包裹元素。新参加的 Teleport 组件使得将内容渲染到页面的任意位置变得简单,例如模态框、弹窗等 UI 组件的处理更加机动。而 Suspense 则提供了对异步组件的优雅处理,答应开发者在组件加载时显示占位符内容,改善用户体验。别的,Vue 3 与 Vite 集成紧密,Vite 作为构建工具提供了极快的热更新和构建速度,极大提升了开发效率。对于 Vue 2 的开发者,Vue 3 提供了良好的向后兼容性,使得迁徙过程更加平滑,且框架支持通过 @vue/compat 模式徐徐过渡。总体而言,Vue 3 是一个强大、机动且高效的框架,既适合小型项目,也能够满足大型应用的开发需求,资助开发者构建更当代化、响应式和可扩展的 Web 应用。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

忿忿的泥巴坨

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表