目录

引言

一、Vue.js 核心概念

1.1 MVVM 架构模式

1.2 响应式原理

二、Vue 基础篇

2.1 模板语法

2.2 计算属性与侦听器

三、Vue 核心篇

3.1 组件系统

组件通信方式

组件生命周期

3.2 指令系统

内置指令

自定义指令

四、Vue 进阶篇

4.1 Composition API(Vue 3)

4.2 路由管理(Vue Router)

4.3 状态管理(Pinia - Vue 3 推荐)

五、Vue 工程实践

5.1 性能优化

5.2 代码规范

5.3 测试策略

六、Vue 生态与工具链

6.1 开发工具

6.2 UI 组件库

6.3 常用插件

七、最佳实践总结

结语


引言

Vue.js是由尤雨溪(Evan You)于2014年2月发布的渐进式JavaScript框架,基于标准HTML、CSS和JavaScript构建,采用MIT开源协议并由社区驱动维护。该框架核心库专注视图层开发,通过声明式、组件化的编程模型提升用户界面构建效率,具备约20KB轻量核心并采用虚拟DOM技术优化性能。作为一款渐进式 JavaScript 框架,以其简洁的语法、灵活的组件系统和优秀的性能,已成为前端开发领域的主流选择之一。本文将系统性地总结 Vue.js 的核心知识点,帮助开发者构建完整知识体系。

一、Vue.js 核心概念

1.1 MVVM 架构模式

Vue.js 采用 MVVM(Model-View-ViewModel)模式,实现了数据与视图的双向绑定:

  • Model:数据层,通常为 JavaScript 对象

  • View:视图层,即 DOM 结构

  • ViewModel:Vue 实例,连接 Model 和 View 的桥梁

1.2 响应式原理

Vue 2.x 使用 Object.defineProperty 实现响应式,Vue 3.x 升级为 Proxy

// Vue 3 响应式原理示例
const reactiveData = new Proxy(data, {
  get(target, key) {
    track(target, key); // 依赖收集
    return target[key];
  },
  set(target, key, value) {
    target[key] = value;
    trigger(target, key); // 触发更新
    return true;
  }
});

二、Vue 基础篇

2.1 模板语法

<template>
  <!-- 插值表达式 -->
  <p>{{ message }}</p>
  
  <!-- 指令 -->
  <div v-if="show">条件渲染</div>
  <ul>
    <li v-for="item in list" :key="item.id">{{ item.name }}</li>
  </ul>
  
  <!-- 事件处理 -->
  <button @click="handleClick">点击</button>
  
  <!-- 双向绑定 -->
  <input v-model="inputValue" />
</template>

2.2 计算属性与侦听器

export default {
  data() {
    return {
      firstName: '张',
      lastName: '三',
      price: 100,
      quantity: 2
    }
  },
  computed: {
    // 计算属性(缓存)
    fullName() {
      return this.firstName + this.lastName;
    },
    totalPrice() {
      return this.price * this.quantity;
    }
  },
  watch: {
    // 侦听器
    quantity(newVal, oldVal) {
      console.log(`数量从 ${oldVal} 变为 ${newVal}`);
    }
  }
}

三、Vue 核心篇

3.1 组件系统

组件通信方式
  1. Props / $emit:父子组件通信

  2. Provide / Inject:祖先后代组件通信

  3. Event Bus:跨组件通信(Vue 3 推荐使用 mitt 库)

  4. Vuex / Pinia:状态管理

  5. ref / $parent / $children:直接访问(不推荐)

组件生命周期
export default {
  beforeCreate() {
    // 初始化之前
  },
  created() {
    // 实例创建完成,可访问数据
  },
  beforeMount() {
    // 挂载之前
  },
  mounted() {
    // 挂载完成,可访问 DOM
  },
  beforeUpdate() {
    // 数据更新,DOM 未更新
  },
  updated() {
    // DOM 更新完成
  },
  beforeUnmount() { // Vue 3
  // beforeDestroy() { // Vue 2
    // 实例销毁前
  },
  unmounted() { // Vue 3
  // destroyed() { // Vue 2
    // 实例销毁后
  }
}

3.2 指令系统

内置指令
  • v-bind / ::属性绑定

  • v-on / @:事件绑定

  • v-model:双向绑定

  • v-if / v-else-if / v-else:条件渲染

  • v-for:列表渲染

  • v-show:显示/隐藏

  • v-text / v-html:文本/HTML 渲染

  • v-pre / v-cloak / v-once:特殊功能

自定义指令
// 全局注册
app.directive('focus', {
  mounted(el) {
    el.focus();
  }
});

// 局部注册
export default {
  directives: {
    focus: {
      mounted(el) {
        el.focus();
      }
    }
  }
}

四、Vue 进阶篇

4.1 Composition API(Vue 3)

<script setup>
import { ref, computed, watch, onMounted } from 'vue';

