找回密码
 立即注册
首页 业界区 业界 【AI Generated】从零学习Vue.js

【AI Generated】从零学习Vue.js

咳镘袁 2025-6-6 14:56:56
从零学习Vue.js

目录


  • 引言
  • 准备工作
  • Vue.js 基础

    • 3.1 Vue 实例
    • 3.2 模板语法
    • 3.3 数据绑定
    • 3.4 计算属性和侦听器
    • 3.5 Class 与 Style 绑定
    • 3.6 条件渲染
    • 3.7 列表渲染
    • 3.8 事件处理
    • 3.9 表单输入绑定

  • Vue.js 组件

    • 4.1 组件基础
    • 4.2 组件注册
    • 4.3 父子组件通信
    • 4.4 插槽
    • 4.5 动态组件
    • 4.6 异步组件

  • Vue Router

    • 5.1 路由基础
    • 5.2 动态路由匹配
    • 5.3 嵌套路由
    • 5.4 路由守卫
    • 5.5 路由元信息
    • 5.6 导航守卫
    • 5.7 路由懒加载

  • Vuex 状态管理

    • 6.1 Vuex 基础
    • 6.2 核心概念
    • 6.3 模块化
    • 6.4 中间件
    • 6.5 辅助函数

  • 项目实战

    • 7.1 项目初始化
    • 7.2 组件设计
    • 7.3 路由配置
    • 7.4 状态管理
    • 7.5 API 集成
    • 7.6 部署与优化

  • 进阶概念

    • 8.1 自定义指令
    • 8.2 混入
    • 8.3 插件
    • 8.4 服务端渲染 (SSR)
    • 8.5 Vue 3 新特性

  • 总结与展望
1. 引言

Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架。它的设计理念是尽量简单,同时提供足够的灵活性和性能来应对复杂的应用需求。本书将带你从零开始学习 Vue.js,逐步掌握其核心概念和高级特性。
2. 准备工作

在开始学习 Vue.js 之前,你需要具备以下基础知识:

  • HTML/CSS 基础
  • JavaScript 基础
此外,你需要准备以下开发工具:

  • 一个现代浏览器(如 Chrome 或 Firefox)
  • 一个代码编辑器(如 VS Code 或 Sublime Text)
  • Node.js 和 npm(用于管理项目依赖)
安装 Node.js 和 npm:

  • 访问 Node.js 官网 下载并安装适用于你操作系统的版本。
  • 安装完成后,打开终端(或命令提示符)并运行以下命令,确认安装成功:
    1. node -v
    2. npm -v
    复制代码
3. Vue.js 基础

3.1 Vue 实例

Vue.js 应用的核心是 Vue 实例。你可以通过创建一个新的 Vue 实例来启动一个 Vue 应用。
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <template>
  5.   <input v-focus>
  6. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><title>Vue.js 学习</title>
  7. <template>
  8.   <input v-focus>
  9. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>
  10. </head>
  11. <body>
  12. <template>
  13.   <input v-focus>
  14. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><p>{{ message }}</p>
  15. <template>
  16.   <input v-focus>
  17. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><input v-model="message">
  18. </body>
  19. </html>
复制代码
3.2 模板语法

Vue.js 使用一种基于 HTML 的模板语法,允许你声明式地绑定数据到 DOM。
  1. <template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><p>{{ message }}</p>
  4. <template>
  5.   <input v-focus>
  6. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><p v-bind:title="message">鼠标悬停查看消息</p>
复制代码
3.3 数据绑定

Vue.js 提供了两种主要的数据绑定方式:插值和指令。
  1. <template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><p>{{ message }}</p>
  4. <template>
  5.   <input v-focus>
  6. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><input v-model="message">
复制代码
3.4 计算属性和侦听器

计算属性用于对数据进行计算和处理,而侦听器用于监听数据的变化。
  1. <template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><p>原始消息: {{ message }}</p>
  4. <template>
  5.   <input v-focus>
  6. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><p>反转消息: {{ reversedMessage }}</p>
复制代码
3.5 Class 与 Style 绑定

你可以动态地绑定 HTML 元素的 class 和 style。
  1. <template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>Class 绑定
  4. <template>
  5.   <input v-focus>
  6. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>Style 绑定
复制代码
3.6 条件渲染

