在企业微信侧边栏应用中,给`dialog`添加了拖拽功能,但是因为`dialog`高度超过了页面高度,所以高度100%时拖拽有个bug--自动贴到窗口顶部而且企业侧边栏宽高都有限制,拖拽效果并不理想,所以就想缩小`dialog`再进行拖拽。
拖拽的指令是自定义的,原本想像绑定`class`一样根据一个参数来动态绑定指令,发现没有这种功能。后来看了文档,可以给指令动态传递参数,根据传递的参数来判断之后的行为。
自定义指令 — Vue.js
封装的指令在组件中引用
dialogDrag是自定义的指令名称
zoom是传递的参数
在`doalog`标题行添加放大缩小图标,并添加事件,缩小时才添加拖拽功能,zoom初始值为false,
一个指令定义对象可以提供如下几个钩子函数 (均为可选):
-
bind
:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。 -
inserted
:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。 -
update
:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 。
我们可以在bind方法中判断是否添加拖拽功能
binding
:一个对象,包含以下 property:
name
:指令名,不包括v-
前缀。value
:指令的绑定值,例如:v-my-directive="1 + 1"
中,绑定值为2
。oldValue
:指令绑定的前一个值,仅在update
和componentUpdated
钩子中可用。无论值是否改变都可用。expression
:字符串形式的指令表达式。例如v-my-directive="1 + 1"
中,表达式为"1 + 1"
。arg
:传给指令的参数,可选。例如v-my-directive:foo
中,参数为"foo"
。modifiers
:一个包含修饰符的对象。例如:v-my-directive.foo.bar
中,修饰符对象为{ foo: true, bar: true }
。
在`update`钩子函数中更新