Vue复习之Vue2
技术简介
MVVM模型
使用方式
指令 (重点)
Vue生命周期
综合案例
1 技术简介
(1)渐进式JavaScript 框架
框架:一套现成的解决方案
规则:遵循一定的规范->代码规范
优势:代码量减少
(2)往页面填充:
数据
(3)渐进式:
自底向上:简单使用(xx.js文件) 复杂使用(引入相关的文件) 灵活
(4)特性:
单向数据绑定:
JS->页面
JS中数据改变->页面数据随之改变
双向数据绑定:
JS->页面
JS中数据改变->页面数据随之改变
页面->JS form
页面数据随之改变 用户操作表单元素->JS中数据改变
(5)声明式编码
指令(重点)
2 MVVM模型(重点)
(1)M:
Model,模型 数据源
(2)V:
View,视图 页面
(3)VM:
ViewModel:视图模型 Vue实例
中介
思想:
是单向数据绑定和双向数据绑定特性的基础
3 Vue使用步骤
3.1 基础介绍
(1)引入vue.js文件
本地文件->相对路径 根路径
非本地文件->绝对路径
Vue构造函数
(2)创建Vue实例:
new Vue({
el:'#id属性值',
data:{
id:1,
name:'tom',
...
}
})
(3)创建div元素:
设置id属性
使用Vue:
不用再手动操作DOM,只需保证对应关系即可
3.2 案例
3.2.1 案例1
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>使用步骤</title>
<!--
1.引入vue.js文件:
vue.js vue.min.js
推荐使用vue.js->明确的报错和警告信息
-->
<script src="js/vue.js"></script>
</head>
<body>
<!--
3.创建根标签: View
div
页面呈现所有内容
设置属性->id
代码格式:
HTML代码
Vue代码
-->
<div id="root">
<p>{{name}}</p>
</div>
</body>
<script>
/*
2.创建Vue实例: ViewModel
el:
监控页面哪个元素,对应于根标签 属性值:CSS选择器的字符串表示形式
data:
页面呈现数据 Model
*/
var vm = new Vue({
el: '#root',
data: {
name: 'jack'
}
});
// Vue {_uid: 0, _isVue: true, $options: {…}, _renderProxy: Proxy, _self: Vue, …}
console.log(vm);
// jack ->不推荐使用
console.log(vm.$data.name);
// jack ->推荐使用
console.log(vm.name);
</script>
</html>
3.2.2 案例2
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="js/vue.js"></script>
</head>
<body>
<!-- View -->
<div id="root">
</div>
</body>
<script>
var vm = new Vue({ // ViewModel
// el: '#root',
// 对象式
/* data: { // Model
id: 1
} */
// 函数式
data() {
return {
id: 1
}
}
})
// el的另外一种写法
vm.$mount('#root');
console.log(vm.id);
</script>
</html>
4 Vue指令(重点)
4.1 基础介绍
(1)渲染页面数据
(2)指令分类:
内容渲染指令
属性绑定指令
事件绑定指令
双向绑定指令
条件渲染指令
列表渲染指令
4.2 详细介绍
4.2.1 内容渲染指令
4.2.1.1 基础介绍
(1)v-text
渲染文本内容 覆盖原先内容
(2){{}}
插值语法 设置标签体文本内容 **** 不能解析HTML标签
(3)v-html
解析HTML标签
4.2.1.2 案例
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="js/vue.js"></script>
</head>
<body>
<div id="root">
<!--
内容渲染指令:
(1)v-text
渲染文本内容 覆盖原先内容
(2){{}}
插值语法 设置标签体文本内容 **** 不能解析HTML标签
(3)v-html
解析HTML标签
-->
<!-- v-text:渲染文本内容 覆盖原先内容 -->
<p v-text='name'></p>
<!-- {{}}:插值语法 设置标签体文本内容 **** 不能解析HTML标签 -->
<div>名称:{{name}}</div>
<!-- v-html:解析HTML标签 -->
<div v-html='address'></div>
</div>
</body>
<script>
new Vue({
el: '#root',
data: {
name: '尚马教育',
address: '<p>河南郑州</p>',
addresss: '<p>河南郑州2</p>',
}
})
</script>
</html>
4.2.2 属性绑定指令
4.2.2.1 基础介绍
(1)动态设置元素的样式属性
(2)属性:
value
placeholder
class
disabled
src
href
......
(3)写法:
完整写法:
v-bind:xx
简化写法:
:xx
4.2.2.2 案例
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="js/vue.js"></script>
<style>
.divCls {
width: 100px;
height: 100px;
border: 1px solid black;
background-color: pink;
}
</style>
</head>
<body>
<div id="root">
<!--
属性绑定指令:
完整写法:
v-bind:xx
比如:
value
placeholder
class
src
href
disabled
简化写法:***
:xx
-->
<!-- 设置value属性值 -->
<!-- <input type="text" v-bind:value='textVal' > -->
<!-- 设置提示信息 -->
<input type="text" :placeholder='msg'>
<br>
<br>
<!-- 设置样式 -->
<div v-bind:class='divStyle'>
</div>
<br>
<!-- src -->
<!-- <img v-bind:src='imgSrc'> -->
<!-- href -->
<a v-bind:href='hrefPath'>百度</a>
<br>
<input type="button" value='普通按钮' v-bind:disabled='btnStatus'>
</div>
</body>
<script>
new Vue({
el: '#root',
data: {
textVal: '今天天气比较凉爽',
msg: '请输入内容',
divStyle: 'divCls',
imgSrc: 'http://p0.qhimg.com/sdm/242_150_/t0148a5d81610984048.jpg?&w=96&h=54&rs=2&qlt=100',
hrefPath: 'http://www.baidu.com',
btnStatus: false
}
})
</script>
</html>
4.2.3 事件绑定指令 (重点)
4.2.3.1 基础介绍
(1)给元素绑定事件
(2)事件绑定指令:
完整写法:
v-on:xx='函数名()'
函数名:function() {}
简化写法:***
@xx='函数名()'
函数名(){}
4.2.3.2 案例
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="js/vue.js"></script>
</head>
<body>
<div id="root">
<!--
事件绑定指令:
完整写法:
v-on:xx='函数名()'
函数名:function() {}
简化写法:***
@xx='函数名()'
函数名(){}
-->
<input type="text" :value='textVal'>
<!-- <input type="button" value="按钮" v-on:click='getTextVal()' /> -->
<input type="button" value="按钮" @click='getTextVal()' />
</div>
</body>
<script>
var vm = new Vue({
el: '#root',
data: {
textVal: '月入过万',
},
methods: {
/* getTextVal: function() {
// 输出文本框的value属性值
console.log(vm.textVal);
} */
// 简化写法
getTextVal() {
// console.log(vm.textVal);
// Vue {_uid: 0, _isVue: true, $options: {…}, _renderProxy: Proxy, _self: Vue, …}
console.log(this);
console.log(this.textVal);
}
}
})
</script>
</html>
4.2.4 双向绑定指令 (重点)
4.2.4.1 基础介绍
(1)常用于表单元素
(2)语法:
v-model
4.2.4.2 案例
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="js/vue.js"></script>
<style>
.red {
width: 100px;
height: 100px;
border: 1px solid black;
background-color: red;
}
.yellow {
width: 100px;
height: 100px;
border: 1px solid black;
background-color: yellow;
}
.green {
width: 100px;
height: 100px;
border: 1px solid black;
background-color: green;
}
</style>
</head>
<body>
<div id="root">
<!--
双向绑定指令:****
v-model
JS->页面
页面->JS
表单元素
-->
<input type="text" v-model='textVal'>
<input type="button" value="按钮" @click='getTextVal()' />
<br>
<input type="radio" v-model='sex' value="0" />男
<input type="radio" v-model='sex' value="1" />女
{{sex}}
<br>
<input type="checkbox" v-model='weather' value="cloudy" />多云
<input type="checkbox" v-model='weather' value="rain" />下雨
<input type="checkbox" v-model='weather' value="sunny" />晴天
{{weather}}
<br>
<!-- 颜色下拉选 -->
<select v-model='colorVal' @change='getColorVal()'>
<option value="" disabled selected>请选择</option>
<option value="red">红色</option>
<option value="yellow">黄色</option>
<option value="green">绿色</option>
</select>
<!-- 案例->利用选中的颜色,给div设置样式 -->
<div :class='divStyle'>
</div>
</div>
</body>
<script>
var vm = new Vue({
el: '#root',
data: {
textVal: '月入过万',
sex: '1',
weather: ['rain', 'sunny'],
colorVal: '',
divStyle: ''
},
methods: {
// 函数
getTextVal() {
console.log(this.textVal);
},
getColorVal() {
// 选中的颜色
console.log(this.colorVal);
this.divStyle = this.colorVal;
}
}
})
</script>
</html>
4.2.5 条件渲染指令
4.2.5.1 基础介绍
(1)控制元素是否存在
(2)语法:
核心指令:
v-if
辅助指令:
v-else-if
v-else
4.2.5.2 案例
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="js/vue.js"></script>
</head>
<body>
<div id="root">
<!--
条件渲染指令:
核心指令:
v-if
辅助指令:
v-else-if
v-else
控制元素是否存在
-->
<div v-if='divVal==1'>div1</div>
<!-- <div v-else-if='divVal==2'>div2</div>
<div v-else='divVal'>div3</div> -->
<div v-if='divVal==2'>div2</div>
</div>
</body>
<script>
var vm = new Vue({
el: '#root',
data: {
divVal: '20'
},
methods: {
}
})
</script>
</html>
4.2.6 列表渲染指令 (重点)
4.2.6.1 基础介绍
(1)遍历数据
(2)语法:
v-for='item in items'
item:遍历到的每一项数据
items:要遍历的数据
4.2.6.2 案例
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="js/vue.js"></script>
<style>
table,
td,
th {
border: 1px solid black;
}
</style>
</head>
<body>
<div id="root">
<!--
列表渲染指令:
v-for='item in items'
item:遍历到的每一项数据
items:要遍历的数据
-->
<!-- 无序列表 -->
<ul>
<!-- 标签体内容:使用{{}} -->
<li v-for='subject in subjectList'>{{subject.name}}</li>
</ul>
<!-- select -->
<select v-model='proVal'>
<option value="">请选择</option>
<!--
标签体内容:
属性: 属性绑定
-->
<option :value="pro.code" v-for="pro in proList">{{pro.name}}</option>
</select>
{{proVal}}
<hr>
<!-- table -->
<input type="button" value="操作" @click='showData()' />
<br>
<br>
<table>
<tr>
<th>编号</th>
<th>姓名</th>
<th>性别</th>
</tr>
<tr v-for='emp in empList'>
<td>{{emp.no}}</td>
<td>{{emp.name}}</td>
<td>{{emp.sex}}</td>
</tr>
</table>
</div>
</body>
<script>
var vm = new Vue({
el: '#root',
data: {
// 课程 利用无序列表呈现
subjectList: [{
"name": "Java"
}, {
"name": "Web"
}, {
"name": "Python"
}],
// 省份 利用下拉选呈现 jsoncn
proList: [{
"code": 1,
"name": "河南省"
}, {
"code": 2,
"name": "湖北省"
}, {
"code": 3,
"name": "四川省"
}],
proVal: '',
// 员工 利用表格呈现
empList: [
/* {
"no": 1,
"name": "lucy",
"sex": "男"
}, {
"no": 2,
"name": "jack",
"sex": "男"
}, {
"no": 3,
"name": "tom",
"sex": "女"
} */
],
},
methods: {
showData() {
// 使用特定技术向后端发请求,获取数据,呈现数据
// 模拟:假设数据empData是服务端返回的
var empData = [{
"no": 1,
"name": "lucy",
"sex": "男"
}, {
"no": 2,
"name": "jack",
"sex": "男"
}, {
"no": 3,
"name": "tom",
"sex": "女"
}];
this.empList = empData;
}
}
})
</script>
</html>
5 Vue生命周期
(1)生命周期指的是从创建->运行->销毁的整个阶段
(2)若程序员希望在特定的时间点去执行一些代码,可利用Vue的生命周期函数
(3)这些时间点会伴随Vue的生命周期函数自动执行
(4)分类如下:
beforeCreate
created
beforeMount
mounted ***
beforeUpdate
updated
beforeDestroy
destroyed
6 省市区综合案例 (重点)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="js/vue.js"></script>
<script src="js/addr.js"></script>
</head>
<body>
<div id="root">
<!-- 双向绑定指令 -->
<select v-model='proVal' @change='getCityVal()'>
<option value="" disabled>请选择</option>
<!-- v-for指令 -->
<option :value="pro.code" v-for="pro in proList">{{pro.label}}</option>
</select>省
<select v-model='cityVal' @change='getCounVal()'>
<option value="" disabled>请选择</option>
<option :value="city.code" v-for="city in cityList">{{city.label}}</option>
</select>市
<select v-model="counVal">
<option value="" disabled>请选择</option>
<option :value="coun.code" v-for="coun in counList">{{coun.label}}</option>
</select>区县
</div>
</body>
<script>
var vm = new Vue({
el: '#root',
data: {
// 省数据
proVal: '',
proList: [],
// 市数据
cityVal: '',
cityList: [],
// 区县数据
counVal: '',
counList: []
},
methods: {
// 加载市数据
getCityVal() {
// 将市数据恢复成请选择
this.cityVal = '';
// 将区县数据恢复成请选择
this.counVal = '';
this.counList = [];
// 当前选中省
var proCode = this.proVal;
console.log(proCode);
// 遍历
/* temp.forEach(function(pro, idx) {
// 遍历到的每一项省数据
// console.log(data);
if (pro.code == proCode) {
// console.log(111);
// 给市数据赋值
// this.cityList = pro.children;
// console.log(pro.children);
// this不再指向Vue
// Window {window: Window, self: Window, document: document, name: '', location: Location, …}
console.log(this);
}
}) */
// 箭头函数
temp.forEach(pro => {
// 匹配省数据
if (pro.code == proCode) {
//给市数据赋值
this.cityList = pro.children;
// console.log(this.cityList);
}
});
},
// 加载区县数据
getCounVal() {
// 将区县数据恢复成请选择
this.counVal = '';
// 当前选中市
var cityCode = this.cityVal;
// console.log(cityCode);
this.cityList.forEach(city => {
// 匹配市数据
if (city.code == cityCode) {
// 给区县数据赋值
this.counList = city.children;
// console.log(this.counList);
}
});
}
},
// 钩子函数
mounted() {
// 加载省数据
this.proList = temp;
// console.log(this.proList);
}
})
</script>
</html>