使用 v-if 指令可以根据条件渲染元素。
  1. <template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><p v-if="seen">现在你看到我了</p>
复制代码
3.7 列表渲染

使用 v-for 指令可以渲染一个列表。
  1. <template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><ul>
  4. <template>
  5.   <input v-focus>
  6. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  7.   <input v-focus>
  8. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><li v-for="item in items" v-bind:key="item.id">
  9. <template>
  10.   <input v-focus>
  11. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  12.   <input v-focus>
  13. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  14.   <input v-focus>
  15. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>{{ item.text }}
  16. <template>
  17.   <input v-focus>
  18. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  19.   <input v-focus>
  20. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component></li>
  21. <template>
  22.   <input v-focus>
  23. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component></ul>
复制代码
3.8 事件处理

使用 v-on 指令可以监听 DOM 事件。
  1. <template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><button v-on:click="greet">点击我</button>
复制代码
3.9 表单输入绑定

使用 v-model 指令可以实现表单输入与应用状态的双向绑定。
  1. <template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><input v-model="message">
  4. <template>
  5.   <input v-focus>
  6. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><p>{{ message }}</p>
复制代码
4. Vue.js 组件

4.1 组件基础

组件是 Vue.js 的核心概念,用于构建可复用的 UI 片段。
  1. <template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>
复制代码
4.2 组件注册

组件可以全局注册或局部注册。
  1. [/code][size=4]4.3 父子组件通信[/size]
  2. 父组件可以通过 props 向子组件传递数据,子组件可以通过事件向父组件发送消息。
  3. [code]<template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>
复制代码
4.4 插槽

插槽允许你在组件中插入内容。
  1. <template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  6.   <input v-focus>
  7. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>[b]注意![/b] 这是一个重要的消息。<template>
  8.   <input v-focus>
  9. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>
复制代码
4.5 动态组件

动态组件允许你在同一个挂载点动态切换多个组件。
  1. <template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>显示 A<template>
  6.   <input v-focus>
  7. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>显示 B
复制代码
4.6 异步组件

异步组件可以按需加载,减少初始加载时间。
  1. Vue.component('async-example', function (resolve, reject) {<template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>setTimeout(function () {<template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  6.   <input v-focus>
  7. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>// 向 `resolve` 回调传递组件定义<template>
  8.   <input v-focus>
  9. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  10.   <input v-focus>
  11. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>resolve({<template>
  12.   <input v-focus>
  13. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  14.   <input v-focus>
  15. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  16.   <input v-focus>
  17. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>template: '异步组件加载成功!'<template>
  18.   <input v-focus>
  19. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  20.   <input v-focus>
  21. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>})<template>
  22.   <input v-focus>
  23. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>}, 1000)})
复制代码
5. Vue Router

5.1 路由基础

Vue Router 是 Vue.js 的官方路由管理器,用于构建单页应用。
  1. <template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>Vue Router 学习<template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  6.   <input v-focus>
  7. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  8.   <input v-focus>
  9. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  10.   <input v-focus>
  11. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  12.   <input v-focus>
  13. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>首页<template>
  14.   <input v-focus>
  15. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  16.   <input v-focus>
  17. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>关于<template>
  18.   <input v-focus>
  19. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  20.   <input v-focus>
  21. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  22.   <input v-focus>
  23. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  24.   <input v-focus>
  25. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>
复制代码
5.2 动态路由匹配

动态路由匹配允许你在路由路径中使用参数。
  1. <template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>用户 1<template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>用户 2<template>
  6.   <input v-focus>
  7. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>
复制代码
5.3 嵌套路由

嵌套路由允许你在路由视图中嵌套其他路由视图。
  1. <template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>用户 1<template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>用户 2<template>
  6.   <input v-focus>
  7. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>
复制代码
5.4 路由守卫

路由守卫允许你在导航到某个路由之前执行一些逻辑。
  1. <template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>首页<template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>关于<template>
  6.   <input v-focus>
  7. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>
复制代码
5.5 路由元信息

路由元信息允许你在路由配置中添加自定义数据。
  1. <template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>首页<template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>关于<template>
  6.   <input v-focus>
  7. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>
复制代码
5.6 导航守卫

导航守卫可以在路由切换前后执行逻辑。
  1. <template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>首页<template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>关于<template>
  6.   <input v-focus>
  7. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>
复制代码
5.7 路由懒加载

