如何使用vue.js中的$watch

JavaScript013

如何使用vue.js中的$watch,第1张

Vue.js 提供了一个方法 watch,它用于观察Vue实例上的数据变动。对应一个对象,键是观察表达式,值是对应回调。值也可以是方法名,或者是对象,包含选项。具体的用法可以直接看下面的示例,简单直接。

<span style="color:#006600"><div id="app">

<input type="text" v-model:value="childrens.name" />

<input type="text" v-model:value="lastName" />

</div>

<script type="text/javascript">

var vm = new Vue( {

el: '#app',

data: {

childrens: {

name: '小强',

age: 20,

sex: '男'

},

tdArray:["1","2"],

lastName:"张三"

},

watch:{

childrens:{

handler:function(val,oldval){

console.log(val.name)

},

deep:true//对象内部的属性监听,也叫深度监听

},

'childrens.name':function(val,oldval){

console.log(val+"aaa")

},//键路径必须加上引号

lastName:function(val,oldval){

console.log(this.lastName)

}

},//以V-model绑定数据时使用的数据变化监测

} )

vm.$watch("lastName",function(val,oldval){

console.log(val)

})//主动调用$watch方法来进行数据监测</span>

</script>

</body>

大家都知道,在vue.js中给我们提供了watch的方法来做对象变化的监听,而且在callback中会返回两个对象,分别是oldValue和newValue.

因为Object是引用类型,所以,如果你在vue中watch一个对象或者数组,那么你收到的新老值是一样的,

我们看下面的例子,组件有一个变量instanceInfo,是一个Object。

我们多次修改instanceInfo的name属性,只有第一次新老值不一致,后面多次修改新老对象竟然一致了。

这是因为watch并没有做缓存,遇到基础类型,还好说,遇到引用类型,就无法正确的获取oldVal了。

这时候我们要解决这个问题,就需要用到一个属性,就是computed是有缓存的这个特性。我们就需要借助computed来解决这个问题,

我们把instanceInfo通过在computed里面生成一个模拟变量,返回一个Object.assign新对象,注意一定是新对象,他有独立的引用。

然后我们watch这个在computed里面的tempObj,就可以监听新老值了。

当然,如果instanceInfo里面的某个属性,是引用类型,这种方法还需要,监听这个属性才能获取新老值。