// 响应式数据
const count = ref(0);
const user = reactive({ name: '张三', age: 25 });

// 计算属性
const doubleCount = computed(() => count.value * 2);

// 侦听器
watch(count, (newVal, oldVal) => {
  console.log(`count变化: ${oldVal} -> ${newVal}`);
});

// 生命周期
onMounted(() => {
  console.log('组件已挂载');
});

// 自定义组合函数
function useCounter() {
  const count = ref(0);
  const increment = () => count.value++;
  return { count, increment };
}
</script>

4.2 路由管理(Vue Router)

// 路由配置
const routes = [
  {
    path: '/',
    component: Home,
    meta: { requiresAuth: true }
  },
  {
    path: '/user/:id',
    component: User,
    props: true,
    children: [
      { path: 'profile', component: Profile }
    ]
  }
];

// 路由守卫
router.beforeEach((to, from, next) => {
  if (to.meta.requiresAuth && !isAuthenticated) {
    next('/login');
  } else {
    next();
  }
});

4.3 状态管理(Pinia - Vue 3 推荐)

// store/user.js
import { defineStore } from 'pinia';

export const useUserStore = defineStore('user', {
  state: () => ({
    userInfo: null,
    token: ''
  }),
  getters: {
    isLogin: (state) => !!state.token
  },
  actions: {
    async login(credentials) {
      const res = await api.login(credentials);
      this.token = res.token;
      this.userInfo = res.userInfo;
    },
    logout() {
      this.token = '';
      this.userInfo = null;
    }
  },
  persist: true // 数据持久化
});

五、Vue 工程实践

5.1 性能优化

  1. 组件懒加载

    const Home = () => import('./views/Home.vue');
  2. Keep-alive 缓存

    <keep-alive :include="['Home', 'About']">
      <router-view></router-view>
    </keep-alive>
  3. 虚拟滚动

    <VirtualList :size="50" :remain="8" :data="listData">
      <template v-slot="{ item }">
        <div class="item">{{ item.content }}</div>
      </template>
    </VirtualList>
  4. 虚拟滚动

    <img v-lazy="imgUrl" alt="图片">

5.2 代码规范

  1. 组件命名规范:PascalCase(如 UserProfile.vue

  2. 目录结构规范

    src/
    ├── components/     # 公共组件
    ├── views/         # 页面组件
    ├── router/        # 路由配置
    ├── store/         # 状态管理
    ├── api/           # 接口封装
    ├── utils/         # 工具函数
    └── assets/        # 静态资源
  3. Vue 3 的 <script setup> 语法

<script setup>
// 更简洁的 Composition API 写法
</script>

5.3 测试策略

// 单元测试示例(使用 Vitest + Vue Test Utils)
import { mount } from '@vue/test-utils';
import Counter from './Counter.vue';

describe('Counter.vue', () => {
  it('点击按钮增加计数', async () => {
    const wrapper = mount(Counter);
    await wrapper.find('button').trigger('click');
    expect(wrapper.find('.count').text()).toBe('1');
  });
});

六、Vue 生态与工具链

6.1 开发工具

  • Vue Devtools:浏览器调试插件

  • Vite:下一代前端构建工具

  • Vue CLI:项目脚手架(Vue 2 推荐)

6.2 UI 组件库

  • Element Plus:桌面端组件库

  • Vant:移动端组件库

  • Ant Design Vue:企业级组件库

  • Naive UI:TypeScript 友好的组件库

6.3 常用插件

  • axios:HTTP 客户端

  • dayjs:日期处理

  • lodash-es:实用工具库

  • vue-i18n:国际化

七、最佳实践总结

  1. 组件设计原则

    • 单一职责原则

    • 合理划分容器组件与展示组件

    • 使用插槽提高组件灵活性

  2. 状态管理原则

    • 按模块划分 Store

    • 避免过度使用全局状态

    • 优先使用组件本地状态

  3. 性能优化要点

    • 合理使用 v-if 和 v-show

    • 列表渲染添加 key

    • 避免不必要的响应式数据

    • 合理使用计算属性缓存

  4. TypeScript 集成

    <script setup lang="ts">
    // 充分利用 TypeScript 的类型检查
    interface User {
      id: number;
      name: string;
      email: string;
    }
    
    const user = ref<User | null>(null);
    </script>

结语

Vue.js 以其渐进式的设计理念和友好的学习曲线,为前端开发提供了高效、灵活的解决方案。无论是小型项目还是大型企业应用,Vue 都能提供合适的工具和模式。掌握以上知识点,并结合实际项目实践,将能够构建出高质量、可维护的 Vue 应用程序。

随着 Vue 3 生态的日益成熟,Composition API、Vite、Pinia 等新技术栈正在成为主流,建议开发者持续学习并跟上技术发展的步伐。


相关资源推荐

希望这篇总结能帮助你在 Vue.js 的学习和开发道路上更加顺利!如果有任何问题或补充,欢迎在评论区交流讨论。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