Vue 简介
- MVVM 框架
Model-View-ViewModel
image.png
Vue 使用 MVVM 的框架形式,并且通过声明式渲染和响应式数据绑定的方式来帮助我们完全避免了对 DOM 的操作。
初始化一个 Vue 的项目
通过 <script> 标签引入 Vue
// 开发版本,包含完整的警告和调试模式。
// 下载地址:https://vuejs.org/js/vue.js
<script src="vue.js"></script>
// 生产版本,删除了警告,30.90KB min+gzip。
// 下载地址:https://vuejs.org/js/vue.min.js
<script src="vue.min.js"></script>
// CDN引入方式,版本号为2.5.16。
// 你也可以直接通过 https://cdn.jsdelivr.net/npm/vue/ 这个地址来查看Vue的源码
// 如果你想要引入生产版本的话,那么只需要把最后的vue.js改为vue.min.js
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
通过 npm 的方式引入
-- 安装 Vue 的最新版本
npm install vue
-- 指令下载最新的 vue-cli
npm install -g vue-cli
-- 初始化项目
-- vue init <template-name> <project-name>
-- 构建一个名字叫做 my-project 的项目
vue init webpack my-project
Vue 的代码结构
单文件组件(.vue 文件)
- 单文件组件(.vue 文件)的文件结构
<template>
// html
</template>
<script>
// js
</script>
<style>
// css
</style>
数据和方法
- html 代码
说明:
- 使用 <script src="https://unpkg.com/vue"></script> 可以直接引入 Vue
- 使用 {{name}} 可以获取 Vue 实例中对应的属性
- 使用 {{greet('night')}} 调用对应的方法显示返回值。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>VueJS Tutorials</title>
<link href="styles.css" rel="stylesheet" />
<script src="https://unpkg.com/vue"></script>
</head>
<body>
<div id="vue-app">
<h1>{{greet('night')}}</h1>
<p>Name:{{name}}</p>
<p>Job:{{job}}</p>
</div>
<script src="app.js"></script>
</body>
</html>
- app.js
说明:
- el: element,html 中的根元素
- data: 用于存储数据
- methods: 方法
- Vue 中可以直接使用 this.name 调用内部的属性或方法
new Vue({
el:"#vue-app",
data:{
name:"Cherry",
job:"Java 开发"
},
methods:{
greet:function(time){
return 'Good '+ time+'! '+ this.name;
}
}
});
属性绑定
- html
- 使用 v-bind 可以绑定对应的属性
- 使用 v-html 使用绑定对应的 html 标签
<div id="vue-app">
<h1>{{greet('night')}}</h1>
<p>Name:{{name}}</p>
<p>Job:{{job}}</p>
<a v-bind:href="website">百度</a>
<input type="text" v-bind:value="name">
<p v-html="websiteTag"></p>
</div>
- app.js
new Vue({
el:"#vue-app",
data:{
name:"Cherry",
job:"Java 开发",
website:"http://www.baidu.com",
websiteTag:"<a href='http://www.baidu.com'>baidu</a>"
},
methods:{
greet:function(time){
return 'Good '+ time+'! '+ this.name;
}
}
});
事件绑定
鼠标事件绑定
- html
- 使用 v-on:click 或者 @click 可以绑定点击事件
- 使用 v-on:dblclick 或者 @dblclick 可以绑定双击事件
- 使用 v-on:mousemove 或者 @mousemove 可以绑定鼠标移动事件
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>VueJS Tutorials</title>
<link href="style.css" rel="stylesheet" />
<script src="https://unpkg.com/vue"></script>
</head>
<body>
<div id="vue-app">
<h1>Events</h1>
<p>我的年龄是 {{age}}</p>
<button v-on:click="add(1)">涨一岁</button>
<button @click="subtract(1)">减一岁</button>
<button v-on:dblclick="add(10)">双击加十岁</button>
<button v-on:dblclick="subtract(10)">双击减十岁</button>
<div id="canvas" v-on:mousemove="updateXY">{{ x }} , {{ y }}</div>
</div>
<script src="app.js"></script>
</body>
</html>
- app.js
鼠标移动事件的 event 对象包括多种参数
new Vue({
el:"#vue-app",
data:{
age:30,
x:0,
y:0
},
methods:{
add: function(inc){
this.age += inc;
},
subtract: function(dec){
this.age -= dec;
},
updateXY:function(event){
this.x=event.offsetX,
this.y=event.offsetY
}
}
});
键盘事件绑定
- index.html
使用 v-on:keyup 可以绑定键盘事件
使用 v-on:keyup.alt.enter 可以限定只有按下 alt + enter 时才会触发键盘事件
<div id="vue-app">
<h1> 键盘事件绑定 </h1>
<label>姓名:</label>
<input type="text" v-on:keyup="logName">
<label>年龄:</label>
<input type="text" v-on:keyup.enter="logAge">
</div>
- app.js
new Vue ({
el:"#vue-app",
data:{
},
methods:{
logName:function(){
console.log("正在输入名字")
},
logAge:function(){
console.log("正在输入年龄")
}
}
});
数据的双向绑定
方法一:
说明:
- 为 input 表情添加 ref="name" 属性, 在 Js 中 通过 this.$refs.name.value 获取对应的 input 框的值。
- 将获取的值 赋给定义好的 name 变量。
- 通过 {{name}} 显示对应变量的值,最终实现数据的双向绑定
- index.html
<div id="vue-app">
<h1> 双向数据绑定 /input /select /textarea </h1>
<label>姓名:</label>
<input ref="name" type="text" v-on:keyup="logName">
<span>{{name}}</span>
<label>年龄:</label>
<input ref="age" type="text" v-on:keyup="logAge">
<span>{{age}}</span>
</div>
-app.js
new Vue ({
el:"#vue-app",
data:{
name:"",
age:""
},
methods:{
logName:function(){
this.name=this.$refs.name.value
},
logAge:function(){
this.age=this.$refs.age.value
}
}
});
方法二:
使用 v-model="name" 将 input 标签中的值绑定到 定义好的变量 name 上
- index.html
<div id="vue-app">
<h1> 双向数据绑定 /input /select /textarea </h1>
<label>姓名:</label>
<input type="text" v-model="name">
<span>{{name}}</span>
<label>年龄:</label>
<input type="text" v-model="age">
<span>{{age}}</span>
</div>
- app.js
new Vue ({
el:"#vue-app",
data:{
name:"",
age:""
},
methods:{
}
});
Computed 计算属性
- computed 的使用方法与 methods 基本相似,调用的时候不需要括号
- 当 a/b 数据发生变化时,methods 中的每个方法都会执行一次,而 computed 只会执行对应数据变化的的那个方法。更加的节省性能
- index.html
<div id="vue-app">
<h1> Computed 计算属性 </h1>
<button v-on:click="a++">Add to A</button>
<button v-on:click="b++">Add to B</button>
<p>A - {{a}}</p>
<p>B - {{b}}</p>
<p>Age + A = {{addToA}}</p>
<p>Age + B = {{addToB}}</p>
</div>
- app.js
new Vue ({
el:"#vue-app",
data:{
a:0,
b:0,
age:20
},
methods:{
/*addToA:function(){
console.log("methods:addToA")
return this.a + this.age;
},
addToB:function(){
console.log("methods:addToB")
return this.b + this.age;
}*/
},
computed:{
addToA:function(){
console.log("computed:addToA")
return this.a + this.age;
},
addToB:function(){
console.log("computed:addToB")
return this.b + this.age;
}
}
});
动态 CSS
- style.css
span{
background: red;
display: inline-block;
padding: 10px;
color: #fff;
margin: 10px 0;
}
.changeColor span{
background: green;
}
.changeLenth span:after{
content: "length";
margin-left: 10px;
}
方法一:
- index.html
<h2>示例1</h2>
<div v-on:click="changeColor = !changeColor" v-bind:class="{changeColor:changeColor}">
<span>henry</span>
</div>
- app.js
new Vue ({
el:"#vue-app",
data:{
changeColor:false
},
methods:{
},
computed:{
}
});
方法二:
- index.html
<h2>示例2</h2>
<button v-on:click="changeColor = !changeColor">change color</button>
<button v-on:click="changeLenth = !changeLenth">change length</button>
<div v-bind:class="compClasses">
<span>Henry</span>
</div>
- app.js
new Vue ({
el:"#vue-app",
data:{
changeColor:false,
changeLenth:false
},
methods:{
},
computed:{
compClasses:function(){
return {
changeColor:this.changeColor,
changeLenth:this.changeLenth
}
}
}
});
v-if
- v-if="error"判断,error为 true 时展示标签,error 为 false 时,标签消失。
- v-if="error" 与 v-else-if="success" 同时使用时,同一时间只会有一个标签会出现。
- index.html
<div id="vue-app">
<h1> v-if 条件</h1>
<button v-on:click="error = !error">Toggle Error</button>
<button v-on:click="success = !success">Toggle Success</button>
<p v-if="error">网络连接错误:404</p>
<P v-else-if="success">网络连接成功:200</P>
</div>
-app.js
new Vue({
el:"#vue-app",
data:{
error:false,
success:false
},
methods:{
}
});
v-show
使用 v-show 时,error 为false 时,会为 标签添加一个 display:none 属性,error 为 true 时会删除 dispaly 属性。
-index.html
<div id="vue-app">
<h1> v-if 条件</h1>
<button v-on:click="error = !error">Toggle Error</button>
<button v-on:click="success = !success">Toggle Success</button>
<p v-show="error">网络连接错误:404</p>
<P v-show="success">网络连接成功:200</P>
</div>
v-for
- 使用 v-for="character in characters" 可以遍历集合、数组
- 使用 v-for="(user,index) in users" 遍历时, index 为对应的数组下标
- 使用 v-for="(val,key) in user" 可以遍历对象,key 对应键, val 对应值
- 使用 template 标签执行 v-for 时, 标签不会被重复渲染
- index.html
<div id="vue-app">
<h1> v-for 循环 </h1>
<!-- 数组遍历 -->
<ul>
<li v-for="character in characters">{{character}}</li>
</ul>
<ul>
<li v-for="(user,index) in users">
{{index+1}}.{{user.name}}-{{user.age}}
</li>
</ul>
<template v-for="(user,index) in users">
<h3>{{index}} . {{user.name}}</h3>
<p>Age - {{user.age}}</p>
</template>
<template v-for="(user,index) in users">
<div v-for="(val,key) in user">
<p>{{key}} - {{val}}</p>
</div>
</template>
</div>
- app.js
new Vue({
el:"#vue-app",
data:{
characters:["Mario","Luffy","Yoshi"],
users:[
{name:"Henry",age:30},
{name:"Bucky",age:25},
{name:"Emily",age:12}
]
},
methods:{
}
});
网友评论