文章目录
- 1、基本指令测试案例
- 1.1、入门案例
- 1)不同选择器测试
- 2)测试运算
- 1.2、v-text和v-html
- 1.3、v-on事件绑定
- 1.4、v-show和v-if
- 1.5、v-for
- 1.6、v-model
- 1.7、综合小案例——实现备忘录
- 1.8、综合小案例——购物车
- 1.9、计算属性
- 1.10、事件修饰符
- 1.11、按键修饰符
- 2、Axios
- 2.1、Axios处理并发请求
- 3、Vue的生命周期
该篇博文根据B站UP主编程不良人的课程——【编程不良人】2021最新Vue全家桶系列教程整理而出
本文是对之前学习过的Vue知识点的一个复习和补充
1、基本指令测试案例
1.1、入门案例
1)不同选择器测试
案例一:分别使用id选择器和类选择器进行测试
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
{{msg}}
</div>
</body>
</html>
<script src="../vue/vue.js"></script>
<script>
new Vue({
el: "#app", //指定vue实例作用的范围
data: {
msg: "hello mobian"
}
});
</script>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div class="bpp">
{{msg}}
</div>
</body>
</html>
<script src="../vue/vue.js"></script>
<script>
new Vue({
el: ".bpp",
data: {
msg: "hello mobian"
}
});
</script>
注意事项:
- 作用要素建议放在body内部,而不要放在在body上。即不要将el指向<body>标签和<html>标签
- 页面解析顺序为由上到下,所以Vue获取相关要素时,相关要素已经要已经加载。即可以把Vue语法放在页面的最后
- Vue内部各个元素之间使用逗号隔开
- 在定义选择器样式时,可以使用任意的CSS选择器,比如类选择器、id选择器。但更推荐使用id选择器
2)测试运算
案例二:对获取数据进行相关的操作
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!--算术运算-->
{{msg + "123"}} <p></p>
<!--逻辑运算-->
{{msg == "123"}} <p></p>
<!--调用js方法-->
{{msg.toUpperCase()}} <p></p>
{{ age+1 }} <p></p>
{{ age == 24 }} <p></p>
{{ age == '24' }} <p></p>
{{ age == "24" }} <p></p>
</div>
</body>
</html>
<script src="../vue/vue.js"></script>
<script>
new Vue({
el: "#app",
data: {
msg: "hello mobian",
age: 24
}
});
</script>
结果:
1.2、v-text和v-html
v-text:用来获取data中的数据将数据以文本的形式渲染到指定的标签内部,类似于JavaScript中的innerText
v-html:用来获取data中数据将数据重包含的html标签先解析在渲染到指定标签的内部,类似于JavaScript中的innerHTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h2>{{msg}}+'这里有msg'</h2>
<h2 v-text="msg">这里有msg</h2>
<h2 v-html="msg">这里有msg</h2>
</div>
</body>
</html>
<script src="../vue/vue.js"></script>
<script>
new Vue({
el: "#app",
data: {
msg: "hello mobian<a href='http://www.baidu.com'>点我</a>"
}
});
</script>
结论:
- 使用v-text渲染数据会直接覆盖标签里面的内容
- 使用v-html渲染数据会解析msg里面的html标签
- 使用v-text可以避免插值闪烁。即数据会渲染时,不会由{{msg}}状态变为具体内容,而是由空白直接渲染出来。
1.3、v-on事件绑定
js事件三要素:
- 事件源:事件的源头,一般指html标签
- 事件:如onclick(单击)、dbclick(双击)、onkeyup(键盘抬起)、mouseenter(鼠标移入)、mouseleave(鼠标移出)…
- 事件处理程序:事件处理函数 function(){}
定义一个按钮,每次点击后,显示的数字+5
这里的函数定义方式和单击事件的定义方式为ES6的语法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h2>{{ age }}</h2>
<input type="button" value="点我" @click="addAge(5)" />
</div>
</body>
</html>
<script src="../vue/vue.js"></script>
<script>
new Vue({
el:'#app',
data:{
age : 23,
fatherOld : 50,
},
methods: {
addAge(number){
this.age = this.age + number;
}
}
})
</script>
1.4、v-show和v-if
两个标签都是用来控制页面中的标签是否展示或隐藏,使用示例 v-if= “true”,当然我们也可以使用Vue中data的变量来控制
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h2 v-if="isShow">默辨</h2>
<h2 v-show="isShow">默辨2</h2>
</div>
</body>
</html>
<script src="../vue/vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
isShow:true
},
methods: {}
})
</script>
同样是隐藏,但是两者隐藏的方式是不一样的:
- v-if:底层是通过控制dom元素实现,即这个隐藏是在dom树上删除该节点
- v-show:底层是通过CSS样式实现的,即这个隐藏是样式的隐藏,元素节点还在dom树上。数据量大时推荐使用该标签
1.5、v-for
遍历获取数据
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h3>遍历对象</h3>
<h5 v-for="(value, key ,index) in student">
{{ value}}
{{ key}}
{{ index}}
</h5>
<h3>遍历数组</h3>
<h5 v-for="(value, index) in place">
{{ value}}
{{ index+1}}
</h5>
<h3>遍历数组中的对象</h3>
<!--为了利于Vue进行标签的区分,所以此处绑定一个key标签,该标签对于结果没有影响-->
<h5 v-for="(value, index) in people" :key="value.id">
{{ index}} {{value.name}} {{value.age}} {{value.hobby}}
</h5>
</div>
</body>
</html>
<script src="../vue/vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
msg: "hello mobian",
student: {name: "mobian", age: 12, class: 17},
place: ["深圳", "北京", "成都", "重庆", "杭州"],
people: [{
id:"1",
name: "mobian",
age: 21,
hobby: "跑步"
}, {
id:"2",
name: "zhangsan",
age: 11,
hobby: "跳远"
}, {
id:"3",
name: "wangwu",
age: 21,
hobby: "踢足球"
}],
},
})
</script>
测试结果:
注意事项:以下说明来源Vue官网
即我们在使用v-for遍历获取对象内容时,尽可能的为我们的value绑定一个唯一的key,且类型为数字或字符串
1.6、v-model
用来绑定form表单标签中的value属性,然后交给vue实例进行管理,常作用的标签input、select、checkbox、button…
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h2>{{ msg }}</h2>
<input type="text" v-model="msg"/>
</div>
</body>
</html>
<script src="../vue/vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
msg: "hello mobian",
},
methods: {}
})
</script>
当我们修改输入框中的值,直接会影响到Vue的data中的msg值。
曾经我们修改一个form表单中的数据的过程:
- 查询对应的数据,渲染到界面
- 修改对应的值
- 获取对应元素节点的内容值
- 将获取到的值,传递到后端,完成修改
现在使用Vue修改form表单中的数据过程:
- 查询对应的数据,渲染到界面
- 修改对应的值(由于Vue的双向绑定机制,我们这里表面上除了修改的前端视图的值,还修改了Vue的data中的数据)
- 直接将data中的数据传递给后端
1.7、综合小案例——实现备忘录
该测试案例,结合了v-for、v-show、v-on事件、v-model等
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h2>备忘录功能实现</h2>
请输入备忘录内容<input type="text" v-model="context" value=""/> <input type="button" @click="addItems" value="添加到备忘录"/>
<!--备忘录信息为空时,显示空提示-->
<h4 v-show="items.length == 0">当前备忘录没有信息</h4>
<li v-for="item ,index in items" :key="">{{index+1}}.{{ item }}
<a href="javascript:;" v-on:click="deleteItems(index)">删除</a>
</li>
<h2>当前备忘录中共:{{ items.length}}条</h2>
<input type="button" v-on:click="clearItems" value="清空备忘录"/>
</div>
</body>
</html>
<script src="../vue/vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
context: "",
items: ["今天要好好学习", "跑步打卡"],
},
methods: {
//清空所有备忘录数据
clearItems() {
this.items = [];
},
//添加备忘录数据
addItems() {
if (this.context) {
this.items.push(this.context);
this.context = "";
}
},
//删除备忘录数据
deleteItems(index) {
this.items.splice(index, 1);
}
}
})
</script>
测试结果:
1.8、综合小案例——购物车
涉及知识点:v-for遍历数组中的对象
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h2>购物车案例实现</h2>
<table border="1">
<tr>
<th>id</th>
<th>名称</th>
<th>价格</th>
<th>数量</th>
<th>小计</th>
</tr>
<tr v-for="(phone, index) in phones">
<td>{{ phone.id }}</td>
<td>{{ phone.name }}</td>
<td>{{ phone.price }}</td>
<td><input type="button" value="-" @click="reduceCount(index)" />{{ phone.count }}<input type="button"
value="+"
@click="addCount(index)"/>
</td>
<td>{{ (phone.price * phone.count).toFixed(2) }}</td>
</tr>
</table>
<h4>总计:{{totalPrice()}}</h4>
</div>
</body>
</html>
<script src="../vue/vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
phones: [{
id: 1,
name: "hua wei",
price: 25.21191,
count: 1,
amount: 20
}, {
id: 2,
name: "apple",
price: 10.50,
count: 2,
amount: 20
}]
},
methods: {
addCount(index) {
this.phones[index].count++;
},
reduceCount(index) {
if (this.phones[index].count > 0) {
this.phones[index].count--;
}
},
totalPrice() {
let sum = 0;
for (let a of this.phones) {
sum += a.count * a.price;
}
return sum.toFixed(2);
}
}
})
</script>
测试结果:
1.9、计算属性
在案例8的基础上,如果我们在多个场景使用totalPrice方法,那么我们就可以使用计算属性,避免多次计算带来效率的延迟。
new Vue({
el: '#app',
data: {},
methods: {},
// 使用计算属性
computed:{
totalPrice() {
let sum = 0;
for (let a of this.phones) {
sum += a.count * a.price;
}
console.log(sum)
return sum.toFixed(2);
}
}
})
当我们在获取相关数据的计算结果时,如果使用传统的methods方式,我们每调用一次该方法,就会去重新计算一遍这个结果。如果使用了computed计算属性,那么只会在我们的计算结果发生变化的时候,才会去重新执行方法中的计算。
由名字——计算属性可得,我们将computed中的方法都当成了一个一个的属性,我们正常调用属性的时候,是没有括号的,即调用方法为:
<h4>总计:{{ totalPrice }}</h4>
1.10、事件修饰符
事件修饰符:和事件连用,用来决定事件的触发条件和决定事件的触发机制
.stop 停止事件冒泡
.prevent 阻止事件行为
.self 只触发自身行为
.once 只触发一次
可以使用链式的写法,如v-on:click.stop.once=“xxx”
测试案例:使用四个代码块分别测试四种不同的事件修饰符
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h2>stop事件修饰符</h2>
<!--用来阻止事件的冒泡-->
<div v-on:click="parent" style=" width: 200px;height: 200px;border: 1px;background: red">
<div v-on:click.stop="son" style=" width: 100px;height: 100px;border: 1px; background: pink">
</div>
</div>
<h2>prevent事件修饰符</h2>
<!--根据href的链接自动跳转,.prevent阻止事件默认行为-->
<a href="http://www.baidu.com" v-on:click.prevent="clickHref">百度一下,你就知道</a>
<a href="javascript:;" v-on:click="clickHref">百度一下,你就知道</a>
<a href="javascript:void(0);" v-on:click="clickHref">百度一下,你就知道</a>
<h2>self事件修饰符</h2>
<div v-on:click.self="parent" style=" width: 200px;height: 200px;border: 1px;background: red">
<div v-on:click="son" style=" width: 100px;height: 100px;border: 1px; background: pink">
</div>
<div v-on:click="son" style=" width: 100px;height: 100px;border: 1px; background: orange">
</div>
</div>
<h2>once事件修饰符</h2>
<input type="button" value="点我" v-on:click.once="clickOnce"/>
</div>
</body>
</html>
<script src="../vue/vue.js"></script>
<script>
new Vue({
el: '#app',
data: {},
methods: {
parent() {
alert("parent")
},
son() {
alert("son")
},
clickHref(){
},
clickOnce(){
alert("click me")
}
},
computed: {}
})
</script>
1.11、按键修饰符
按键修饰符:和键盘上的事件进行连用,用来修饰键盘上特定的案件来触发对应的事件
.enter:按下回车键时触发
.tab:按下tab键时触发
.delete:按下delete键时触发
.esc、.space、.up、.down、.left、.right
测试案例:当键盘输入delete或enter键抬起后,会弹出“test success”字符串
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!-- 当键盘出现delete键和enter键的抬起时触发该事件中的方法效果。这里的使用方式和事件修饰符一样,可以使用链式的写法-->
<input type="text" v-on:keyup.delete.enter="testKeyUp" value="msg"/>
</div>
</body>
</html>
<script src="../vue/vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
msg: "hello mobian",
},
methods: {
testKeyUp(){
alert("test success");
}
},
computed: {}
})
</script>
2、Axios
Axios是一个异步请求技术,核心技术就是用来在页面中发送异步请求,并获取对应数据在页面中渲染。与页面局部刷新技术AJAX相同
2.1、Axios处理并发请求
// 请求1
function findAll() {
return axios.get("http://127.0.0.1:8080/user/findAll");
}
// 请求2
function subUser() {
return axios.post("http://127.0.0.1:8080/user/findAll", {
userName: "mobian",
age: 12,
tel: "12345678654"
});
}
axios.all([findAll(),subUser()]).then(
axios.spread(function (res1, res2) { // 用来将一组函数的响应结果进行汇总处理
console.log(res1.data);
console.log(res2.data);
})
);
3、Vue的生命周期
此图片来源官网
测试代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h2 id="sp">{{ msg }}</h2>
<input type="button" v-on:click="updateValue" value="点我完成数据信息修改"/>
</div>
</body>
</html>
<script src="../vue/vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
msg: "hello mobian",
},
methods: {
updateValue() {
this.msg = "hello world";
}
},
// 一、初始化阶段钩子函数
beforeCreate() {
// 1.生命周期中第一个函数,该函数在执行时,Vue实例仅仅完成了自身事件的绑定和生命周期函数的初始化工作
// Vue实例中还没有 date、el、method相关属性
console.log("beforeCreate函数:" + this.msg)
},
created() {
// 2.生命周期的第二个函数,该函数在执行时Vue实例已经完成了初始化data属性和methods中相关的方法
console.log("created函数:" + this.msg)
},
beforeMount() {
// 3.生命周期中第三个函数,该函数在执行时Vue将El中指定的作用范围作为模板进行编译
console.log("beforeMount函数:" + document.getElementById("sp").innerText);
},
mounted() {
// 4.生命周期中第四个函数,该函数在执行过程中,已经将数据渲染到界面中并且已经更新界面内容
console.log("mounted函数:" + document.getElementById("sp").innerText);
},
// 二、运行阶段钩子函数
beforeUpdate() {
// 5.生命周期中第五个函数,该函数是data中数据发生改变时执行
// 该事件执行时仅仅是Vue实例中data数据变化,界面显示的依然是原始数据
console.log("beforeUpdate函数:" + this.msg);
console.log("beforeUpdate函数:" + document.getElementById("sp").innerText);
},
updated() {
// 6.生命周期中第六个函数,该函数执行时data中数据发生变化,页面种数据也发生了变化 此时页面中的数据已经和data中数据一致
console.log("updated函数:" + this.msg);
console.log("updated函数:" + document.getElementById("sp").innerText);
},
// 三、销毁阶段钩子函数
beforeDestory(){
// 7.生命周期第七个函数,该函数执行时,Vue中所有数据 methods componet都没有被销毁
console.log(this.updated());
console.log(this.msg);
},
destoryed(){
// 8.生命周期的第八个函数,该函数执行时,Vue实例彻底销毁
console.log(this.updated());
console.log(this.msg);
}
})
</script>
测试结果:
页面加载时
点击按钮,数据发生修改时