computed
我们希望一个变量是经过某种计算然后输出而不是直接输出的时候可以使用到计算属性
<div>{{total}}</div>
computed: {
total() {
return this.a + this.b
}
}
1. 在双大括号中直接使用表达式获取结果
<div id="example"> {{ message.split('').reverse().join('') }} </div>
2. 在Vue定义参数中添加computed属性,或者是在methods中添加方法
<div id="example">
<p>Computed reversed message: {{ reversedMessage }}</p>
<p> {{reversedMessageMethod() }}</p>
</div>
computed: {
// 计算属性的 getter
reversedMessage: function(){return this.message.split(‘’).reverse().join(‘’) } }
methods: {
// 计算属性的 getter
reversedMessageMethod: function(){return this.message.split(‘’).reverse().join(‘’) } }
计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值。而每次调用函数都会导致函数的重新执行。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../js/vue.js"></script>
</head>
<body>
<div id="app">
a:<input type="text" v-model.number="a"><br>
b:<input type="text" v-model.number="b"><br>
<output>{{total}}</output>
</div>
<script>
let vm = new Vue({
el: "#app",
data: {
a: null,
b: null
},
computed: {
total() {
return this.a + this.b
}
},
methods: {
},
created() {
}
})
</script>
</body>
</html>
watch
watch: {
// 基本数据类型
a(newVal, oldVal) {},
// 引用数据类型(如果用普通监听,只能监听到引用地址的改变)
obj: {
handler(newVal, oldVal) {},
deep: true
}
}
当需要在数据变化时执行异步或开销较大的操作时,使用监听器是最有用的
watch: {
// 如果`question`发生改变,这个函数就会运行这里如果question是引用类型,只有当引用地址发生变化才能被监测
question: function (newQuestion, oldQuestion) {
this.answer = 'Waiting for you to stop typing...'
},
// deep为true表示深度监听,如果question为对象,deep表示question内部属性值变化也可以监听到
question: {
handler:function (newQuestion, oldQuestion) {
this.answer = 'Waiting for you to stop typing...'
} ,
deep:true
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../js/vue.js"></script>
</head>
<body>
<div id="app">
a:<input type="text" v-model.number="a"><br>
b:<input type="text" v-model.number="b"><br>
<output>{{total}}</output>
<button @click="btnClickHandler">修改obj</button>
</div>
<script>
let vm = new Vue({
el: "#app",
data: {
a: null,
b: null,
total: 0,
obj: {
username: 'admin1'
}
},
watch: {
a(newVal, oldVal) {
this.total = this.a + this.b
},
b(newVal, oldVal) {
this.total = this.a + this.b
},
// obj() {
// // 普通监听形式,只能监听到引用数据类型引用地址的改变
// console.log('watch', this.obj);
// },
obj: {
handler(newVal, oldVal) {
console.log(newVal);
console.log(oldVal);
},
deep: true
}
},
methods: {
btnClickHandler() {
this.obj = {
username: 'zhangsan'
}
// this.obj.username = 'zhangsan'
// console.log(this.obj);
// this.obj = {}
}
},
created() {
}
})
</script>
</body>
</html>