从零开始搭建 Vue 2 项目:完整教程与核心概念详解
手动构建一个 Vue 2 项目看似复杂,但实际上只需几条命令即可快速启动。下面我们从环境配置入手,逐步搭建完整项目结构,并深入解析 Options API、Vue Router 等关键知识点,帮助你快速掌握 Vue 2 开发流程。
一、前置准备与环境检查
| 工具名称 | 主要用途 |
|---|---|
| Node.js | 提供 npm 运行环境、支持构建工具 |
| npm | 安装依赖包、执行脚本命令 |
| Vue CLI | 一键生成 Vue 2 项目脚手架 |
如何确认环境已就绪?打开终端,输入以下两条命令进行验证:
node -v
npm -v
若出现类似下图的版本号输出,则表明 Node 和 npm 已正确安装。

随后全局安装 Vue CLI(仅需执行一次):
npm install -g @vue/cli
vue --version

二、使用脚手架创建 Vue 2 项目
1. 创建项目
进入你想要存放项目的目录,打开终端并执行:
vue create 项目名
# 示例:vue create vue2_demo
创建成功后,当前目录下会生成一个以项目名命名的文件夹(如 vue2_demo)。
2. 进入项目并启动开发服务器
在 VS Code 中打开该文件夹,然后在终端依次运行:
cd vue2_demo
npm install # 若创建时已自动安装可跳过
npm run serve # 启动开发模式,支持热更新
3. 三个常用命令说明
| 命令 | 作用 |
|---|---|
npm run serve | 开发环境 + 热重载 |
npm run build | 生产打包输出到 dist/ |
npm run lint | 代码规范检查 |
三、脚手架生成的项目目录结构
让我们来看看脚手架自动生成的目录结构:
vue2_demo/
├── public/
│ └── index.html # 唯一 HTML 文件,挂载点 #app
├── src/
│ ├── main.js # 入口文件:创建 Vue 实例
│ ├── App.vue # 根组件
│ ├── assets/ # 静态资源(图片、字体等,可选)
│ ├── components/ # 可复用的通用组件
│ ├── views/ # 页面级组件(通常对应路由)
│ ├── router/ # 路由配置文件
│ └── utils/ # 工具函数集合
├── babel.config.js # ES6+ 转 ES5 配置
├── vue.config.js # CLI / Webpack 配置项
├── jsconfig.json # @ 别名配置,编辑器智能提示
├── package.json
└── .gitignore
四、最小可运行应用(核心 3 个文件)
1. public/index.html
- 页面中仅包含一个
容器 - Vue 会将整个组件树渲染到这个节点中
2. src/main.js — 应用入口
import Vue from 'vue'
import App from './App.vue'new Vue({
render: h => h(App),
}).$mount('#app')
| 概念 | 含义 |
|---|---|
new Vue({...}) | Vue 2 中创建应用实例的方式 |
render: h => h(App) | 使用渲染函数挂载根组件 |
$mount('#app') | 挂载到 index.html 中的 #app 元素 |
3. src/App.vue — 根组件(单文件组件 SFC)
<div id="app">
div>
<script>
export default {
name: 'App'
}
script><style>
/* 未加 scoped 时样式会全局生效 */
style>
单文件组件(SFC)由三部分构成: 定义视图结构、 处理逻辑、 控制样式。
五、单文件组件基础(Options API)
Options API 是 Vue 2 中最经典的写法:在组件的 export default { ... } 中,通过固定选项名(如 data、methods、computed 等)来组织业务逻辑。
整体结构一览
export default {
name: 'HomePage', // 组件名称(用于调试、keep-alive 等)
components: { }, // 注册子组件
props: { }, // 接收父组件传递的数据
data() { return { } }, // 组件内部状态(必须为函数)
computed: { }, // 计算属性(基于依赖缓存)
watch: { }, // 监听数据变化并执行回调
methods: { }, // 事件处理与业务方法 // 生命周期钩子
beforeCreate() { },
created() { },
beforeMount() { },
mounted() { },
beforeUpdate() { },
updated() { },
beforeDestroy() { },
destroyed() { },
}
在模板中通过 {{ }}、v-on、v-model 绑定的一切,都来源于这些选项中的数据与方法。
各选项详细说明
data — 组件自身的响应式状态
必须定义为函数并返回一个对象(确保每个组件实例拥有独立的数据副本):
data() {
return {
title: '这是首页',
count: 0,
todos: []
}
}
模板中可直接使用 {{ title }} 或通过 v-model="title" 进行双向绑定。
methods — 方法(每次调用都执行,无缓存)
用于处理点击事件、表单提交等交互逻辑:
methods: {
add() {
this.count++
}
}
模板中通过 @click="add" 绑定。
在 Options API 中,methods、data、computed 内部都可以通过 this 访问同一组件上的其他属性。
computed — 计算属性(基于依赖缓存)
当依赖的数据未发生变化时,不会重新计算,适合用于「展示经过处理的派生值」:
computed: {
double() {
return this.count * 2
}
}
与 methods 的区别:
computed:像属性一样使用{{ double }},具有缓存机制methods:每次调用都会执行,如{{ calc() }}
watch — 监听数据变化以执行异步或复杂操作
适用于需要调用接口、处理异步逻辑或执行复杂副作用的情况:
watch: {
count(newVal, oldVal) {
console.log(newVal, oldVal)
}
}
简单数据派生优先使用 computed,避免滥用 watch。
props — 父组件向子组件传递数据(单向、只读)
父组件使用:
子组件定义:
props: {
msg: {
type: String,
default: ''
}
}
子组件不应直接修改 props,而应通过 $emit 触发事件通知父组件进行更新。
components — 局部注册子组件
在 App.vue 中的典型用法:
import HomePage from '@/views/homePage.vue'
export default {
name: 'App',
components: {
HomePage
}
}
模板中直接使用 即可。
生命周期钩子(Vue 2 常用 4 个)
| 钩子名称 | 触发时机 | 常见应用场景 |
|---|---|---|
created | 实例创建完成,DOM 尚未生成 | 调用接口、初始化数据 |
mounted | 组件挂载到 #app 之后 | 操作 DOM、初始化第三方库 |
beforeDestroy | 实例销毁之前 | 清除定时器、解绑事件监听 |
destroyed | 实例销毁之后 | 收尾清理工作 |
常用模板语法速查
- 文本插值:
{{ msg }} - 动态属性绑定:
:src="url" - 事件绑定:
@click="fn" - 条件渲染:
v-if/v-else - 列表渲染:
v-for="item in list" :key="item.id" - 双向数据绑定:
v-model="text"
六、Vue Router 路由配置
Vue Router 是 Vue 官方的前端路由库:根据 URL 的变化动态切换页面组件,无需刷新页面即可实现单页应用(SPA)。脚手架生成的项目只有一个默认首页,若需添加页面跳转功能,可按以下步骤配置。
1. 安装 Vue Router 3.x
npm install vue-router@3
2. 新建路由配置文件 src/router/index.js
import Vue from 'vue'
import VueRouter from 'vue-router'//
import HomePage from '@/views/homePage.vue'
import LoginPage from '@/views/loginPage.vue'//
Vue.use(VueRouter)// 配置路由与组件的映射关系
const routes = [
{ path: '/login', component: LoginPage },
{ path: '/', component: HomePage },
{ path: '*', redirect: '/404' } // 未匹配路由(可选配置)
]// 创建路由实例
const router = new VueRouter({
mode: 'hash', // 也可用 'history'(需要服务端配合)
routes
})export default router
3. 在 main.js 中挂载路由
向 Vue 实例注册路由:
import router from './router'new Vue({
router,
render: h => h(App),
}).$mount('#app')
4. 修改 App.vue — 添加路由出口
<template>
<div id="app">
<router-view>router-view>
div>
template>
实现原理:URL 变化 → 匹配 routes 中的路径 → 在 位置渲染对应的页面组件。
5. 页面跳转方式
<router-link to="/">首页router-link>
this.$router.push('/login')
6. 路由守卫(实现登录鉴权)
router.beforeEach((to, from, next) => {
if (to.path !== '/login' && !isAuthenticated()) {
next('/login')
} else {
next()
}
})
至此,一个最基础的 Vue 2 项目骨架已搭建完成。环境、目录结构、核心组件和路由均已就绪,接下来便可以在该骨架基础上填充具体的业务逻辑了。
