// dom
<span>{{obj.a}}</span>
<button @click="changeA">click me</button>
data() {
return {
name: 'a'
};
},
watch: {
name: function(value,oldValue) {
console.log(value, oldValue);
}
},
methods: {
changeA() {
this.name = this.name + 'a';
},
},
然而,当我们监听的数据是比较深层次,比如要监听的数据是一个对象,就需要用到deep这个属性,属性默认为false;
我之前比较有误解的地方就是,总是会以为如果监听的数据如果是在一个对象中,就要使用deep;
要切记,‘深层次’讲的是要监听的数据的值层次深,而不是数据本身处于一个比较深的位置
data(){
return {
obj: {
a: 'a'
}
}
},
watch: {
obj: {
deep: true,
handler: function () {
console.log( 'a:'+ this.obj.a );
}
}
},
methods: {
changeA: function () {
this.obj.a += 'a';
}
}
情形一:time变化可以被子路由页监听到
//DOM
<DatePicker.RangePicker
allowClear={false}
size='large'
onChange={this.dateOnChange}
locale={locale}
defaultValue={[moment(this.time.startTime), moment(this.time.endTime)]}
ranges={{
'今天': [moment(), moment()],
'当月': [moment().startOf('month'), moment().endOf('month')],
'上个月': [moment().month(moment().month() - 1).startOf('month'), moment().month(moment().month() - 1).endOf('month')],
'当前季度': [moment().startOf('quarter'), moment().endOf('quarter')],
'上个季度': [moment().quarter(moment().quarter() - 1).startOf('quarter'), moment().quarter(moment().quarter() - 1).endOf('quarter')]
}} suffixIcon={
<Icon type='calendar' style='font-size:20px;margin-top:-10px;' />
}/>
<router-view
time={{
startTime: moment(`${this.time.startTime} 00:00:00`).valueOf(),
endTime: moment(`${this.time.endTime} 23:59:59`).valueOf(),
}}
/>
// js
data () {
return {
time: {
endTime: moment(new Date()).format(dateFormat),
startTime: moment().startOf('month').format(dateFormat)
}
}
},
methods: {
dateOnChange (date) { // 日期改变时
this.time.startTime = date[0].format(dateFormat)
this.time.endTime = date[1].format(dateFormat)
},
},
// 子路由页接收time,可以监听time的变化
watch: {
time (newVal, oldVal) {
this.params.pageIndex = 1
this.params.endTime = newVal.endTime
this.params.startTime = newVal.startTime
}
},
情形二:time变化子路由页监听不到
//DOM
<DatePicker.RangePicker
allowClear={false}
size='large'
onChange={this.dateOnChange}
locale={locale}
defaultValue={[moment(this.time.startTime), moment(this.time.endTime)]}
ranges={{
'今天': [moment(), moment()],
'当月': [moment().startOf('month'), moment().endOf('month')],
'上个月': [moment().month(moment().month() - 1).startOf('month'), moment().month(moment().month() - 1).endOf('month')],
'当前季度': [moment().startOf('quarter'), moment().endOf('quarter')],
'上个季度': [moment().quarter(moment().quarter() - 1).startOf('quarter'), moment().quarter(moment().quarter() - 1).endOf('quarter')]
}} suffixIcon={
<Icon type='calendar' style='font-size:20px;margin-top:-10px;' />
}/>
<router-view time={this.time} />
// js
data () {
return {
time: { // 初始time是时间戳
endTime: moment(new Date()).valueOf(),
startTime: moment().startOf('month').valueOf()
}
}
},
methods: {
// 日期控件改变时,处理成后台需要的时间戳
dateOnChange (date) {
this.time.startTime = moment(`${date[0].format(dateFormat)} 00:00:00`).valueOf()
this.time.endTime = moment(`${date[1].format(dateFormat)} 23:59:59`).valueOf()
},
},
// 子路由页接收time,可以监听time的变化
watch: {
time (newVal, oldVal) {
this.params.pageIndex = 1
this.params.endTime = newVal.endTime
this.params.startTime = newVal.startTime
}
},
子路由改为deep才可以,为什么之前不用deep都可以:
time: {
deep: true,
handler: function (newVal, oldVal) {
this.params.pageIndex = 1
this.params.endTime = newVal.endTime
this.params.startTime = newVal.startTime
}
}
为什么要注销 watch?因为我们的组件是经常要被销毁的,比如我们跳一个路由,从一个页面跳到另外一个页面,那么原来的页面的 watch 其实就没用了,这时候我们应该注销掉原来页面的 watch 的,不然的话可能会导致内置溢出
vue中使用了watch侦听属性用来监听和响应 Vue实例上的数据变动.下面的代码展示的是watch属性的完整用法,在工作中发现可以根据不同的情况使用watch属性有三种不同的写法
这个属性用来监视某个数据的变化,并触发相应的回调函数执行,添加watch属性,值为一个对象。对象的属性名就是要监视的数据,属性值为回调函数,每当这个属性名对应的值发生变化
在基于vue框架的前端项目开发过程中,只要涉及到稍微复杂一点的业务,我们都会用到computed计算属性这个钩子函数,可以用于一些状态的结合处理和缓存的操作。
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!