Vue自定义指令注册(全局注册)
Vue.directive('自定义指令命名',{
bind(){},
inserted(){},
update(){},
componentUpdated(){},
unbind()
})
第一个参数,为自定义指令的名称,不用带 v- 。第二个参数为一个对象,其中有5个钩子函数,类似于vue的生命周期钩子函数,它们也是被绑定元素各个周期会触发的钩子函数。
每个执行时期如下:
bind():只调用一次,指令第一次绑定到HTML元素时调用。在这里可以进行一次性的初始化设置。
inserted():当指令绑定的元素插入到父节点中的时候触发。
update():当指令绑定的元素状态/样式、内容(这里指元素绑定的 vue 数据) 发生改变时触发。
componentUpdated():当 update() 执行完毕之后触发。
unbind():只调用一次,指令与元素解绑时调用。
其中,每个钩子函数传入4个参数分别为:
el:指令所绑定的元素,可以用来直接操作 DOM。
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 }。
vnode:Vue 编译生成的虚拟节点。
oldVnode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
一般来说,最常用的就是bind()和inserted()
了解完自定义指令的属性和方法,就可以实现图片的懒加载
首先介绍一个对象 IntersectionObserver ,它有如下属性
定义一个观察器,entries为状态改变元素的数组
callback函数的参数(entries)是⼀个数组,每个成员都是⼀个IntersectionObserverEntry
time:可见性发⽣变化的时间,是⼀个⾼精度时间戳,单位为毫秒
target:被观察的⽬标元素,是⼀个 DOM 节点对象
rootBounds:根元素的矩形区域的信息,
getBoundingClientRect() ⽅法的返回值,如果没有根元素(即直接相对于视⼝滚动),则返回null
boundingClientRect :⽬标元素的矩形区域的信息
intersectionRect :⽬标元素与视⼝(或根元素)的交叉区域的信息
intersectionRatio:⽬标元素的可见⽐例,即
intersectionRect占 boundingClientRect的⽐例,完全可见时为1,完全不可见时⼩于等于0
<script> const app = new Vue({ el: "#app", data: { moren: "img/0.png", arrSrc: [ "img/1.jpg", "img/2.jpg", "img/3.jpg", "img/4.jpg", "img/5.jpg", "img/6.jpg", "img/7.jpg", "img/8.jpg", ], }, }); Vue.directive("lazy", { inserted(el, binding) { let observer = new IntersectionObserver((entries) => { // 遍历 for (let i of entries) { // 如果改元素处于可视区 if (i.isIntersecting > 0) { // 获取该元素 let img = i.target; // 重新设置src值 img.src = binding.value; //取消对该元素的观察 observer.unobserve(img); } } }); // 为 img 标签添加一个观察 observer.observe(el); }, }); </script>