uniapp 输入框防抖节流_offer-1-防抖和节流

28553dd69fb75ce789d281ddd5a0259d.png

防抖和节流

防抖

定义:ns后执行x方法,如果在ns内多次调用x方法,那么n将会重新计时。

例子:用户在输入框内输入文字停止操作2s后进行搜索接口请求(如果输入一次就去请求一次对服务端压力很大也不符合常规逻辑)。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .inputClass {
            width: 200px;
            height: 30px;
        }
    </style>
</head>
<body>
    <h2>防抖和节流</h2>
    <input class="inputClass" id="search" type="text/javascript" placeholder="请输入搜索条件"/>
</body>
<script type="text/javascript">
    // fun函数x,wait等待ns
    var debounce = function(fun, wait) {
        // content记录执行上线文  timeId记录setTimeout的id args记录fun传递参数
        var content, timeId, args;

        var later = function() {
            // fun的执行上下文是content,参数是args
            fun.apply(content, args);
        }

        return function() {
            // 这里要记录this指向记录上下文,不然setTimeout执行时this指向window
            content = this;
            args = arguments;
            clearTimeout(timeId);
            timeId = -1;
            timeId = setTimeout(later, wait);
        }
    }

    document.getElementById('search').onkeyup = debounce(function(e) {
        console.log(`请求数据:${e.target.value}`);
    }, 2000);

</script>
</html>

节流

定义:ns内最多只触发一次x方法。当操作时间m < n时:有效触发操作为ms是的操作。 当操作时间m >= n时:有效操作为ns的操作
例子:当用户频繁操作window.onresize时候,规定2s内最多有一次可以生效

var throttle = function(fun, wait) {
        var content, timeId, args;
        var canThrottle = true;

        var later = function() {
            canThrottle = true;
            fun.apply(content, args);
        }

        return function() {
            content = this;
            args = arguments;
            if(canThrottle) {
                canThrottle = false;
                setTimeout(later, wait)
            }
        }
    }

    window.onscroll = throttle(function(e) {
        console.log(`发生scroll距离顶部高度:${e.target.documentElement.scrollTop}`);
    }, 2000);

防抖和节流不同点

防抖是只要调用了函数那么定时器就会重新计算时间。节流是在一段时间内无论你触发多少次最多只会有一次生效。
例子:
对于防抖:如果0.5s,1s,1.5s分别触发了x方法,那么防抖策略会以1.5s那个时间为基准重新开启一个定时器,2s后也就是3.5s的时候触发x方法。
对于节流:如果0.5s,1s,1.5s分别触发了x方法,那么节流策略会在2s的时候执行1.5s那个操作。
防抖和节流是一种策略,实现方式可以有很多,例如underscore.js都有这方面的实现。

总结

  1. 介绍了防抖和节流的概念
  2. 例举防抖和节流在实际中应用场景
  3. 防抖和节流的不同点
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UniApp输入框(`UI.input`)本身并不内置防抖节流功能,但你可以通过在事件处理程序中手动实现这两个概念来优化输入事件的响应。防抖节流是常见的性能优化技术,用于减少高频重复事件的执行次数,防止资源过度消耗。 **防抖(Debounce)**: - 防抖的目的是确保在一个输入停止后一段时间内,只执行一次特定的处理函数,比如发送网络请求。 - 当连续触发输入事件时,只有最后一次的事件会被处理,其余的会被忽略,直到输入暂停超过设定的时间(如200毫秒)。 **节流(Throttle)**: - 节流则是确保在一定时间内,最多执行某函数的指定次数,即使输入频繁触发。 - 它会在一定时间间隔(如500毫秒)内执行函数,如果在这段时间内又有新的输入事件,那么会取消之前正在执行的任务,等待下一次节流周期。 要实现这些效果,你可以在处理 `input` 事件的回调函数中使用 JavaScript 的内置方法,如下所示: ```javascript let timerId; const handleInput = (event) => { clearTimeout(timerId); timerId = setTimeout(() => { // 这里是你需要执行的处理逻辑,例如发送数据到后台 sendDataToServer(); }, 200); // 200毫秒的防抖时间(根据需求调整) }; UI.input.on('input', handleInput); ``` 或者使用第三方库(如lodash的debounce或lodash.throttle),这样代码更简洁: ```javascript import { debounce } from 'lodash'; UI.input.on('input', debounce(handleInput, 200)); ``` **相关问题--:** 1. 如何在UniApp中使用自定义防抖节流函数? 2. 为什么要用防抖而不是节流来限制输入事件的响应? 3. 如果输入事件非常密集,单纯的防抖节流会有什么问题?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值