计算属性&侦听器和自定义指令
- 目标:
- 掌握计算属性的应用
- 掌握监听器的应用
- 掌握自定义指令的应用
计算属性
-
为什么需要计算属性?
(1)模板语法可以使用表达式,但是不便于实现复杂的业务逻辑功能,也不利于维护
- 如何对绑定的title倒序?
例子:(倒序)
或者:
(2)计算属性可以解决模板语法的缺点, 完成复杂的逻辑,便于代码维护。
-
计算属性的语法:
计算属性通过computed选项进行设置,以函数的方式实现业务功能,需要返回一个结果。
-
计算属性和方法的区别:
计算属性以来响应式属性,当响应式属性没有变化时,计算属性不会执行,而方法始终会执行。
例子:
-
计算属性的读写:
计算属性默认只有读取功能,如果需要写操作,需要定义set方法。
例子:(实现写入)
<body>
<div id="app">
<p>姓名:{{userName}}</p>
<button @click="userName='李四'">修改</button>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
firstName: "三",
lastName: "张"
},
methods: {
},
computed: {
userName: {
get() {
return this.lastName + this.firstName
},
set(value) {
this.lastName = value[0]
this.firstName = value[value.length - 1]
}
}
},
})
</script>
</body>
实际应用:案例一:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.0/vue.js"></script>
<title></title>
</head>
<body>
<div id="app">
search: <input type="text" name="" id="" v-model='age'>
<table border="1">
<tr>
<th>编号:</th>
<th>姓名:</th>
<th>年龄:</th>
</tr>
<tr v-for="student,index in searchStus ">
<td>{{index+1}}</td>
<td v-for="value in student">{{value}}</td>
</tr>
</table>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
age: 18,
students: [{
name: 'tom',
age: 20
}, {
name: 'jsck',
age: 23
}, {
name: 'alex',
age: 34
}, {
name: 'susan',
age: 50
}, {
name: 'Jone',
age: 40
}, ]
},
methods: {},
computed: {
searchStus() {
let newStus = []
for (let i = 0; i < this.students.length; i++) {
if (this.students[i].age > this.age) {
newStus.push(this.students[i])
}
}
return newStus
},
}
})
</script>
</body>
</html>
运行结果:(具有筛选功能)
注意:计算属性是同步操作,计算属性不支持异步请求
侦听器
- 侦听器的特性
- 侦听器是用来检测数据变化,从而添加自定义的业务逻辑代码
- 侦听器可以监测计算属性和非计算属性
- 侦听器可以实现比较复杂的逻辑,而计算属性一般用于简单的逻辑代码
- 侦听器可以执行异步操作,而计算属性是同步执行
- 侦听器的性能方面比不上计算属性
- 侦听器的语法
- 通过watch选项设置侦听器
例子:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.0/vue.js"></script>
<title></title>
</head>
<body>
<div id="app">
<p>{{title}}</p>
<button @click="title = 'hello'">修改属性</button>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
title: 'this is Vue'
},
watch: {
title: function(val, oldVal) {
console.log("原值:", oldVal)
console.log("修改后值:", val)
}
}
})
</script>
</body>
</html>
运行结果:
- 高级侦听器
- 深度侦听器
- 层次侦听器
- 多重侦听器
例子:
多重侦听:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.0/vue.js"></script>
<title></title>
</head>
<body>
<div id="app">
<p>{{title}}</p>
<p>电话:{{user.phone.home}}</p>
<button @click="user.phone.home = '045222222222'">修改属性</button>
<button @click="title = 'hello'">修改title属性</button>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
title: 'This is Vue',
user: {
name: 'tom',
age: 18,
phone: {
home: '04521111111',
selfPhone: '12345678901'
}
}
},
watch: {
user: {
handler: function(val, oldVal) {
console.log("原值:", oldVal)
},
//是否深度追踪
deep: true
},
//多重侦听器
title: [
function watch1(val, oldVal) {
console.log("原值:", oldVal)
console.log("新值:", val)
},
function watch2(val, oldVal) {
console.log("原值:", oldVal)
console.log("新值:", val)
}
]
}
})
</script>
</body>
</html>
运行结果:
**深度侦听:**
- Vue响应工作原理
自定义指令
- 全局指令
- 通过directive创建全局指令
- 指令对象的钩子函数
- bind
- inserted
- update
- componentUpdated
- unbind
例子:(完整版)
- 简化指令
- 简化指令的语法:
例子:(简化版)
- 局部指令
- 通过directive选项设置局部指令
- 指令对象钩子函数的参数
- el
- binding
a. name
b. value
c. expression
d. modifiers
例子:
输出结果为data中定义的title:this is Vue