跳到主要内容

自定义页面延迟触发(防抖 Debounce)

本案例来自三方开发者「Peng」

1. 使用场景

本例介绍一下在宜搭自定义页面中如何实现延迟触发。

input 输入数据时请求服务器等,防止触发限流。

文档来源:防抖 Debounce

2. 原理

在事件被触发n秒后,再去执行回调函数。如果n秒内该事件被重新触发,则重新计时。结果就是将频繁触发的事件合并为一次,且在最后执行。

例如:

电梯5秒后会关门开始运作,如果有人进来,等待5秒,5秒之内又有人进来,5秒等待重新计时...直至超过5秒,电梯才开始运作。

3. 实现功能

3.1 函数配置

(1)配置变量

(2)配置防抖函数

if (this.state.debounceTimer) {
clearTimeout(this.state.debounceTimer);
};
const debounceTimer = setTimeout(() => {
// 需要防抖处理的业务逻辑从此往下写
// your code ...
this.setState({
debounceTimer: null,
});
}, 500);
this.setState({
debounceTimer,
});

3.3 使用示例

(1)创建自定义页面

(2)无防抖示例

export function onChangeWithoutDebounce({ value }) {
const textareaField_l9qggl4g = this.$("textareaField_l9qggl4g");
textareaField_l9qggl4g.setValue(textareaField_l9qggl4g.getValue() + value + '\n');
}

(3)有防抖示例

export function onChangeWithDebounce({ value }) {
if (this.state.debounceTimer) {
clearTimeout(this.state.debounceTimer);
};
const debounceTimer = setTimeout(() => {
// 需要防抖处理的业务逻辑从此往下写
// your code ...
const textareaField_l9qggl4i = this.$("textareaField_l9qggl4i");
textareaField_l9qggl4i.setValue(textareaField_l9qggl4i.getValue() + value + '\n');
this.setState({
debounceTimer: null,
});
}, 500);
this.setState({
debounceTimer,
});
}

4. 实现效果

4.1 无防抖

可见无防抖长按输入了多次。

4.2 有防抖

可见有防抖长按只输入了一次。

5. 防抖应用案例在线试玩

下拉选择配置实时搜索表单数据

6. 在线试玩

Copyright © 2024钉钉(中国)信息技术有限公司和/或其关联公司浙ICP备18037475号-4