Vue——认识day05_监视属性
目录
1.天气案例介绍以及初步实现
2.监视属性天气案例的实现
3.深度监视
4.监视的简写形式
5.姓名案例的监视属性实现
6.watch和computed对比
1.天气案例介绍以及初步实现
这段代码实现了一个简单的天气选择功能。页面中有一个标题和一个按钮,点击按钮可以切换天气的显示。默认显示晴天,点击按钮后会切换到雨天,并在副标题中显示当前选择的天气。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>天气案例</title>
<script type="text/javascript" src="../js/vue.js"></script>
</head>
</head>
<body>
<body>
<div id="root">
<h1>你是喜欢晴天还是雨天</h1>
<h2>我喜欢{{weatherInfo}}天</h2>
<button @click="changeWeather">切换天气</button>
<!-- <button @click="weather = !weather">切换天气</button> -->
</div>
</body>
<script type="text/javascript">
Vue.config.productionTip=false
new Vue({
el:'#root',
data:{
// true代表为晴天晴天,否则为雨天
weather:true
},
computed:{
weatherInfo(){
return this.weather?'晴':'雨'
}
},
methods: {
changeWeather(){
this.weather = !this.weather
}
},
});
</script>
</html>
2.监视属性天气案例的实现
监视属性watch:
- 当被监视的属性变化时,回调函数会自动调用,可以在回调函数中进行相关操作。
- 要进行监视的属性必须存在,才能进行监视。
- 监视属性有两种写法: (1) 在创建Vue实例时传入watch配置对象,其中键是被监视的属性名称,值是对应的回调函数。 (2) 通过
vm.$watch
方法来监视属性,需要传入被监视的属性名称和回调函数。
代码示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>天气案例</title>
<script type="text/javascript" src="../js/vue.js"></script>
</head>
</head>
<body>
<body>
<div id="root">
<h1>你是喜欢晴天还是雨天</h1>
<h2>我喜欢{{weatherInfo}}天</h2>
<button @click="changeWeather">切换天气</button>
</div>
</body>
<script type="text/javascript">
Vue.config.productionTip=false
const vm = new Vue({
el:'#root',
data:{
// true代表为晴天晴天,否则为雨天
weather:true
},
// 监视属性
watch:{
weather:{
// 初始化时让handler被触发
immediate:true,
// 当weather发生改变的时候被调用
handler(newValue,oldValue){
console.log('weather:',oldValue,'被修改为了',newValue)
}
}
},
computed:{
weatherInfo(){
return this.weather?'晴':'雨'
}
},
methods: {
changeWeather(){
this.weather = !this.weather
}
},
});
// 第二种实现监视的方法
/* vm.$watch('weather',{
// 初始化时让handler被触发
immediate:true,
// 当weather发生改变的时候被调用
handler(newValue,oldValue){
console.log('weather:',oldValue,'被修改为了',newValue)
}
}) */
</script>
</html>
3.深度监视
深度监视是指在Vue中使用watch来监测对象内部值的改变。默认情况下,Vue的watch只会监测对象的第一层属性变化。但是可以通过配置deep:true
来实现对对象内部值的多层监测。需要注意的是,Vue自身是可以监测对象内部值的改变的,但是Vue提供的watch默认是不会进行深度监视的。在使用watch时,根据数据的具体结构决定是否需要采用深度监视。
代码示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>天气案例</title>
<script type="text/javascript" src="../js/vue.js"></script>
</head>
</head>
<body>
<body>
<div id="root">
<h1>你是喜欢晴天还是雨天</h1>
<h2>我喜欢{{weatherInfo}}天</h2>
<button @click="iLikeYou">心中的秘密</button>
<button @click="changeWeather">切换天气</button>
<hr>
<h3>a:{{numbers.a}}</h3>
<button @click="numbers.a++">点我a+1</button>
<br>
<h3>b:{{numbers.b}}</h3>
<button @click="numbers.b++">点我b+1</button>
</div>
</body>
<script type="text/javascript">
Vue.config.productionTip=false
const vm = new Vue({
el:'#root',
data:{
// true代表为晴天晴天,否则为雨天
weather:true,
numbers:{
a:1,
b:1
}
},
// 监视属性
watch:{
weather:{
// 初始化时让handler被触发
// immediate:true,
// 当weather发生改变的时候被调用
handler(newValue,oldValue){
console.log('weather:',oldValue,'被修改为了',newValue)
}
},
// 监视多级结构某个属性的变化
/* 'numbers.a':{
handler(){
console.log('a改变了')
}
} */
numbers:{
// 开启即可监视多级结构中所有属性的变化
deep:true,
handler(){
console.log('numbers改变了')
}
}
},
computed:{
// 计算属性
weatherInfo(){
return this.weather?'晴':'雨'
}
},
methods: {
changeWeather(){
this.weather = !this.weather
},
iLikeYou(){
alert('我喜欢你(๑′ᴗ‵๑)I Lᵒᵛᵉᵧₒᵤ❤')
}
},
});
// 第二种实现监视的方法
/* vm.$watch('weather',{
// 初始化时让handler被触发
immediate:true,
// 当weather发生改变的时候被调用
handler(newValue,oldValue){
console.log('weather:',oldValue,'被修改为了',newValue)
}
}) */
</script>
</html>
4.监视的简写形式
具体如代码中所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>天气案例</title>
<script type="text/javascript" src="../js/vue.js"></script>
</head>
</head>
<body>
<body>
<div id="root">
<h1>你是喜欢晴天还是雨天</h1>
<h2>我喜欢{{weatherInfo}}天</h2>
<button @click="iLikeYou">心中的秘密</button>
<button @click="changeWeather">切换天气</button>
</div>
</body>
<script type="text/javascript">
Vue.config.productionTip=false
const vm = new Vue({
el:'#root',
data:{
// true代表为晴天晴天,否则为雨天
weather:true,
},
// 监视属性
watch:{
// 正常写法
/* weather:{
// 初始化时让handler被触发
// immediate:true,
// 深度监视
// deep:true,
handler(newValue,oldValue){
console.log('weather:',oldValue,'被修改为了',newValue)
}
}, */
// 简写的前提就是没有其他的配置项
/* weather(newValue,oldValue){
console.log('weather:',oldValue,'被修改为了',newValue)
} */
},
computed:{
// 计算属性
weatherInfo(){
return this.weather?'晴':'雨'
}
},
methods: {
changeWeather(){
this.weather = !this.weather
},
iLikeYou(){
alert('我喜欢你(๑′ᴗ‵๑)I Lᵒᵛᵉᵧₒᵤ❤')
}
},
});
// 第二种实现监视的方法,完整写法
/* vm.$watch('weather',{
// 初始化时让handler被触发
immediate:true,
// 当weather发生改变的时候被调用
handler(newValue,oldValue){
console.log('weather:',oldValue,'被修改为了',newValue)
}
}) */
// 简写
vm.$watch('weather',function(newValue,oldValue){
console.log('weather:',oldValue,'被修改为了',newValue)
})
</script>
</html>
5.姓名案例的监视属性实现
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>姓名案例_监视属性实现</title>
<script type="text/javascript" src="../js/vue.js"></script>
</head>
</head>
<body>
<div id="root">
姓:<input type="text" v-model="firstName">
<br><br>
名:<input type="text" v-model="lastName">
<br><br>
全名:<span>{{fullName}}</span>
<br><br>
</div>
</div>
</body>
<script type="text/javascript">
Vue.config.productionTip=false
const vm = new Vue({
el:'#root',
data:{
firstName:'W',
lastName:'J',
fullName:'W-J'
},
// 计算属性
computed:{
},
// 监视属性
watch:{
firstName:{
handler(newFirstName){
this.fullName = newFirstName + '-' + this.fullName.split('-')[1]
}
},
lastName:{
handler(newLastName){
this.fullName = this.firstName + '-' + newLastName
}
}
}
});
</script>
</html>
6.watch和computed对比
computed和watch在功能上有一些相似之处,但也有一些区别。首先,computed可以完成watch的功能,但是watch能完成的功能,computed不一定能完成。例如,watch可以进行异步操作,而computed不适合进行异步操作。
另外,有两个重要的原则需要注意:
- 对于被Vue所管理的函数,最好写成普通函数,这样函数内部的this指向的是Vue实例对象或组件实例对象。
- 对于不被Vue所管理的函数,比如定时器的回调函数、ajax的回调函数、Promise的回调函数等,最好写成箭头函数,这样函数内部的this指向的也是Vue实例对象或组件实例对象。
这样可以确保在函数中使用this时,能够正确地指向Vue实例对象或组件实例对象。