vue.js - 如何使 debounce 函数独立作用于 Vue.js 上同一组件的不同实例?
问题描述
我有两个 Vue 组件,在每次数据更改时都会调用“保存到磁盘”,它通过 mixin 加载到这些组件中,每个组件保存到不同的文件中,因此它们必须独立运行(仅触发去抖动重置它自己的数据变化)。防止过多写入磁盘。这是我的 debound 函数:
function debounce(fn, delay) {
var timeoutID = null;
return function () {
console.log("clearing " + timeoutID)
clearTimeout(timeoutID);
var args = arguments;
var that = this;
timeoutID = setTimeout(() => fn.apply(that, args), delay);
};
}
这是组件继承的 mixin 上的方法:
methods: {
saveData: debounce(function(){
console.log('saving widget: ' + this.$parent.widget.id);
this.saver.store = this.persisted;
}, 5000),
},
当我在一个或另一个组件上更改数据时效果很好,但是当我在一个或另一个组件上更改数据并且在去抖动结束之前我更改另一个时,它会从第一个组件中取消我的去抖动功能,并且只保存第二个组件数据.
我在这里想念什么?
解决方案
这是因为每个组件实例共享相同的去抖函数,只有上下文 ( this
, that
) 不同。
一个简单的解决方法是将您的去抖动实现更改为
function debounce(fn, delay) {
var thatUidToTimeoutID = {};
return function () {
var args = arguments;
var that = this;
clearTimeout(thatUidToTimeoutID[that._uid]);
thatUidToTimeoutID[that._uid] = setTimeout(() => fn.apply(that, args), delay);
};
}
_uid
持有每个组件的唯一 id,它更像是一个内部属性(因此它是奇怪的键),但它应该足够好。
推荐阅读
- angular - Angular VideoJs VR 导入问题
- amazon-s3 - S3 上空键的存储成本是多少
- node.js - 节点 api 为所有路由添加 /api 前缀
- broadleaf-commerce - 通过 jar 部署 6.1
- python - conda activate env 切换到系统 python 路径而不是 env 路径
- r - 如何避免手机锁屏?r 闪亮
- html - 如何修复导航栏中的搜索图标位置使用?
- android - google-services.json 生成错误的 ios_info bundle_id 字符串
- c# - 检查对象是否为字典或字典联合类型
- c# - 使用 EF CORE 运行内联 SELECT 语句