自定义指令封装

注册指令

文件夹如图所示
在这里插入图片描述
在main.js导入index.js即可

import '@/directives/index';

index.js

/*
 * @Author: kongjinghcao
 * @Date: 2023-09-12 14:26:21
 * @Last Modified by: kongjinghcao
 * @Last Modified time: 2023-12-05 11:46:02
 * @Description: 自定义指令封装
 */
import Vue from 'vue';

// 自动注册modules中的所有文件
const files = require.context('./modules', false, /.+\.js$/);
files.keys().forEach((fileName) => {
  const directiveConfig = files(fileName); // 获取指令函数
  const directiveName = fileName // 获取指令名
    .replace(/^\.\//, '') // 去除开头的'./'
    .replace(/\.\w+$/, ''); // 去除文件扩展名
  Vue.directive(directiveName, directiveConfig.default || directiveConfig);
});

1、v-copy

v-copy=的值,就是需要拷贝的值,点击即可实现拷贝。

const copy = {
  bind(el, { value }, vnode) {
    // eslint-disable-next-line no-param-reassign
    el['data-value'] = value;
    el.addEventListener('click', (e) => {
      const input = document.createElement('input');
      document.body.appendChild(input);
      input.setAttribute('value', e.target['data-value']);
      input.select();
      document.execCommand('copy');
      document.body.removeChild(input);
      // vnode.content即 Vue实例, 此处使用了element ui的提示弹框
      vnode.context.$message({ type: 'success', message: '复制成功' });
    });
  },
  componentUpdated(el, { value }) {
    // eslint-disable-next-line no-param-reassign
    el['data-value'] = value;
  },
  unbind(el) {
    el.removeEventListener('click', el.handel);
  },
};
export default copy;

2、v-resize

使用场景:拖拽拉伸左侧菜单的宽度(左侧为原本宽度,右侧为将要拉伸到的宽度)
在这里插入图片描述
在这里插入图片描述

// 拖拽拉伸宽度
const resize = {
  bind(el,{value}, vnode) {
    el.addEventListener('mousedown', (e) => {
      e.preventDefault();
      const initX = e.clientX;
      const parentDom = el.parentNode;
      const initWidth = parentDom.offsetWidth;
      let newWidth;
      document.onmousemove = (event) => {
        const endX = event.clientX;
        // 最小值,可以在此处设置,也可以通过value传过来
        if (endX < 250) {
          return;
        }
        el.style.left = `${endX}px`;
        el.style.opacity = '1';
        newWidth = endX - initX + initWidth;
      };
      document.onmouseup = () => {
        document.onmousemove = null;
        document.onmouseup = null;
        parentDom.style.width = `${newWidth}px`;
        el.style.opacity = '0';
      };
    });
  },
};

export default resize;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

[chao]

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值