侧边栏壁纸
博主头像
博主等级

秋风清,秋月明,落叶聚还散,寒鸦息复惊,相思相见知何日,此时此夜难为情!

  • 累计撰写 20 篇文章
  • 累计创建 32 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

利用自定义Ref实现防抖

尘
2024-05-29 / 0 评论 / 0 点赞 / 66 阅读 / 4426 字
温馨提示:
本文最后更新于 2024-05-29,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

利用自定义Ref实现防抖

防抖如何与 Vue 中的响应式数据做结合

在Vue中使用 v-model 会实时改变数据,如下图:

v-model

因此,如果需要数据延迟响应,需要对数据输入做出防抖。

防抖函数+输入事件处理

先看效果

防抖

实现代码如下:

App.vue

<script setup>
import { ref } from "vue";
import { debounce } from "./debounce";
const inputText = ref("");
const inputHandler = (e) => {
  inputText.value = e.target.value;
};

const debounceHandler = debounce(inputHandler, 500);
</script>

<template>
  <div class="container">
    <input type="text" @input="debounceHandler" />
    <p class="text">{{ inputText }}</p>
  </div>
</template>

<style scoped>
.container {
  width: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  padding-top: 16px;
}

.container input {
  height: 24px;
  width: 400px;
}

.container input:focus {
  outline: 2px solid #ff00ff;
}

.container .text {
  color: #fff;
  font-size: 16px;
  margin-top: 16px;
  width: 400px;
}
</style>

debounce.js

export function debounce(func, delay = 1000) {
  let timer = null;
  return function (...args) {
    clearTimeout(timer);
    timer = setTimeout(() => {
      func.apply(this, args);
    }, delay);
  };
}

使用自定义ref

自定义ref——debounceRef.js

import { customRef } from "vue";
export function debounceRef(value, delay = 1000) {
  return customRef((track, trigger) => {
    let timer;
    return {
      get() {
        // 依赖收集
        track();
        return value;
      },
      set(newValue) {
        // 清理定时器
        clearTimeout(timer);
        timer = setTimeout(() => {
          // 更新值
          value = newValue;
          // 派发改变
          trigger();
        }, delay);
      },
    };
  });
}

App.vue

<script setup>
import { debounceRef } from "./debounceRef";
const inputText = debounceRef("", 1000);
</script>

<template>
  <div class="container">
    <input type="text" v-model="inputText" />
    <p class="text">{{ inputText }}</p>
  </div>
</template>

<style scoped>
.container {
  width: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  padding-top: 16px;
}

.container input {
  height: 24px;
  width: 400px;
}

.container input:focus {
  outline: 2px solid #ff00ff;
}

.container .text {
  color: #fff;
  font-size: 16px;
  margin-top: 16px;
  width: 400px;
}
</style>

0

评论区