路由懒加载可以按需加载路由组件,减少初始加载时间。
  1. const routes = [<template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>{<template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  6.   <input v-focus>
  7. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>path: '/home',<template>
  8.   <input v-focus>
  9. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  10.   <input v-focus>
  11. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>component: () => import('./components/Home.vue')<template>
  12.   <input v-focus>
  13. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>},<template>
  14.   <input v-focus>
  15. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>{<template>
  16.   <input v-focus>
  17. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  18.   <input v-focus>
  19. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>path: '/about',<template>
  20.   <input v-focus>
  21. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  22.   <input v-focus>
  23. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>component: () => import('./components/About.vue')<template>
  24.   <input v-focus>
  25. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>}]const router = new VueRouter({<template>
  26.   <input v-focus>
  27. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>routes})
复制代码
6. Vuex 状态管理

6.1 Vuex 基础

Vuex 是一个专为 Vue.js 应用设计的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
  1. <template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>Vuex 学习<template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  6.   <input v-focus>
  7. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  8.   <input v-focus>
  9. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  10.   <input v-focus>
  11. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  12.   <input v-focus>
  13. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>{{ count }}
  14. <template>
  15.   <input v-focus>
  16. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  17.   <input v-focus>
  18. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>增加<template>
  19.   <input v-focus>
  20. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  21.   <input v-focus>
  22. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>
复制代码
6.2 核心概念

Vuex 的核心概念包括状态(state)、变更(mutations)、动作(actions)和 getters。
  1. const store = new Vuex.Store({<template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>state: {<template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  6.   <input v-focus>
  7. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>count: 0<template>
  8.   <input v-focus>
  9. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>},<template>
  10.   <input v-focus>
  11. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>mutations: {<template>
  12.   <input v-focus>
  13. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  14.   <input v-focus>
  15. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>increment (state) {<template>
  16.   <input v-focus>
  17. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  18.   <input v-focus>
  19. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  20.   <input v-focus>
  21. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>state.count++<template>
  22.   <input v-focus>
  23. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  24.   <input v-focus>
  25. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>}<template>
  26.   <input v-focus>
  27. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>},<template>
  28.   <input v-focus>
  29. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>actions: {<template>
  30.   <input v-focus>
  31. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  32.   <input v-focus>
  33. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>incrementAsync ({ commit }) {<template>
  34.   <input v-focus>
  35. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  36.   <input v-focus>
  37. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  38.   <input v-focus>
  39. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>setTimeout(() => {<template>
  40.   <input v-focus>
  41. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  42.   <input v-focus>
  43. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  44.   <input v-focus>
  45. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  46.   <input v-focus>
  47. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>commit('increment')<template>
  48.   <input v-focus>
  49. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  50.   <input v-focus>
  51. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  52.   <input v-focus>
  53. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>}, 1000)<template>
  54.   <input v-focus>
  55. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  56.   <input v-focus>
  57. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>}<template>
  58.   <input v-focus>
  59. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>},<template>
  60.   <input v-focus>
  61. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>getters: {<template>
  62.   <input v-focus>
  63. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  64.   <input v-focus>
  65. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>doubleCount: state => state.count * 2<template>
  66.   <input v-focus>
  67. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>}})
复制代码
6.3 模块化

Vuex 允许你将状态管理逻辑拆分成模块,每个模块拥有自己的 state、mutations、actions 和 getters。
  1. const moduleA = {<template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>state: { count: 0 },<template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>mutations: { increment (state) { state.count++ } },<template>
  6.   <input v-focus>
  7. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>actions: { incrementAsync ({ commit }) { commit('increment') } },<template>
  8.   <input v-focus>
  9. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>getters: { doubleCount: state => state.count * 2 }}const moduleB = {<template>
  10.   <input v-focus>
  11. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>state: { count: 0 },<template>
  12.   <input v-focus>
  13. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>mutations: { increment (state) { state.count++ } },<template>
  14.   <input v-focus>
  15. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>actions: { incrementAsync ({ commit }) { commit('increment') } },<template>
  16.   <input v-focus>
  17. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>getters: { doubleCount: state => state.count * 2 }}const store = new Vuex.Store({<template>
  18.   <input v-focus>
  19. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>modules: {<template>
  20.   <input v-focus>
  21. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  22.   <input v-focus>
  23. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>a: moduleA,<template>
  24.   <input v-focus>
  25. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  26.   <input v-focus>
  27. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>b: moduleB<template>
  28.   <input v-focus>
  29. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>}})
