vue实现防抖搜索--中文输入法即时查询

        在实际项目中经常会用到input输入框来实现键入搜索,一般的步骤就是用户在输入后点击查询按钮进行查询调接口就完事了.但是有的时候会要求输入时就进行搜索了,那么此时会出现即使使用的中文输入法,也会输出单个的字母,如图所示

复习知识点

防抖/节流

防抖和节流是两种常用的优化高频率触发的事件或函数调用的技术。

防抖(debounce):如果你持续触发一个事件,防抖的作用是延迟执行,直到在一定时间内没有新的触发,再执行一次。这种技术通常用于处理连续的输入,例如用户在搜索框中输入时,只有在用户停止输入一段时间后才发送请求。

节流(throttle):如果你持续触发一个事件,节流的作用是限制一定时间内最多只执行一次。这种技术通常用于限制高频率的事件,例如滚动、resize等,防止事件处理函数被频繁调用,导致性能问题。

简单来说,防抖是“一定时间内只触发一次”,而节流是“一定时间内只处理一次”。

为了解决上述状况,所以我们在输入框中使用防抖来做处理,等用户没有操作或间断一会儿的时候进行搜索

1.输入框实现

   <div class="input-form">
      <input
        :value="input"
        @input="onInputChange"
        placeholder="搜索关键词"
        onkeyup="value=value.replace(/[^\w\u4E00-\u9FA5]/g, '')"
      />
      <el-button :icon="Plus" @click="addModel">添加模型</el-button>
    </div>

输入框这里做了一个小处理 :

 οnkeyup="value=value.replace(/[^\w\u4E00-\u9FA5]/g, '')"

  • [^\w\u4E00-\u9FA5]: 这是一个字符集合,表示匹配任何不是字母数字字符(\w)或中文字符(在\u4E00-\u9FA5范围内)的字符。
  • g: 这是一个全局标志,意味着匹配并替换输入字符串中的所有符合条件的字符,而不仅仅是第一个。

因此,当用户在输入框中键入字符时,该表达式会删除或替换掉所有非字母数字和非中文字符。

2.输入方法调用

const onInputChange = (event) => {

//这一段clg是即时的输出内容

  console.log('即时输出内容--', event.target.value, input.value)

//当时为了验证,所以加了这么一段,确认将输出内容转换成只有中英文形式的
  input.value = event.target.value.replace(/[^\w\u4E00-\u9FA5]/g, '')

  fangdou()
}

 防抖控制未操作0.5s后调用接口

const fangdou = debounce(async () => {

  console.log('防抖----输出内容', input.value)

//调用接口查询

  await getList()

}, 500)

可以看到此时已经对输出内容做了时限了

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值