如何解决 Tree 组件快速点击导致接口多次请求的问题?

如何解决 tree 组件快速点击导致接口多次请求的问题?

tree组件多次请求接口问题

在使用tree组件时,如

<checktreee @nodeclicked="nodeclicked" />

子组件中获取选中的id并发送请求。

@check-change="handleclick"
const handleclick = async (node: any, ischeck: any) => {
  if (ischeck) {
    checkid.value.push(node.id);
  } else {
    checkid.value.foreach((item, i) => {
      if (item === node.id) {
        checkid.value.splice(i, 1);
      }
    });
  }
  emit("nodeclicked", checkid);
};

父组件中根据id请求接口。

const nodeclicked = (val: any) => {
  selectdata.type = val.value.join(",");
  getdata(selectdata);
};

但是,当快速点击tree组件时,会触发多次接口请求。

解决方法

方法一:防抖

// 引入防抖函数,如lodash的debounce
import { debounce } from 'lodash';

// 父组件中定义防抖处理的nodeclicked方法
const debouncednodeclicked = debounce(nodeclicked, 300); // 延迟时间可以根据需求调整

// 修改子组件引用,使用防抖后的回调函数
<checktreee @nodeclicked="debouncednodeclicked" />

方法二:延迟处理

// 子组件中引入一个定时器和一个临时变量存储待发送的节点ID
let timer: NodeJS.Timeout | null = null;
let pendingNodeIds: any[] = [];

const handleClick = async (node: any, isCheck: any) => {
  if (isCheck) {
    checkID.value.push(node.id);
    pendingNodeIds.push(node.id);
  } else {
    checkID.value.forEach((item, i) => {
      if (item === node.id) {
        checkID.value.splice(i, 1);
      }
    });
    pendingNodeIds = pendingNodeIds.filter(id => id !== node.id);
  }

  clearTimeout(timer); // 清除之前的定时器
  timer = setTimeout(() => {
    // 在延迟时间后触发nodeClicked事件,发送请求
    emit("nodeClicked", pendingNodeIds);
    pendingNodeIds = []; // 重置待发送节点ID列表
  }, 300); // 延迟时间可以根据需求调整
};

以上就是如何解决 Tree 组件快速点击导致接口多次请求的问题?的详细内容,更多请关注硕下网其它相关文章!