Skip to content

指令

按钮权限控制

根据业务接口自行调整

js
import appStore from "@/store/index.js";

const auth = {
  /**
   * v-auth
   * 按钮权限控制隐藏显示
   */
  mounted(el, binding) {
    const value = binding.value || "";
    const auths = appStore.userStore.authCodes || [];
    if (value !== "" && !auths.includes(value))
      el.parentNode && el.parentNode.removeChild(el);
  },
};
export default auth;

按钮防抖指令

js
const debounce = {
  /**
   * v-debounce
   * 按钮防抖指令,可自行扩展至input
   * 接收参数:function类型
   */
  mounted(el, binding) {
    if (typeof binding.value !== "function") {
      // eslint-disable-next-line no-throw-literal
      throw "callback must be a function";
    }
    let timer = null;
    /**
     * 监听事件
     */
    el.__handleClick__ = function () {
      if (timer) clearInterval(timer);

      timer = setTimeout(() => {
        binding.value();
      }, 500);
    };
    el.addEventListener("click", el.__handleClick__);
  },
  /**
   * 取消监听
   */
  beforeUnmount(el) {
    el.removeEventListener("click", el.__handleClick__);
  },
};

export default debounce;

按钮节流指令

js
const throttle = {
  /**
   * 需求:防止按钮在短时间内被多次点击,使用节流函数限制规定时间内只能点击一次。
   *思路:
   *  1、第一次点击,立即调用方法并禁用按钮,等延迟结束再次激活按钮
   *  2、将需要触发的方法绑定在指令上
   *使用:给 Dom 加上 v-throttle 及回调函数即可
   *<button v-throttle="debounceClick">节流提交</button>
   */
  mounted(el, binding) {
    if (typeof binding.value !== "function") {
      // eslint-disable-next-line no-throw-literal
      throw "callback must be a function";
    }
    let timer = null;
    /**
     * 监听事件
     */
    el.__handleClick__ = function () {
      if (timer) clearTimeout(timer);

      if (!el.disabled) {
        el.disabled = true;
        binding.value();
        timer = setTimeout(() => {
          el.disabled = false;
        }, 1000);
      }
    };
    el.addEventListener("click", el.__handleClick__);
  },
  /**
   * 取消监听
   */
  beforeUnmount(el) {
    el.removeEventListener("click", el.__handleClick__);
  },
};

export default throttle;