复制代码
6.4 中间件

Vuex 支持插件机制,可以在状态变更时执行一些逻辑。
  1. const myPlugin = store => {<template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>store.subscribe((mutation, state) => {<template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  6.   <input v-focus>
  7. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>console.log(mutation.type)<template>
  8.   <input v-focus>
  9. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  10.   <input v-focus>
  11. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>console.log(mutation.payload)<template>
  12.   <input v-focus>
  13. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>})}const store = new Vuex.Store({<template>
  14.   <input v-focus>
  15. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>state: { count: 0 },<template>
  16.   <input v-focus>
  17. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>mutations: { increment (state) { state.count++ } },<template>
  18.   <input v-focus>
  19. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>plugins: [myPlugin]})
复制代码
6.5 辅助函数

Vuex 提供了一些辅助函数,帮助你简化代码。
  1. <template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>{{ count }}
  4. <template>
  5.   <input v-focus>
  6. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>增加
复制代码
7. 项目实战

7.1 项目初始化

使用 Vue CLI 初始化一个新的 Vue 项目。
  1. npm install -g @vue/cli
  2. vue create my-project
  3. cd my-project
  4. npm run serve
复制代码
7.2 组件设计

根据项目需求设计和实现各个组件。假设我们要构建一个简单的待办事项应用。
  1. vue create todo-app
  2. cd todo-app
  3. npm run serve
复制代码
创建 components/TodoItem.vue:
  1. <template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  6.   <input v-focus>
  7. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  8.   <input v-focus>
  9. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  10.   <input v-focus>
  11. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>{{ todo.text }}<template>
  12.   <input v-focus>
  13. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>
复制代码
创建 components/TodoList.vue:
  1. <template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>
  4. [list]<template>
  5.   <input v-focus>
  6. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  7.   <input v-focus>
  8. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  9.   <input v-focus>
  10. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>
  11. [/list]
复制代码
在 App.vue 中使用 TodoList 组件:
  1. <template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  6.   <input v-focus>
  7. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>[size=6]待办事项[/size]
  8. <template>
  9.   <input v-focus>
  10. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  11.   <input v-focus>
  12. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  13.   <input v-focus>
  14. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>
复制代码
7.3 路由配置

使用 Vue Router 配置项目的路由。
安装 Vue Router:
  1. npm install vue-router
复制代码
创建 router/index.js:
  1. import Vue from 'vue'import Router from 'vue-router'import Home from '@/components/Home.vue'import About from '@/components/About.vue'Vue.use(Router)export default new Router({<template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>routes: [<template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  6.   <input v-focus>
  7. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>{ path: '/', component: Home },<template>
  8.   <input v-focus>
  9. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  10.   <input v-focus>
  11. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>{ path: '/about', component: About }<template>
  12.   <input v-focus>
  13. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>]})
复制代码
在 main.js 中引入路由:
  1. import Vue from 'vue'import App from './App.vue'import router from './router'Vue.config.productionTip = falsenew Vue({<template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>router,<template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>render: h => h(App)}).$mount('#app')
复制代码
创建 components/Home.vue 和 components/About.vue:
Home.vue:
  1. <template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  6.   <input v-focus>
  7. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>[size=6]首页[/size]
  8. <template>
  9.   <input v-focus>
  10. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  11.   <input v-focus>
  12. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  13.   <input v-focus>
  14. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>
复制代码
About.vue:
  1. <template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  6.   <input v-focus>
  7. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>[size=6]关于[/size]
  8. <template>
  9.   <input v-focus>
  10. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  11.   <input v-focus>
  12. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>这是关于页面。
  13. <template>
  14.   <input v-focus>
  15. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>
复制代码
7.4 状态管理

使用 Vuex 管理项目的全局状态。
安装 Vuex:
  1. npm install vuex
