上一章博客我们讲解了Vue基础
这一章我们来讲Vue生命周期,列表过滤,计算属性和监听器
this
指向为vue实例,名字不能更改“生命周期”指实例对象从构造函数开始执行(被创建)到被GC(Garbage Collection)回收销毁的整个存在的时期
生命周期函数是为了在实例对象的各个阶段方便开发者控制而产生,在不同的时期有不同的生命周期函数,可以利用不同时期的生命周期函数去完成不同的操作
实际的开发过程中,生命周期函数的使用较为频繁,需要重点掌
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="app">
{{myName}}
div>
body>
<script src="../js/vue2.7.js">script>
<script>
var app = new Vue({
el:"#app",
data(){
return{
myName:"abc"
}
},
beforeCreate(){
var bobyDom = document.getElementsByTagName("body")[0].innerHTML
// beforeCreate中,data的数据是没有被定义的
console.log("beforeCreate",this.myName,bobyDom);
},
})
script>
html>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="app">
{{myName}}
div>
body>
<script src="../js/vue2.7.js">script>
<script>
var app = new Vue({
el:"#app",
data(){
return{
myName:"abc"
}
},
created(){
var bobyDom = document.getElementsByTagName("body")[0].innerHTML
// 做一下页面的数据初始化工作。比如说发起ajax请求
console.log("created",this.myName,bobyDom);
},
})
script>
html>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="app">
{{myName}}
div>
body>
<script src="../js/vue2.7.js">script>
<script>
var app = new Vue({
el:"#app",
data(){
return{
myName:"abc"
}
},
beforeMount(){
var bobyDom = document.getElementsByTagName("body")[0].innerHTML
console.log("beforeMount",this.myName,bobyDom);
},
})
script>
html>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="app">
{{myName}}
div>
body>
<script src="../js/vue2.7.js">script>
<script>
var app = new Vue({
el:"#app",
data(){
return{
myName:"abc"
}
},
mounted(){
var bobyDom = document.getElementsByTagName("body")[0].innerHTML
// 数据已经渲染到View中
console.log("mounted",this.myName,bobyDom);
},
})
script>
html>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="app">
{{myName}}
div>
body>
<script src="../js/vue2.7.js">script>
<script>
var app = new Vue({
el:"#app",
data(){
return{
myName:"abc"
}
},
beforeUpdate(){
var bobyDom = document.getElementsByTagName("body")[0].innerHTML
// 数据更新前,数据未改变
console.log("beforeUpdate",this.myName,bobyDom);
},
})
script>
html>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="app">
{{myName}}
div>
body>
<script src="../js/vue2.7.js">script>
<script>
var app = new Vue({
el:"#app",
data(){
return{
myName:"abc"
}
},
updated(){
var bobyDom = document.getElementsByTagName("body")[0].innerHTML
// 数据更新后,数据已改变
console.log("updated",this.myName,bobyDom);
}
})
script>
html>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="app">
<div>
<input type="text" v-model="searchInput" name="" id="">
<button @click="paixu(1)">升序button>
<button @click="paixu(2)">降序button>
<button @click="paixu(3)">原序列button>
<div v-for="(item,index) in searchList">
{{item.name}}--{{item.price}}
div>
div>
div>
body>
<script src="../js/vue2.7.js">script>
<script>
var app = new Vue({
el:'#app',
data(){
return{
keyword:0, // 用来排序
searchInput:"",
goodList:[
{name:'牛仔裤',price:200},
{name:'运动鞋',price:100},
{name:'跑步鞋',price:300},
{name:'篮球鞋',price:400},
],
}
},
methods:{
paixu(val){
this.keyword=val
}
},
computed:{
searchList(){
// 把goodList的内容过滤,把符合条件的形成一个新的数组
// filter是数字的过滤方法,这个方法的参数是一个函数,此函数返回true,则把此项返回新的数组中
let list = this.goodList.filter((item)=>{
return item.name.indexOf(this.searchInput)!==-1
})
if(this.keyword){
list.sort((a1,a2)=>{
return this.keyword === 1
? a1.price - a2.price
: a2.price - a1.price
})
}
return list
}
}
})
script>
html>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="app">
<div v-for="(attr,key) in person">
{{key}} -- {{attr}}
div>
div>
body>
<script src="../js/vue2.7.js">script>
<script>
var app = new Vue({
el:'#app',
data(){
return{
person:{
name:'张三',
sex:'男',
}
}
},
})
script>
html>
这样添加它没有没有跟对象一样封装有监测数据变化的getter、setter
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="app">
<div v-for="(attr,key) in person">
{{key}} -- {{attr}}
div>
div>
body>
<script src="../js/vue2.7.js">script>
<script>
var app = new Vue({
el:'#app',
data(){
return{
person:{
name:'张三',
sex:'男',
}
}
},
})
script>
html>
js
内存已经把数据的第一项数据修改了DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="app">
<div v-for="(attr,key) in person">
{{key}} -- {{attr}}
div>
<div>
<input type="text" v-model="searchInput" name="" id="">
<button @click="paixu(1)">升序button>
<button @click="paixu(2)">降序button>
<button @click="paixu(3)">原序列button>
<div v-for="(item,index) in searchList">
{{item.name}}--{{item.price}}
div>
div>
div>
body>
<script src="../js/vue2.7.js">script>
<script>
var app = new Vue({
el:'#app',
data(){
return{
keyword:0, // 用来排序
searchInput:"",
goodList:[
{name:'牛仔裤',price:200},
{name:'运动鞋',price:100},
{name:'跑步鞋',price:300},
{name:'篮球鞋',price:400},
],
person:{
name:'张三',
sex:'男',
}
}
},
methods:{
paixu(val){
this.keyword=val
}
},
computed:{
searchList(){
// 把goodList的内容过滤,把符合条件的形成一个新的数组
// filter是数字的过滤方法,这个方法的参数是一个函数,此函数返回true,则把此项返回新的数组中
let list = this.goodList.filter((item)=>{
return item.name.indexOf(this.searchInput)!==-1
})
if(this.keyword){
list.sort((a1,a2)=>{
return this.keyword === 1
? a1.price - a2.price
: a2.price - a1.price
})
}
return list
}
}
})
script>
html>
push() 向数组的末尾添加一个或更多元素,并返回新的长度。
pop() 删除数组的最后一个元素并返回删除的元素
shift() 删除并返回数组的第一个元素
unshift() 向数组的开头添加一个或更多元素,并返回新的长度。
splice() 从数组中添加或删除元素。
sort() 对数组的元素进行排序
reverse() 反转数组的元素顺序。
计算属性,方法名可以直接在对象中使用.这个属性是通过计算得出的。
这个方法中的任意属性改变,都会触发这个方法
使用场景:希望把一些计算的业务逻辑放在方法中,例如:全名计算、地址计算、购物车合计
下面的示例,我们使用了三种方式:
注意:推荐使用computed的方式。有缓存机制。在页面重复调用多次的情况下,只执行一次
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="app">
<div>
<input type="text" v-model="firstName" ><br>
<input type="text" v-model="lastName" ><br>
<input type="text" v-model="getFullName()" ><br>
<input type="text" v-model="fullNameReadOnly" ><br>
<input type="text" v-model="funName" ><br>
div>
div>
body>
<script src="../js/vue2.7.js">script>
<script>
var app = new Vue({
el:"#app",
data(){
return{
firstName:'科比',
lastName:'布莱恩特',
}
},
methods:{
getFullName(){
return this.firstName + "-" + this.lastName
}
},
computed:{
// 只读方式的简写
fullNameReadOnly(){
return this.firstName + "-" + this.lastName
},
funName:{
get(){
return this.firstName + "-" + this.lastName
},
set(value){
this.firstName = value.split("-")[0]
this.lastName = value.split("-")[1]
}
}
},
})
script>
html>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<div id="app">
div>
body>
<script src="../js/vue2.7.js">script>
<script>
var app = new Vue({
el:"#app",
data(){
return{
isSunny:true,
person:{
age:18,
name:'王导',
}
}
},
watch:{
// 表示要对isSunny这个属性进行监听
isSunny(newVal,oldVal){
console.log("改变了",oldVal,newVal);
},
// 深度监听可以用来监听整个对象的改变,但要慎重使用,因为消耗性能
person:{
deep:true,
handler(oldVal,newVal){
console.log("改变了",oldVal,newVal);
}
},
"person.name"(oldVal,newVal){
console.log("我也监听了");
}
}
})
script>
html>
送大家一句话: 世界上的好东西都是抢来的,只有弱者才会坐等分配