vue自定义指令之面板拖拽的实现


Posted in Javascript onApril 14, 2019

前言

在指令里获取的this并不是vue对象,vnode.context才是vue对象,一般来说,指令最好不要访问vue上的data,以追求解耦,但是可以通过指令传进来的值去访问method或ref之类的。

vue指令

官方文档其实已经解释的蛮清楚了,这里挑几个重点的来讲。

1、arguments

el: 当前的node对象,用于操作dom
binding:模版解析之后的值
vNode: Vue 编译生成的虚拟节点,可以在上面获取vue对象
oldVnode: 使用当前指令上一次变化的node内容

2、 生命周期

bind: 初始化的时候调用,但这时候node不一定渲染完成
inserted: 被绑定元素插入父节点时调用,关于dom操作尽量在这里用
update:就是内部this.update时会触发这里

面板拖拽逻辑

使用relative,舰艇event上的clientX和clientY鼠标距离页面的位置来改变面板的top和left。

涉及属性

  • offsetLeft:距离参照元素左边界偏移量
  • offsetTop:距离参照元素上边界偏移量
  • clientWidth:此属性可以返回指定元素客户区宽度
  • clientHeight: 此属性可以返回指定元素客户区高度
  • clientX:事件被触发时鼠标指针相对于浏览器页面(或客户区)的水平坐标
  • clientY: 事件被触发时鼠标指针相对于浏览器页面(或客户区)的垂直坐标
  • onmousedown:鼠标按下事件
  • onmousemove: 鼠标滑动事件
  • onmouseup: 鼠标松开事件

实现代码

<div v-drag="'refName'"></div>

在绑定的组件上使用,value非必选项,不挑就默认是基于document的移动

directives: {
  drag: {
   // 使用bind会有可能没有渲染完成
   inserted: function(el, binding, vnode) {
    const _el = el; //获取当前元素
    const ref = vnode.context.$refs[binding.value]; // 判断基于移动的是哪一个盒子
    const masterNode = ref ? ref : document; // 用于绑定事件
    const masterBody = ref ? ref : document.body; // 用于获取高和宽
    const mgl = _el.offsetLeft;
    const mgt = _el.offsetTop;
    const maxWidth = masterBody.clientWidth;
    const maxHeight = masterBody.clientHeight;
    const elWidth = _el.clientWidth;
    const elHeight = _el.clientHeight;
    let positionX = 0,
     positionY = 0;
    _el.onmousedown = e => {
     //算出鼠标相对元素的位置,加上的值是margin的值
     let disX = e.clientX - _el.offsetLeft + mgl; 
     let disY = e.clientY - _el.offsetTop + mgt;
     masterNode.onmousemove = e => {
      //用鼠标的位置减去鼠标相对元素的位置,得到元素的位置
      let left = e.clientX - disX;
      let top = e.clientY - disY;
      // 绑定的值不能滑出基于盒子的范围
      left < 0 && (left = 0);
      left > (maxWidth - elWidth - mgl) && (left = maxWidth - elWidth - mgl);
      top < 0 && (top = 0);
      top > (maxHeight - elHeight - mgt) && (top = maxHeight - elHeight - mgt);
      //绑定元素位置到positionX和positionY上面
      positionX = top;
      positionY = left;
      
      //移动当前元素
      _el.style.left = left + "px";
      _el.style.top = top + "px";
     };
     // 这里是鼠标超出基于盒子范围之后再松开,会监听不到
     document.onmouseup = e => {
      masterNode.onmousemove = null;
      document.onmouseup = null;
     };
    };
   }
  }
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript包装对象实例分析
Mar 27 Javascript
jQuery满屏焦点图左右滚动特效代码分享
Sep 07 Javascript
jQuery实现带动画效果的多级下拉菜单代码
Sep 08 Javascript
基于jquery实现省市区三级联动效果
Dec 25 Javascript
js+canvas绘制五角星的方法
Jan 28 Javascript
js替换字符串中所有指定的字符(实现代码)
Aug 17 Javascript
jQuery实现table中两列CheckBox只能选中一个的示例
Sep 22 jQuery
node实现基于token的身份验证
Apr 09 Javascript
Vue头像处理方案小结
Jul 26 Javascript
JavaScript选择排序算法原理与实现方法示例
Aug 06 Javascript
jqGrid表格底部汇总、合计行footerrow处理
Aug 21 Javascript
layui 弹出删除确认界面的实例
Sep 06 Javascript
详解Vue组件之间通信的七种方式
Apr 14 #Javascript
浅谈Vue CLI 3结合Lerna进行UI框架设计
Apr 14 #Javascript
vue使用axios上传文件(FormData)的方法
Apr 14 #Javascript
详解如何理解vue的key属性
Apr 14 #Javascript
axios+Vue实现上传文件显示进度功能
Apr 14 #Javascript
Vue 使用formData方式向后台发送数据的实现
Apr 14 #Javascript
说说如何使用Vuex进行状态管理(小结)
Apr 14 #Javascript
You might like
实用函数8
2007/11/08 PHP
快速配置PHPMyAdmin方法
2008/06/05 PHP
ThinkPHP CURD方法之limit方法详解
2014/06/18 PHP
php找出指定范围内回文数且平方根也是回文数的方法
2015/03/23 PHP
Thinkphp实现站点静态化的方法详解
2017/03/21 PHP
php与阿里云短信接口接入操作案例分析
2020/05/27 PHP
JQUERY1.6 使用方法四 检测浏览器
2011/11/23 Javascript
点击button获取text内容并改变样式的js实现
2014/09/09 Javascript
Javascript writable特性介绍
2015/02/27 Javascript
javascript闭包的理解
2015/04/01 Javascript
ES6概念 Symbol.keyFor()方法
2016/12/25 Javascript
过期软件破解办法实例详解
2017/01/04 Javascript
JavaScript数据结构之广义表的定义与表示方法详解
2017/04/12 Javascript
JS中去掉array中重复元素的方法
2017/05/26 Javascript
使用vue2实现带地区编号和名称的省市县三级联动效果
2018/11/05 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变opacity实现)
2019/01/24 Javascript
微信小程序实现Session功能及无法获取session问题的解决方法
2019/05/07 Javascript
使用VueRouter的addRoutes方法实现动态添加用户的权限路由
2019/06/03 Javascript
[02:12]DOTA2英雄基础教程 变体精灵
2013/12/16 DOTA
Python 匹配任意字符(包括换行符)的正则表达式写法
2009/10/29 Python
Python实现读取邮箱中的邮件功能示例【含文本及附件】
2017/08/05 Python
Python安装Numpy和matplotlib的方法(推荐)
2017/11/02 Python
Python 取numpy数组的某几行某几列方法
2019/10/24 Python
python 画函数曲线示例
2019/12/04 Python
HTML5在a标签内放置块级元素示例代码
2013/08/23 HTML / CSS
html5 datalist 选中option选项后的触发事件
2020/03/05 HTML / CSS
台湾菁英交友:结识黄金单身的台湾人
2018/01/22 全球购物
用Python匹配HTML tag的时候,<.*>和<.*?>有什么区别
2012/11/04 面试题
教师党员岗位承诺书
2014/05/29 职场文书
实习证明格式范文
2014/10/14 职场文书
80后婚前协议书范本
2014/10/24 职场文书
学校勤俭节约倡议书
2015/04/29 职场文书
2015小学教师年度工作总结
2015/05/12 职场文书
宣传部部长竞选稿
2015/11/21 职场文书
Python matplotlib绘制雷达图
2022/04/13 Python
java中为什么说子类的构造方法默认访问的是父类的无参构造方法
2022/04/13 Java/Android