前言
Vue.js 是前端领域最适合新手入门的框架之一!它以简单易学、渐进式集成、数据驱动视图为核心特点,不用一次性掌握所有知识点,就能快速开发小型项目。本文专为零基础 / 入门级开发者整理,用通俗的语言、完整的代码示例,覆盖 Vue 开发必备核心技能,帮你少走弯路,快速上手。
一、Vue.js 简介与环境搭建(新手必看)
1. 核心定位(一句话理解)
Vue 是专注于「页面视图」的 JavaScript 框架 —— 简单说,它能帮你更轻松地把数据渲染到页面,还能实现数据和页面的自动同步,不用手动操作 DOM(比如 jQuery 那种频繁修改页面元素的写法)。
2. 三种环境搭建(新手推荐前两种)
搭建方式 | 适用场景 | 操作难度 | 核心步骤(复制即用) |
直接引入(CDN) | 快速体验、写小 demo | 🌟 最简单 | 1. 新建 HTML 文件2. 复制下面代码到 ` 中:html<br>2 开发版(有错误提示,适合学习) --><br>="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><br>3. 直接在 HTML 中写 Vue 代码 |
Vite(推荐) | 正式项目、想体验极速开发 | 🌟 较简单 | 1. 先安装 Node.js(官网下载:https://nodejs.org/,选 LTS 版本,安装时一路下一步)2. 打开命令行(Win:cmd,Mac:终端),执行:bashmy-vue-project 是项目名,可自定义)npm create vite@latest my-vue-project -- --template vue 进入项目文件夹 cd my-vue-project># 安装依赖 npm install 项目(启动后会显示访问地址,如 http://127.0.0.1:5173/)>npm run dev``` |
Vue CLI | 中大型老项目 | 🌟 稍复杂 | 需额外配置,新手先跳过,后续进阶再学 |
🔔 新手提示:先用电线引入(CDN)写 2-3 个小 demo,熟悉基础语法后,再用 Vite 建正式项目!
二、Vue 核心基础语法(入门重点)
1. 第一个 Vue 实例(复制就能运行)
新建 index.html 文件,完整代码如下:
<html lang="zh-CN">
8">
引入 Vue -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<body>
挂载点:Vue 会管理这个 div 内部的所有内容 -->
:渲染 data 中的数据 -->
>{{ message }}
// 创建 Vue 实例(核心对象)
new Vue({
el: '#app', // 挂载到 id 为 app 的 div(必须和上面的 id 对应)
data: { // 存储响应式数据(数据变了,页面会自动变)
message: 'Hello Vue!我是新手'
}
})
</body>
</html>
- 打开文件就能看到页面显示 Hello Vue!我是新手,修改 data 中的 message,页面会实时更新。
- Vue 3 简化写法(了解即可):
// 需引入 Vue 3 的 CDN:://unpkg.com/vue@3/dist/vue.global.js"> import { createApp } from 'vue'
createApp({
data() {
return { message: 'Hello Vue 3!' } // Vue 3 中 data 必须是函数
}
}).mount('#app') // 直接挂载
2. 模板语法(页面渲染核心)
(1)插值表达式 {{ }}
- 作用:把 data 中的数据渲染到页面,支持简单运算和判断。
- 示例:
<div id="app">
数据:{{ name }}</p>
简单运算:{{ 1 + 2 }} → 输出 3
判断:{{ age >= 18 ? '成年' : '未成年' }}</p>
new Vue({
el: '#app',
data: {
name: '小明',
age: 20
}
})
(2)常用指令(v - 开头,新手必记 5 个)
指令是 Vue 提供的特殊属性,用来操作页面元素,新手先掌握这 5 个核心指令:
指令 | 作用(通俗解释) | 完整示例代码 |
v-text | 渲染文本(和 {{}} 一样,无闪烁) | ```html> ="message"> 等价于 {{message}} -->new Vue ({el: '#app', data: { message: ' 用 v-text 渲染 '} })> |
v-bind(缩写 :) | 绑定标签属性(比如图片地址、样式) | ```htmlapp"> 绑定图片地址 --> src="imgUrl" width="200">> (class) -->> ="isActive ? 'red' : 'blue'"> 动态样式>> el: '#app', data: {> imgUrl: 'https://vuejs.org/images/logo.png', // Vue 官网 logoActive: true }}) color: red; } .blue { color: blue; } |
v-on(缩写 @) | 绑定事件(比如点击、输入) | html<br><div id="app">> 次数:{{ count }}</p><br> 点击事件:点击按钮,count 加 1 --><br> @click="count += 1">点我加 1</button> ><br> @click="sayHello">点我说话</button><br></div><br><script>({: '#app',> data: { count: 0 },> methods: { // 存储方法(事件触发时执行) sayHello() {<br> alert('Hello Vue!') } }<br>})<br></script> |
v-if / v-show | 条件渲染(控制元素显示 / 隐藏) | ```html> -if="isShow">v-if 控制(隐藏时元素被删除) v-show 控制(隐藏时元素还在,只是看不见)> ="isShow = !isShow"> 切换显示 >> Vue({ el: '#app', data: { isShow: true } })> |
v-for | 列表渲染(循环显示数据) | ```html"> 3 > 我的爱好 3> 循环数组:item 是每个元素,index 是索引 --> (item, index) in hobbies" :key="index"> + 1 }}. {{ item }} >>new Vue ({> el: '#app',: { hobbies: [' 看电影 ', ' 打游戏 ', ' 学 Vue'] // 数组数据 }>})>> 🔔 新手提示: |
- v-if 和 v-show 区别:频繁切换显示用 v-show(性能好),偶尔切换用 v-if(节省内存)。
- v-for 必须加 :key,新手先用 index 即可,后续学完组件再用数据的唯一 ID。
3. 双向绑定 v-model(表单专用)
作用:实现「表单输入」和「数据」的双向同步 —— 输入框输入内容,数据自动变;数据变了,输入框内容也自动变。
- 示例(登录表单):
<div id="app">
表单 username -->
type="text" v-model="username" placeholder="请输入用户名"><br>>
框绑定 password -->
v-model="password" placeholder="请输入密码">><br>
复选框绑定 isAgree -->
type="checkbox" v-model="isAgree"> 同意协议<br>
,打印输入的内容 -->
="login" :disabled="!isAgree">登录</button>
显示输入的内容 -->
输入的用户名:{{ username }}</p>
</div>
>
new Vue({
el: '#app',
data: {
username: '', // 初始为空
password: '',
isAgree: false // 复选框默认未选中
},
methods: {
login() {
alert(`用户名:${this.username},密码:${this.password}`)
}
}
})
>
- 常用修饰符(新手必备):
首尾空格 -->
<input type="text" v-model.trim="username">
数字 -->
type="number" v-model.number="age">
同步数据(输入时不实时同步) -->
v-model.lazy="info">
三、计算属性与侦听器(简化逻辑)
1. 计算属性 computed(计算数据)
作用:基于已有数据,计算出新的数据,且会缓存结果(不用重复计算,性能好)。
- 示例(拼接姓名):
姓:<input v-model="firstName">名:="lastName">
计算属性,不用加括号 -->
全名:{{ fullName }}
</div>
<script>
new Vue({
el: '#app',
data: { firstName: '', lastName: '' },
computed: { // 计算属性(依赖 data 中的数据)
fullName() {
// 当 firstName 或 lastName 变化时,自动重新计算
return this.firstName + this.lastName
}
}
})
- 新手对比:计算属性 vs 方法 —— 计算属性会缓存,方法每次调用都重新计算,优先用计算属性。
2. 侦听器 watch(监听数据变化)
作用:监听某个数据的变化,然后执行自定义逻辑(比如发送请求、弹提示)。
- 示例(监听用户名变化):
id="app">
用户名:-model="username">
</div>
<script>
new Vue({
el: '#app',
data: { username: '' },
watch: { // 侦听器(监听 username 变化)
username(newVal, oldVal) {
// newVal:变化后的值,oldVal:变化前的值
console.log(`用户名从 ${oldVal} 变成了 ${newVal}`)
// 实际开发中:可在这里判断用户名是否已存在(调用接口)
}
}
})
</script>
四、组件基础(拆分页面)
1. 什么是组件?
组件是 Vue 中复用页面片段的方式 —— 把页面拆成一个个独立的「小模块」(比如头部、列表项、按钮),每个模块有自己的 HTML、CSS、JS,方便复用和维护。
2. 新手入门:全局组件(简单易用)
- 示例(自定义一个按钮组件):
">
组件(像用普通标签一样) -->
<my-button>
<my-button></my-button>
</div>
>
// 1. 定义全局组件(可在任意地方使用)
Vue.component('my-button', {
template: ` HTML 结构 -->
+= 1" class="my-btn">
点击了 {{ count }} 次
`,
data() {
// 组件中的 data 必须是函数(避免多个组件共用数据)
return { count: 0 }
},
styles: `/* 组件的样式 */
.my-btn { color: white; background: blue; padding: 5px 10px; }`
})
// 2. 创建 Vue 实例
new Vue({ el: '#app' })
- 新手提示:组件名建议用「短横线命名法」(比如 my-button),避免和 HTML 原生标签冲突。
3. 组件通信(父传子、子传父)
组件之间需要传递数据,新手先掌握最常用的两种:
(1)父传子(props)
- 父组件:通过属性传递数据给子组件。
- 子组件:通过 props 接收父组件的数据。
- 示例:
id="app">
title 和 count 给子组件 -->
-child :title="parentTitle" :count="parentCount"> </div>
<script>
// 子组件
Vue.component('my-child', {
props: ['title', 'count'], // 接收父组件传递的属性
template: `
<div>
<h3>{{ title }}3>
<p>父组件传递的数量:{{ count }}
`
})
// 父组件
new Vue({
el: '#app',
data: {
parentTitle: '我是父组件传递的标题',
parentCount: 100
}
})
</script>
(2)子传父($emit)
- 子组件:通过 this.$emit('事件名', 数据) 触发事件,传递数据。
- 父组件:监听子组件的事件,接收数据。
- 示例:
="app">
<p>父组件的数值:{{ parentNum }}</p>
组件:监听子组件的 send-num 事件 -->
-num="getSonNum"></my-child>
</div>
>
// 子组件
Vue.component('my-child', {
template: `
<button @click="sendData">向父组件传值</button>
`,
methods: {
sendData() {
const sonNum = 200 // 子组件的数据
// 触发 send-num 事件,传递 sonNum
this.$emit('send-num', sonNum)
}
}
})
// 父组件
new Vue({
el: '#app',
data: { parentNum: 0 },
methods: {
// 接收子组件传递的数据
getSonNum(data) {
this.parentNum = data // data 就是子组件传递的 sonNum
}
}
})
五、生命周期钩子(了解即可)
1. 什么是生命周期?
Vue 实例从「创建」到「销毁」的整个过程,会自动触发一些函数,这些函数就是生命周期钩子,我们可以在这些阶段执行自定义逻辑。
2. 新手必备的 2 个钩子
钩子函数 | 触发时机 | 常用场景 |
mounted | 组件挂载完成(DOM 已生成) | 初始化 DOM 操作(比如获取元素)、发送网络请求 |
beforeDestroy | 组件即将销毁 | 清除定时器、解绑事件(避免内存泄漏) |
- 示例(mounted 发送请求):
new Vue({
el: '#app',
data: { list: [] },
mounted() {
// 组件挂载完成后,发送请求获取数据(实际开发用 axios)
console.log('组件已挂载,开始请求数据')
// 模拟请求:
setTimeout(() => {
this.list = ['数据1', '数据2', '数据3']
}, 1000)
}
})
六、新手避坑指南(必看)
- 数据响应式问题:直接给对象添加新属性,页面不会更新!
- 错误:this.user.age = 20(user 原本没有 age 属性)
- 正确:this.$set(this.user, 'age', 20)(用 Vue 提供的 $set 方法)
- v-for 和 v-if 不能一起用:v-for 优先级比 v-if 高,会导致性能问题。
- 解决:先用计算属性过滤数据,再用 v-for 循环。
- 样式污染:多个组件的样式会相互影响。
- 解决:在组件的 style 标签加 scoped 属性( scoped>),样式只作用于当前组件。
- 忘记清除定时器:组件销毁后,定时器还在运行,导致内存泄漏。
- 解决:在 beforeDestroy 中清除:
mounted() {
this.timer = setInterval(() => { console.log('运行中') }, 1000)
},
beforeDestroy() {
clearInterval(this.timer) // 清除定时器
}
七、新手学习路线(建议)
- 基础阶段:用 CDN 写 5-10 个小 demo(覆盖本文所有知识点);
- 工具阶段:学习 Vite 项目结构,掌握 npm 基本命令(安装依赖、启动项目);
- 进阶阶段:学习 Vue Router(路由跳转)、Pinia(状态管理)、Element Plus(UI 组件库);
- 实战阶段:做一个小项目(比如 TodoList、个人博客),巩固所有知识点。
推荐学习资源
- 官方文档(最权威):Vue 2 中文文档 https://v2.vuejs.org/,Vue 3 中文文档 https://vuejs.org/;
- 视频教程:B 站「尚硅谷 Vue 入门到精通」(免费,适合新手);
- 实战练习:GitHub 搜索「vue-todolist」,参考别人的代码自己写一遍。
总结
Vue 入门的核心是掌握「数据驱动视图」的思想 —— 不用关心 DOM 操作,专注于数据和逻辑即可。本文覆盖的基础语法、组件、双向绑定等知识点,足以应对中小型项目开发。新手学习时,一定要多写代码、多踩坑,遇到问题先看官方文档,再查资料,坚持 1-2 周就能熟练上手!
如果本文对你有帮助,欢迎点赞、收藏,后续会更新 Vue 进阶知识点(路由、状态管理、实战项目),关注不迷路~