在 vuejs2 的 vnode 上下文中销毁 watch

Posted

技术标签:

【中文标题】在 vuejs2 的 vnode 上下文中销毁 watch【英文标题】:destroy watch in vnode context in vuejs2 【发布时间】:2019-08-05 04:22:04 【问题描述】:

在指令绑定方法中,有一个vnode.context.$watch,并且每次该指令添加到html中,它也会在之前的观察者中添加另一个观察者。因为同样的观察者不止一次打电话。

指令解除绑定方法调用时,有什么办法可以销毁之前的观察者。

Vue.directive("dynamic-lookup", 
    bind: function (el, binding, vnode)         
        let dependency = setValue("dynamic-lookup-dependency");       
        if (dependency) 
            vnode.context.$watch(dependency, function (newVal, oldVal)  ); );
        
    ,
    unbind: function(el, binding, vnode) 
        console.log("unbind");
    
);

【问题讨论】:

【参考方案1】:

根据documentation,$watch 函数本身返回 unwatch 函数。您可以将返回的函数保存在 vnode.context 中,并在指令 unbind 挂钩中调用此函数,如下所示:

Vue.directive("dynamic-lookup", 
    bind: function (el, binding, vnode) 
        let unwatch = vnode.context.$watch(vnode.context.property, function (newVal, oldVal)  
                //Do something
            ); 
        );
        if(!vnode.context['unwatch'])
            vnode.context['unwatch'] = unwatch;
    ,
    unbind: function(el, binding, vnode) 
        vnode.context.unwatch();
    
);

【讨论】:

【参考方案2】:

我认为您可以随时取消关注您的依赖关系。

文档vm.$watch 返回一个停止触发回调的未观察function:https://vuejs.org/v2/api/#vm-watch

var unwatch = vnode.context.$watch(dependency, function (newVal, oldVal) 
);
// later, teardown the watcher
unwatch()

【讨论】:

有什么方法可以在 unbind 方法中调用 unwatch 吗? 也许试试这个:this.unbind.unwatchDependency = ...;并在 unbind 中:this.unwatchDependency();

以上是关于在 vuejs2 的 vnode 上下文中销毁 watch的主要内容,如果未能解决你的问题,请参考以下文章

vue 指令---气泡提示(手撸实战)

Runtime API 何时销毁主 CUDA 上下文?

c语言的 dup函数

你可以在 Vue 模板中渲染 VNode 吗?

更改 vuejs2 中的道具值

HistoryRecord 的销毁超时