建设部网站如何下载规范 标准,如何自己开发手机app,wordpress文章调用链接,包装回收网站建设类型#xff1a;{ [key: string]: string | Function | Object | Array }
详细#xff1a;
一个对象#xff0c;键是需要观察的表达式#xff0c;值是对应回调函数。值也可以是方法名#xff0c;或者包含选项的对象。Vue 实例将会在实例化时调用 $watch()#xff0c;遍…类型{ [key: string]: string | Function | Object | Array }
详细
一个对象键是需要观察的表达式值是对应回调函数。值也可以是方法名或者包含选项的对象。Vue 实例将会在实例化时调用 $watch()遍历 watch 对象的每一个 property。
示例
var vm new Vue({data: {a: 1,b: 2,c: 3,d: 4,e: {f: {g: 5}}},watch: {a: function (val, oldVal) {console.log(new: %s, old: %s, val, oldVal)},// 方法名b: someMethod,// 该回调会在任何被侦听的对象的 property 改变时被调用不论其被嵌套多深c: {handler: function (val, oldVal) { /* ... */ },deep: true},// 该回调将会在侦听开始之后被立即调用d: {handler: someMethod,immediate: true},// 你可以传入回调数组它们会被逐一调用e: [handle1,function handle2 (val, oldVal) { /* ... */ },{handler: function handle3 (val, oldVal) { /* ... */ },/* ... */}],// watch vm.e.fs value: {g: 5}e.f: function (val, oldVal) { /* ... */ }}
})
vm.a 2 // new: 2, old: 1注意不应该使用箭头函数来定义 watcher 函数 (例如 searchQuery: newValue this.updateAutocomplete(newValue))。理由是箭头函数绑定了父级作用域的上下文所以 this 将不会按照期望指向 Vue 实例this.updateAutocomplete 将是 undefined。 vm.$watch( expOrFn, callback, [options] )
参数
{string | Function} expOrFn{Function | Object} callback{Object} [options]{boolean} deep{boolean} immediate返回值{Function} unwatch
用法
观察 Vue 实例上的一个表达式或者一个函数计算结果的变化。回调函数得到的参数为新值和旧值。表达式只接受简单的键路径。对于更复杂的表达式用一个函数取代。 注意在变更 (不是替换) 对象或数组时旧值将与新值相同因为它们的引用指向同一个对象/数组。Vue 不会保留变更之前值的副本。 // 键路径
vm.$watch(a.b.c, function (newVal, oldVal) {// 做点什么
})// 函数
vm.$watch(function () {// 表达式 this.a this.b 每次得出一个不同的结果时// 处理函数都会被调用。// 这就像监听一个未被定义的计算属性return this.a this.b},function (newVal, oldVal) {// 做点什么}
)vm.$watch 返回一个取消观察函数用来停止触发回调
var unwatch vm.$watch(a, cb)
// 之后取消观察
unwatch()选项deep
为了发现对象内部值的变化可以在选项参数中指定 deep: true。注意监听数组的变更不需要这么做。
vm.$watch(someObject, callback, {deep: true
})
vm.someObject.nestedValue 123
// callback is fired选项immediate 在选项参数中指定 immediate: true 将立即以表达式的当前值触发回调
vm.$watch(a, callback, {immediate: true
})
// 立即以 a 的当前值触发回调注意在带有 immediate 选项时你不能在第一次回调时取消侦听给定的 property。
// 这会导致报错
var unwatch vm.$watch(value,function () {doSomething()unwatch()},{ immediate: true }
)如果你仍然希望在回调内部调用一个取消侦听的函数你应该先检查其函数的可用性
var unwatch vm.$watch(value,function () {doSomething()if (unwatch) {unwatch()}},{ immediate: true }
)当用户指定了 watch 中的deep属性为 true 时如果当前监控的值是数组类型。会对对象中的每一项进行求值此时 会将当前 watcher存入到对应属性的依赖中这样数组中对象发生变化时也会通知数据更新 watch 本质上是为每个监听属性 setter 创建了一个 watcher当被监听的属性更新时调用传入的回调函数。常见的配置选项有 deep 和 immediate对应原理如下 deep深度监听对象为对象的每一个属性创建一个 watcher从而确保对象的每一个属性更新时都会触发传入的回调函数。主要原因在于对象属于引用类型单个属性的更新并不会触发对象 setter因此引入 deep 能够很好地解决监听对象的问题。同时也会引入判断机制确保在多个属性更新时回调函数仅触发一次避免性能浪费。 immediate在初始化时直接调用回调函数可以通过在 created 阶段手动调用回调函数实现相同的效果 get () { pushTarget(this) // 先将当前依赖放到 Dep.target上 let value const vm this.vm try { value this.getter.call(vm, vm) } catch (e) { if (this.user) { handleError(e, vm, getter for watcher ${this.expression}) } else { throw e } } finally { if (this.deep) { // 如果需要深度监控 traverse(value) // 会对对象中的每一项取值,取值时会执行对应的get方法 }popTarget()
}