复制代码
创建 store/index.js:
  1. import Vue from 'vue'import Vuex from 'vuex'Vue.use(Vuex)export default new Vuex.Store({<template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>state: {<template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  6.   <input v-focus>
  7. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>todos: [<template>
  8.   <input v-focus>
  9. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  10.   <input v-focus>
  11. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  12.   <input v-focus>
  13. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>{ id: 1, text: '学习 Vue', done: true },<template>
  14.   <input v-focus>
  15. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  16.   <input v-focus>
  17. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  18.   <input v-focus>
  19. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>{ id: 2, text: '学习 Vuex', done: false },<template>
  20.   <input v-focus>
  21. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  22.   <input v-focus>
  23. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  24.   <input v-focus>
  25. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>{ id: 3, text: '学习 Vue Router', done: false }<template>
  26.   <input v-focus>
  27. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  28.   <input v-focus>
  29. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>]<template>
  30.   <input v-focus>
  31. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>},<template>
  32.   <input v-focus>
  33. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>mutations: {<template>
  34.   <input v-focus>
  35. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  36.   <input v-focus>
  37. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>addTodo (state, todo) {<template>
  38.   <input v-focus>
  39. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  40.   <input v-focus>
  41. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  42.   <input v-focus>
  43. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>state.todos.push(todo)<template>
  44.   <input v-focus>
  45. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  46.   <input v-focus>
  47. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>}<template>
  48.   <input v-focus>
  49. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>},<template>
  50.   <input v-focus>
  51. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>actions: {<template>
  52.   <input v-focus>
  53. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  54.   <input v-focus>
  55. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>addTodo ({ commit }, todo) {<template>
  56.   <input v-focus>
  57. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  58.   <input v-focus>
  59. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  60.   <input v-focus>
  61. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>commit('addTodo', todo)<template>
  62.   <input v-focus>
  63. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  64.   <input v-focus>
  65. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>}<template>
  66.   <input v-focus>
  67. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>},<template>
  68.   <input v-focus>
  69. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>getters: {<template>
  70.   <input v-focus>
  71. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  72.   <input v-focus>
  73. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>doneTodos: state => {<template>
  74.   <input v-focus>
  75. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  76.   <input v-focus>
  77. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  78.   <input v-focus>
  79. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>return state.todos.filter(todo => todo.done)<template>
  80.   <input v-focus>
  81. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  82.   <input v-focus>
  83. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>}<template>
  84.   <input v-focus>
  85. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>}})
复制代码
在 main.js 中引入 Vuex:
  1. import Vue from 'vue'import App from './App.vue'import router from './router'import store from './store'Vue.config.productionTip = falsenew Vue({<template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>router,<template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>store,<template>
  6.   <input v-focus>
  7. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>render: h => h(App)}).$mount('#app')
复制代码
在 TodoList.vue 中使用 Vuex 状态:
  1. <template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>
  4. [list]<template>
  5.   <input v-focus>
  6. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  7.   <input v-focus>
  8. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  9.   <input v-focus>
  10. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>
  11. [/list]
复制代码
7.5 API 集成

假设我们有一个简单的 API 来获取和添加待办事项。
创建 api/todos.js:
  1. import axios from 'axios'const API_URL = 'http://example.com/api/todos'export default {<template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>getTodos () {<template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  6.   <input v-focus>
  7. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>return axios.get(API_URL)<template>
  8.   <input v-focus>
  9. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>},<template>
  10.   <input v-focus>
  11. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>addTodo (todo) {<template>
  12.   <input v-focus>
  13. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  14.   <input v-focus>
  15. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>return axios.post(API_URL, todo)<template>
  16.   <input v-focus>
  17. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>}}
