- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个 Vue 组件,它使用多个子组件。在这些子组件上,我有一个观察者来观察数据变化并处理这些变化。我想为此实现去抖。
watch: {
data: {
handler: function () {
this.processData()
},
deep: true
}
},
methods: {
processData: debounce(function () {
console.log(this.id)
}, 250),
问题是 debounce 起作用,所以它只在最后一个子组件上执行。
我找到了一个接受额外 ID debounceWithId 的去抖功能解决方案
但是问题是,如果我按如下方式指定此函数:
methods: {
processData: debounceWithId(function () {
console.log(this.id)
}, 250, this.id),
最后一个 this.id 是未定义的。
在多个组件中使用 debounce 以便函数在每个组件上单独触发的正确方法是什么?
最佳答案
首先让我添加一个示例来复制您所描述的问题。
console.clear()
function debounce(func, wait, immediate) {
var timeout;
return function() {
console.log("Called from component ", this._uid)
var context = this, args = arguments;
var later = function() {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
};
Vue.component("doesntwork",{
props:["value"],
template:`<div>Component #{{_uid}} Value: {{innerValue}}</div>`,
data(){
return {
innerValue: this.value
}
},
watch:{
value(newVal){
this.processData(newVal)
}
},
methods:{
processData: debounce(function(newVal){
this.innerValue = newVal
}, 1000)
},
})
new Vue({
el: "#app",
data:{
parentValue: null,
}
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
<script src="https://unpkg.com/vue@2.4.2"></script>
<div id="app">
Type some text. Wait one second. Only the *last* component is updated.<br>
<input type="text" v-model="parentValue">
<doesntwork :value="parentValue"></doesntwork>
<doesntwork :value="parentValue"></doesntwork>
<doesntwork :value="parentValue"></doesntwork>
</div>
本质上,这里发生的事情是在编译组件时创建 debounced 函数,并且组件的每个实例共享相同 debounced 函数。 this
的上下文在每一个中都会不同,但它是相同的功能。我在生成的 debounced 函数中添加了一个 console.log
,这样您就可以看到所有三个组件都共享相同的函数。在这种情况下,该功能正在执行其设计目的;它在经过一段时间后执行一次,这就是为什么只更新最后一个组件的原因。
要避免这种行为,您需要为每个组件独特 去抖功能。您可以通过以下两种方式做到这一点。
方法一
您可以使用占位符来初始化您的 processData 方法。
methods: {
processData(){}
}
然后,在创建的生命周期事件中,将 processData 方法更改为 debounced 方法。
created(){
this.processData = debounce(function(){
console.log(this.id)
}, 250)
}
这将为每个组件提供一个独特的去抖功能,并且应该解决只有最后一个组件正常工作的问题。
这是一个从上面的例子修改而来的例子。
console.clear()
Vue.component("works",{
props:["value"],
template:`<div>Component #{{_uid}} Value: {{innerValue}}</div>`,
data(){
return {
innerValue: this.value,
}
},
watch:{
value(newVal){
this.processData(newVal)
}
},
methods:{
processData() {}
},
created(){
this.processData = _.debounce(function(newVal){
this.innerValue = newVal
}, 1000)
}
})
new Vue({
el: "#app",
data:{
parentValue: null,
}
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
<script src="https://unpkg.com/vue@2.4.2"></script>
<div id="app">
Type some text. Wait one second. <em>All</em> components are updated.<br>
<input type="text" v-model="parentValue">
<works :value="parentValue"></works>
<works :value="parentValue"></works>
<works :value="parentValue"></works>
</div>
方法二
感谢@RoyJ 的建议。您可以在 data
中定义 processData
方法。通常你不这样做是因为你不经常想要一个函数的多个副本,这就是组件定义的methods
部分存在的原因,但在某些情况下,像这样您需要每个组件的唯一函数,您可以在数据函数中定义方法,因为数据函数会为组件的每个实例调用。 p>
data(){
return {
innerValue: this.value,
processData: _.debounce(function(newVal){
this.innerValue = newVal
}, 1000)
}
},
这是使用该方法的示例。
console.clear()
Vue.component("works",{
props:["value"],
template:`<div>Component #{{_uid}} Value: {{innerValue}}</div>`,
data(){
return {
innerValue: this.value,
processData: _.debounce(function(newVal){
this.innerValue = newVal
}, 1000)
}
},
watch:{
value(newVal){
this.processData(newVal)
}
},
})
new Vue({
el: "#app",
data:{
parentValue: null,
}
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
<script src="https://unpkg.com/vue@2.4.2"></script>
<div id="app">
Type some text. Wait one second. <em>All</em> components are updated.<br>
<input type="text" v-model="parentValue">
<works :value="parentValue"></works>
<works :value="parentValue"></works>
<works :value="parentValue"></works>
</div>
关于vue.js - VueJS 2 在多个组件上去抖动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45908853/
我构建了一个没有修饰的 Java Swing 对话框。我已经通过 MouseListener 和 MouseMotionListener 接口(interface)使用拖放实现了对话框移动。 但是,在
我在 Linux 2.6 上使用 clock_gettime()(来自 time.h)来控制线程循环中的计时。我需要在 +/- 5mS 时间范围内有 500mS。它似乎给了我 500 毫秒,然后开始漂
有没有办法抖动 geom_line() 中的线条? ?我知道这有点违背了这个情节的目的,但是如果你有一个只有几行的情节并且希望他们都展示它可能会很方便。也许有一些其他解决方案可以解决这个可见性问题。
所以我有一些物体(我可以在运行时创建越来越多的物体),我需要它们被磁化到屏幕中心。让它在世界空间中为 (480/2/WORLD_SCALE, 320/2/WORLD_SCALE)。我是 box2d 的
我终于制作了一个可以按照我想要的方式运行的股票代码,但现在唯一的问题是它看起来有点不稳定,看起来像是在旧电视上显示的。如何让它看起来更平滑? 这是我的代码: import java.awt.Color
所以我的游戏几乎完成了...但是当我将手指按住屏幕时会出现这种小故障或抖动,现在我已经注意到了,我无法不注意到... 它发生得非常快,并且只有在调用一个函数来处理点击和按住(长按)时才会发生。这会在使
我接手了一个半成品的网站开发,这个网站上有一些使用jquery 1.3.2的 slider 。突然间,今天,我第一次看到 slider 在到达内容末尾时摇晃。这是带有问题 slider 的站点: ht
正如您从下面的屏幕截图中看到的那样,“标题栏”在带有文本的区域中出现了这些丑陋的 strip ,这些 strip 延伸了整个屏幕的宽度。它在真实设备上更加明显。 有什么办法可以解决这个问题吗? 最佳答
我创建了一个 UICollectionView 并希望所有单元格都像 iPhone 上跳板的编辑模式一样摇动。我已经创建了我的 shake 代码,但不知道如何实现它。我有自定义单元格,所以我假设它在那
我正在尝试将列表传递给有状态小部件的构造函数,但是在 main.dart 中添加小部件时,它不需要任何参数。 class Appointments extends StatefulWidget {
我最初在 gamedev 上问过这个问题,但没有一个答案有助于解决问题,我仍然不知道真正的原因是什么。我在常见问题解答中没有看到任何关于在 SE 中重新发布问题的内容,所以我只能希望这没问题。此外,回
我的数据看起来像这样: df1 <- structure( list( y = c(-0.19, 0.3,-0.05, 0.15,-0.05, 0.15), lb
我目前的工作需要在 Intel Core 系列的 CPU 上生成指定数量的 TLB 未命中,但进展并不顺利。我尝试了很多方法,但所有方法的 TLB 命中率都非常高。有谁知道一些关于 x86 TLB 如
我知道有一种方法可以将图像转换为 Icon通过 ImageIcon .但我正在使用 FancyBottomNavigation这是必需的 TabData具有参数 iconData类型 IconData
我想像在js中的示例一样实现视频到 Canvas 应用程序:http://jsfiddle.net/Ls9kfwot/2/ 但是我的问题是如何在特定区域拍摄视频播放器的屏幕截图? 就像drawImag
如果 onTap: changeName, void changeName() { setState(() { name = "Your own codes"; }
我正在尝试为从api中获取的list实现延迟加载。我为ListView实现了一个侦听器,以检查它何时到达底部。我在这里的问题是: 1)如何为列表设置初始加载项数? 2)如何在调用loadMore()方
我正在使用流从REST API检索数据,但是当数据库中的数据更新时,流不会刷新应用程序中的数据。 StreamController _productsController = new StreamCo
我还没有看到这个问题在 SO 中被提及,所以就这样吧。我有一个搜索栏,可以防止搜索超出次要进度(在本例中为音乐缓冲)。假设这首歌长 5 分钟,已缓冲 4 分钟,并且正在一分钟标记处播放。当我去拖动
我的应用程序基于 GPS 数据,为此我使用了 Fused-location-provider。从现在开始,我看到有一个 gps 抖动,一些 GPS 坐标偏离了道路。这是无法接受的。我试图做的是实现 K
我是一名优秀的程序员,十分优秀!