跳到主要内容
Vue 基础入门教程(一) | 极客日志
JavaScript 大前端
Vue 基础入门教程(一) 综述由AI生成 Vue 是一套渐进式 JavaScript 框架,用于动态构建用户界面。内容涵盖 Vue 核心概念、HelloWorld 示例、v-bind 与 v-model 指令、el 与 data 配置方式、Object.defineProperty 原理、事件处理及修饰符、计算属性等。通过代码示例演示了数据绑定、事件监听和计算属性的实现方法,帮助开发者快速掌握 Vue 基础语法与工作原理。
MqEngine 发布于 2025/1/19 更新于 2026/6/3 20 浏览1,Vue 介绍
1.1,介绍
Vue 是一套用来动态构建用户界面的渐进式 JavaScript 框架。
构建用户界面:把数据通过某种办法变成用户界面
渐进式:Vue 可以自底向上逐层的应用,简单应用只需要一个轻量小巧的核心库,复杂应用可以引入各式各样的 Vue 插件
1.2,特点
采用组件化模式,提高代码复用率、且让代码更好维护
使用虚拟 DOM 和 Diff 算法,尽量复用 DOM 节点。如果数据修改,不需要重新拼串,在虚拟 DOM 层会通过 Diff 算法比较与原数据的差异,从而复用原数据
声明式编码,让编码人员无需直接操作 DOM,提高开发效率,不需要像命令式编码一样将每一步操作都通过代码编写
2,HelloWorld
首先需要引入 Vue,通过本地文件引入,或通过网络引入:https://cdn.jsdelivr.net/npm/[email protected] /dist/vue.js
想要让 Vue 工作,就需要创建一个 Vue 实例,给这个实例传入一些数据,比如 data(定义数据)、methods(定义方法)等,并将这个实例绑定给页面的 div 标签(称为容器)
在容器的标签中通过 {{}} (插值表达式)编写 JS 表达式可以直接获取 data 中的数据,一旦 data 中的数据发生改变,那么页面中用到该数据的地方也会自动更新
2.1 代码示例:
<!DOCTYPE html >
<html >
<head >
<meta charset ="UTF-8" />
<title > 初识 Vue</title >
<script type ="text/javascript" src ="./js/vue-2.5.17.js" > </script >
</head >
<body >
<div id ="root" >
<h1 > Hello,{{name}},{{address}}
</h1 >
</div >
<script type ="text/javascript" >
new Vue ({
el :'#root' ,
data :{
name :'周杰伦' ,
address :'台北'
}
})
</script >
</body >
</html >
容器中的代码依然符合 HTML 规范,只不过可以写一些 Vue 的语法
容器和 Vue 实例是一一对应的,可以有多个容器和 Vue 实例一一对应(但是一般只写一个容器和一个 Vue 实例,其余内容配合组件一起使用)
3,v-bind 指令
3.1,基本语法: v-bind:属性名 = "JS 表达式",表示将 JS 表达式的值赋值给此属性(单向绑定)
3.2,简写:
3.3,代码示例: <!DOCTYPE html >
<html lang ="en" >
<head >
<meta charset ="UTF-8" >
<title > v-bind</title >
<script type ="text/javascript" src ="./js/vue-2.5.17.js" > </script >
</head >
<body >
<div id ="root" >
<h3 > 你好,{{name}}</h3 >
<a v-bind:href ="school.url.toUpperCase()" > 点我去{{school.name}}学习</a >
<a :href ="school.url" > 点我去学习</a >
</div >
<script type ="text/javascript" >
Vue .config .productionTip = false
new Vue ({
el :'#root' ,
data :{
name :'Jack' ,
school :{
name :'霍格沃茨' ,
url :'http://www.baidu.com' ,
}
}
})
</script >
</body >
</html >
如果 data 中的属性值发生变化,单向绑定的数据也会自动的随之变化
插值表达式一般写在标签体中,单向绑定一般用于给标签的属性绑定值
4,v-model 指令
4.1,基本语法: v-model:value = "JS 表达式",表示双向绑定,也就是 data 中的值被修改,页面的值也会被修改;页面的值被修改,对应的 data 属性值也会随之修改
4.2,简写: v-model = "JS 表达式",即双向绑定默认操作的属性就是 value
4.3,代码示例: <!DOCTYPE html >
<html lang ="en" >
<head >
<meta charset ="UTF-8" >
<title > v-model</title >
<script type ="text/javascript" src ="./js/vue-2.5.17.js" > </script >
</head >
<body >
<div id ="root" >
双向数据绑定:<input type ="text" v-model:value ="name" > <br />
双向数据绑定:<input type ="text" v-model ="name" > <br />
<div > data 属性的值:{{name}}</div >
</div >
</body >
<script type ="text/javascript" >
new Vue ({
el :'#root' ,
data :{
name :'Bruno Mars'
}
})
</script >
</html >
双向绑定只能使用在表单类元素上,也就是标签必须有 value 属性,比如输入框、单选框、多选框等
插值表达式和单向绑定数据只能从 data 流向页面,而双向绑定还可以使数据从页面流向 data
5,el 与 data 的两种写法
5.1,el 的两种写法
5.1.1,第一种写法 new Vue ({
el : '#root' ,
data : {
}
})
5.1.2,第二种写法 const vm = new Vue ({
data : {
}
})
vm.$mount('#root' )
第一种创建 Vue 对象的时候就要绑定容器
第二种先创建 Vue 对象,可以做一些其他操作后再绑定容器
5.2,data 的两种写法
5.2.1,对象式 new Vue ({
el : '#root' ,
data : {
name :'Nicki Minaj'
}
})
5.2.2,函数式 new Vue ({
el : '#root' ,
data ( ){
return {
name :'Nicki Minaj'
}
}
})
使用组件时,必须使用函数式定义数据
由 Vue 管理的函数不能写成箭头函数,如果使用箭头函数,则函数中的 this 表示的是 window,如果使用普通函数格式,则 this 表示 Vue 对象
6,Object.defineProperty 方法 先看一段 JS 代码,将一个变量的值赋值给一个属性:
let number = 18
let person = {
name :'张三' ,
sex :'男' ,
age :number
}
如果通过这种方式给 age 赋值,只有第一次代码执行到赋值语句时才会将 age 的值修改为 18,如果以后 number 的值发生变化,则 age 不会跟着变化。
6.1,方法介绍 此方法用于给对象定义属性使用,参数 1 表示给哪个对象定义属性,参数 2 表示给对象中的哪个属性赋值,参数 3 写赋予值的配置对象(对属性值进行一些高级的操作),如下所示:
6.2,代码示例: let person = {
name :'张三' ,
sex :'男' ,
}
Object .defineProperty (person,'age' ,{
value :18 ,
enumerable :true ,
writable :true ,
configurable :true
})
6.4,get()、set() 方法: <!DOCTYPE html >
<html lang ="en" >
<head >
<meta charset ="UTF-8" >
<title > Title</title >
</head >
<body >
</body >
<script type ="text/javascript" >
let number = 12
let person = {
name :'张三' ,
sex :'男' ,
}
Object .defineProperty (person,'age' ,{
get ( ){
console .log ('有人读取 age 属性,get 方法被调用' )
return number
},
set (value ){
console .log ('有人修改 age 属性,set 方法被调用,修改值为' ,value)
number = value
}
})
</script >
</html >
上述代码完成了一种功能:person 对象中有 age 这个属性,但是 age 属性的值并不是固定的,可以随时读取,随时修改。
7,事件处理
7.1,基本使用
7.1.1,基本语法: v-on:事件名 = "xxx",xxx 表示事件发生时要执行的函数,也可以写一些简单的逻辑语句
7.1.2,简写: 事件对象: 事件触发的时候会执行某个函数,该函数的形参(如果只有一个)会自动接收一个事件对象(即使调用函数时没有传递任何实参),这个事件对象中包含这个事件的各种信息
7.1.3,代码示例: <!DOCTYPE html >
<html lang ="en" >
<head >
<meta charset ="UTF-8" >
<title > v-model</title >
<script type ="text/javascript" src ="./js/vue-2.5.17.js" > </script >
</head >
<body >
<div id ="root" >
<h2 > 欢迎来到{{name}}学习</h2 >
<button @click ="showInfo1" > 点我提示信息 1</button >
</div >
</body >
<script type ="text/javascript" >
const vm = new Vue ({
el :'#root' ,
data :{
name :'霍格沃茨' ,
},
methods :{
showInfo1 (event ){
console .log (event.target )
console .log (event.target .innerText )
},
}
})
</script >
</html >
7.2,$event 如果想要事件发生时既要传递实参又要在函数中使用事件对象,那么就必须在调用函数时使用 $event 来表示传递的是事件对象,如下代码所示:
7.2.1,代码示例: <!DOCTYPE html >
<html lang ="en" >
<head >
<meta charset ="UTF-8" >
<title > v-model</title >
<script type ="text/javascript" src ="./js/vue-2.5.17.js" > </script >
</head >
<body >
<div id ="root" >
<h2 > 欢迎来到{{name}}学习</h2 >
<button @click ="showInfo1($event, 22)" > 点我提示信息 1</button >
</div >
</body >
<script type ="text/javascript" >
const vm = new Vue ({
el :'#root' ,
data :{
name :'霍格沃茨' ,
},
methods : {
showInfo1 (event, number ) {
console .log (event.target )
console .log ('参数数字是' + number)
},
}
})
</script >
</html >
7.2.2,总结 methods 中定义的方法属于被 Vue 实例所管理的方法:
如果使用箭头函数,this 表示 window
如果使用普通函数,this 表示 Vue 实例或者组件实例对象
7.3,事件修饰符
7.3.1,事件修饰符有 6 种:
prevent:阻止事件的默认行为
stop:阻止事件冒泡(使用在内部标签上)
事件冒泡:内部标签的事件触发时,外层标签如果有相同的事件,那么这个外部标签的事件会被自动触发
once:事件只触发一次
self:只关心自己标签上触发的事件,不监听事件冒泡
capture:使用事件的捕获模式
passive:事件的默认行为立即执行,无需等待事件回调执行完毕
7.3.2,prevent 事件 <!DOCTYPE html >
<html lang ="en" >
<head >
<meta charset ="UTF-8" >
<title > v-model</title >
<script type ="text/javascript" src ="./js/vue-2.5.17.js" > </script >
</head >
<body >
<div id ="root" >
<h2 > 欢迎来到{{name}}学习</h2 >
<a href ="http://www.baidu.com" @click.prevent ="showInfo" > 点我提示信息</a >
</div >
</body >
<script type ="text/javascript" >
const vm = new Vue ({
el :'#root' ,
data :{
name :'霍格沃茨' ,
},
methods : {
showInfo1 (event, number ) {
console .log (event.target )
console .log ('参数数字是' + number)
},
}
})
</script >
</html >
7.3.3,stop 事件 <!DOCTYPE html >
<html lang ="en" >
<head >
<meta charset ="UTF-8" >
<title > v-model</title >
<script type ="text/javascript" src ="./js/vue-2.5.17.js" > </script >
</head >
<body >
<div id ="root" >
<h2 > 欢迎来到{{name}}学习</h2 >
<div @click = "showInfo2" >
<button @click.stop = "showInfo" > 按钮 </button >
</div >
</div >
</body >
<script type ="text/javascript" >
new Vue ({
el :'#root' ,
data :{
name :'霍格沃茨'
},
methods :{
showInfo ( ){ alert ('showInfo 同学你好!' ) },
showInfo2 ( ){ alert ('showInfo2 同学你好!' ) }
}
})
</script >
</html >
只弹出一次提示信息,如果不阻止事件冒泡,则会弹出两次提示信息。
7.3.4,once 事件 <!DOCTYPE html >
<html lang ="en" >
<head >
<meta charset ="UTF-8" >
<title > v-model</title >
<script type ="text/javascript" src ="./js/vue-2.5.17.js" > </script >
</head >
<body >
<div id ="root" >
<h2 > 欢迎来到{{name}}学习</h2 >
<div >
<button @click.once ="showInfo" > 按钮 </button >
</div >
</div >
</body >
<script type ="text/javascript" >
new Vue ({
el :'#root' ,
data :{
name :'霍格沃茨'
},
methods :{
showInfo ( ){ alert ('showInfo 同学你好!' ) },
}
})
</script >
</html >
7.4,按键修饰符
7.4.1,使用方式:
7.4.2,作用:
click:点击事件
keyup:按键抬起事件
keydown:按键按下事件
7.4.3,常用的按键修饰符有 9 个
enter:回车
delete:删除或退格
esc:退出
space:空格
tab:换行(键盘按下就会失去焦点,所以必须配合 keydown 使用)
up:上
down:下
left:左
right:右
<!DOCTYPE html >
<html lang ="en" >
<head >
<meta charset ="UTF-8" >
<title > Title</title >
<script type ="text/javascript" src ="./js/vue-2.5.17.js" > </script >
</head >
<body >
<div id ="root" >
<input type ="text" placeholder ="请按下对应的按键" @keyup.enter ="showInfo" > </input >
</div >
</body >
<script type ="text/javascript" >
new Vue ({
el :'#root' ,
methods :{
showInfo (event ){
console .log (event.key )
console .log (event.keyCode )
}
}
})
</script >
</html >
可以使用上述方式得到所有按键的按键名,故可以使用的按键修饰符不仅仅是默认的 9 个。
8,计算属性
8.1,基本概念 如果一个属性要通过已有的属性计算出来,那么可以使用计算属性。计算属性的读取和修改必须通过定义 getter/setter 来进行。
注:计算属性的底层借助了 Object.defineProperty 方法提供的 getter 和 setter 来完成读取和修改
8.1.1,代码示例: <!DOCTYPE html >
<html lang ="en" >
<head >
<meta charset ="UTF-8" >
<title > Title</title >
<script type ="text/javascript" src ="./js/vue-2.5.17.js" > </script >
</head >
<body >
<div id ="root" >
姓:<input type ="text" v-model ="firstName" >
<br /> <br />
名:<input type ="text" v-model ="lastName" >
<br /> <br />
全名:<span > {{fullName}}</span >
<br /> <br />
全名:<span > {{fullName}}</span >
</div >
</body >
<script type ="text/javascript" >
const vm = new Vue ({
el :'#root' ,
data :{
firstName :'张' ,
lastName :'三' ,
},
methods : {},
computed :{
fullName :{
get ( ){
console .log ('计算属性被调用了' )
return this .firstName + '-' + this .lastName
},
set (value ){
console .log ('set' ,value)
const arr = value.split ('-' )
this .firstName = arr[0 ]
this .lastName = arr[1 ]
}
}
}
})
</script >
</html >
8.1.2,运行结果:
8.2,简写形式
8.2.1 代码示例: <!DOCTYPE html >
<html lang ="en" >
<head >
<meta charset ="UTF-8" >
<title > Title</title >
<script type ="text/javascript" src ="./js/vue-2.5.17.js" > </script >
</head >
<body >
<div id ="root" >
姓:<input type ="text" v-model ="firstName" >
<br /> <br />
名:<input type ="text" v-model ="lastName" >
<br /> <br />
全名:<span > {{fullName}}</span >
<br /> <br />
全名:<span > {{fullName}}</span >
</div >
</body >
<script type ="text/javascript" >
const vm = new Vue ({
el :'#root' ,
data :{
firstName :'张' ,
lastName :'三' ,
},
methods : {},
computed :{
fullName ( ){
console .log ('get 被调用了' )
return this .firstName + '-' + this .lastName
}
}
})
</script >
</html >
使用简写形式之后,fullName 仍然是一个属性而不是方法,所以调用的时候不能加小括号。
相关免费在线工具 Keycode 信息 查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
Escape 与 Native 编解码 JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
JavaScript / HTML 格式化 使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
JavaScript 压缩与混淆 Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online