复制代码
在 Vuex 中使用 API:
  1. import Vue from 'vue'import Vuex from 'vuex'import api from '@/api/todos'Vue.use(Vuex)export default new Vuex.Store({<template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>state: {<template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  6.   <input v-focus>
  7. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>todos: []<template>
  8.   <input v-focus>
  9. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>},<template>
  10.   <input v-focus>
  11. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>mutations: {<template>
  12.   <input v-focus>
  13. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  14.   <input v-focus>
  15. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>setTodos (state, todos) {<template>
  16.   <input v-focus>
  17. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  18.   <input v-focus>
  19. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  20.   <input v-focus>
  21. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>state.todos = todos<template>
  22.   <input v-focus>
  23. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  24.   <input v-focus>
  25. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>},<template>
  26.   <input v-focus>
  27. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  28.   <input v-focus>
  29. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>addTodo (state, todo) {<template>
  30.   <input v-focus>
  31. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  32.   <input v-focus>
  33. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  34.   <input v-focus>
  35. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>state.todos.push(todo)<template>
  36.   <input v-focus>
  37. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  38.   <input v-focus>
  39. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>}<template>
  40.   <input v-focus>
  41. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>},<template>
  42.   <input v-focus>
  43. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>actions: {<template>
  44.   <input v-focus>
  45. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  46.   <input v-focus>
  47. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>fetchTodos ({ commit }) {<template>
  48.   <input v-focus>
  49. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  50.   <input v-focus>
  51. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  52.   <input v-focus>
  53. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>api.getTodos().then(response => {<template>
  54.   <input v-focus>
  55. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  56.   <input v-focus>
  57. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  58.   <input v-focus>
  59. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  60.   <input v-focus>
  61. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>commit('setTodos', response.data)<template>
  62.   <input v-focus>
  63. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  64.   <input v-focus>
  65. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  66.   <input v-focus>
  67. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>})<template>
  68.   <input v-focus>
  69. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  70.   <input v-focus>
  71. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>},<template>
  72.   <input v-focus>
  73. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  74.   <input v-focus>
  75. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>addTodo ({ commit }, todo) {<template>
  76.   <input v-focus>
  77. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  78.   <input v-focus>
  79. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  80.   <input v-focus>
  81. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>api.addTodo(todo).then(response => {<template>
  82.   <input v-focus>
  83. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  84.   <input v-focus>
  85. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  86.   <input v-focus>
  87. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  88.   <input v-focus>
  89. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>commit('addTodo', response.data)<template>
  90.   <input v-focus>
  91. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  92.   <input v-focus>
  93. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  94.   <input v-focus>
  95. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>})<template>
  96.   <input v-focus>
  97. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  98.   <input v-focus>
  99. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>}<template>
  100.   <input v-focus>
  101. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>},<template>
  102.   <input v-focus>
  103. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>getters: {<template>
  104.   <input v-focus>
  105. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  106.   <input v-focus>
  107. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>doneTodos: state => {<template>
  108.   <input v-focus>
  109. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  110.   <input v-focus>
  111. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  112.   <input v-focus>
  113. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>return state.todos.filter(todo => todo.done)<template>
  114.   <input v-focus>
  115. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  116.   <input v-focus>
  117. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>}<template>
  118.   <input v-focus>
  119. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>}})
复制代码
在组件中触发 API 请求:
  1. <template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  6.   <input v-focus>
  7. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>
  8. [list]<template>
  9.   <input v-focus>
  10. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  11.   <input v-focus>
  12. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  13.   <input v-focus>
  14. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  15.   <input v-focus>
  16. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  17.   <input v-focus>
  18. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>
  19. [/list]<template>
  20.   <input v-focus>
  21. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  22.   <input v-focus>
  23. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  24.   <input v-focus>
  25. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  26.   <input v-focus>
  27. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>添加<template>
  28.   <input v-focus>
  29. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>
复制代码
7.6 部署与优化

将项目部署到生产环境,并进行性能优化。

  • 构建项目
  1. npm run build
复制代码

  • 部署到服务器
将 dist 目录中的内容上传到你的服务器。

  • 性能优化


  • 使用 Vue Router 的懒加载功能按需加载组件。
  • 使用 Vuex 的模块化功能减少状态管理的复杂性。
  • 使用 Webpack 的代码分割功能减少初始加载时间。
  • 使用 gzip 压缩减少传输数据量。
8. 进阶概念

8.1 自定义指令

自定义指令允许你在 DOM 元素上应用自定义行为。
  1. Vue.directive('focus', {<template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>inserted: function (el) {<template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  6.   <input v-focus>
  7. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>el.focus()<template>
  8.   <input v-focus>
  9. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>}})
复制代码
在组件中使用自定义指令:
  1. <template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>
复制代码
8.2 混入

混入提供了一种分发 Vue 组件可复用功能的非常灵活的方式。
  1. const myMixin = {<template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>created: function () {<template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  6.   <input v-focus>
  7. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>this.hello()<template>
  8.   <input v-focus>
  9. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>},<template>
  10.   <input v-focus>
  11. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>methods: {<template>
  12.   <input v-focus>
  13. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  14.   <input v-focus>
  15. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>hello: function () {<template>
  16.   <input v-focus>
  17. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  18.   <input v-focus>
  19. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  20.   <input v-focus>
  21. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>console.log('Hello from mixin!')<template>
  22.   <input v-focus>
  23. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  24.   <input v-focus>
  25. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>}<template>
  26.   <input v-focus>
  27. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>}}const Component = Vue.extend({<template>
  28.   <input v-focus>
  29. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>mixins: [myMixin]})
复制代码
8.3 插件

插件是 Vue.js 的一个核心概念,用于为 Vue 添加全局功能。
  1. const MyPlugin = {<template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>install (Vue, options) {<template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  6.   <input v-focus>
  7. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>Vue.mixin({<template>
  8.   <input v-focus>
  9. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  10.   <input v-focus>
  11. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  12.   <input v-focus>
  13. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>created: function () {<template>
  14.   <input v-focus>
  15. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  16.   <input v-focus>
  17. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  18.   <input v-focus>
  19. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  20.   <input v-focus>
  21. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>console.log('Hello from plugin!')<template>
  22.   <input v-focus>
  23. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  24.   <input v-focus>
  25. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  26.   <input v-focus>
  27. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>}<template>
  28.   <input v-focus>
  29. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  30.   <input v-focus>
  31. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>})<template>
  32.   <input v-focus>
  33. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>}}Vue.use(MyPlugin)
复制代码
8.4 服务端渲染 (SSR)

Vue.js 也支持服务端渲染(SSR),用于提升首屏加载速度和 SEO。
安装 Vue SSR 工具:
  1. npm install vue-server-renderer express
复制代码
创建 server.js:
  1. const express = require('express')const renderer = require('vue-server-renderer').createRenderer()const createApp = require('./path/to/your/app')const server = express()server.get('*', (req, res) => {<template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>const app = createApp()<template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>renderer.renderToString(app, (err, html) => {<template>
  6.   <input v-focus>
  7. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  8.   <input v-focus>
  9. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>if (err) {<template>
  10.   <input v-focus>
  11. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  12.   <input v-focus>
  13. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  14.   <input v-focus>
  15. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>res.status(500).end('Internal Server Error')<template>
  16.   <input v-focus>
  17. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  18.   <input v-focus>
  19. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  20.   <input v-focus>
  21. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>return<template>
  22.   <input v-focus>
  23. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  24.   <input v-focus>
  25. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>}<template>
  26.   <input v-focus>
  27. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  28.   <input v-focus>
  29. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>res.end(`<template>
  30.   <input v-focus>
  31. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  32.   <input v-focus>
  33. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  34.   <input v-focus>
  35. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  36.   <input v-focus>
  37. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  38.   <input v-focus>
  39. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  40.   <input v-focus>
  41. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  42.   <input v-focus>
  43. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  44.   <input v-focus>
  45. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  46.   <input v-focus>
  47. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  48.   <input v-focus>
  49. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>Hello<template>
  50.   <input v-focus>
  51. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  52.   <input v-focus>
  53. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  54.   <input v-focus>
  55. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  56.   <input v-focus>
  57. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>${html}<template>
  58.   <input v-focus>
  59. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  60.   <input v-focus>
  61. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  62.   <input v-focus>
  63. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  64.   <input v-focus>
  65. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  66.   <input v-focus>
  67. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>`)<template>
  68.   <input v-focus>
  69. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>})})server.listen(8080)
复制代码
8.5 Vue 3 新特性

Vue 3 引入了一些新的特性和改进,包括组合式 API、性能优化、TypeScript 支持等。
组合式 API

组合式 API 提供了一种更灵活的方式来组织组件逻辑。
  1. <template>
  2.   <input v-focus>
  3. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  4.   <input v-focus>
  5. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  6.   <input v-focus>
  7. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>{{ count }}
  8. <template>
  9.   <input v-focus>
  10. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component><template>
  11.   <input v-focus>
  12. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>增加<template>
  13.   <input v-focus>
  14. </template><child-component v-bind:message="parentMessage"></child-component><my-component></my-component>
复制代码
9. 总结与展望

通过本书的学习,你应该已经掌握了 Vue.js 的基础知识和一些高级特性。希望你能将这些知识应用到实际项目中,不断实践和探索,成为一名优秀的 Vue.js 开发者。未来,Vue.js 生态系统还会不断发展,期待你能持续关注和学习。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

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