vue自定义指令-图片懒加载

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()这两个钩子,可以这么理解为在 bind()里设置被绑定元素的css样式,在 inserted()里设置被绑定元素的 js 操作。

图片懒加载:

<img
  v-for="(item,index) in arrSrc"
  :key="index"
  :src="/"
  v-lazy="item"
  alt="x"
/>


//js代码
  Vue.directive("lazy", {
    
    
        inserted(el, binding) {
    
    
          //定义一个观察器,entries为状态改变元素的数组
          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);
        },
      });

猜你喜欢

转载自blog.csdn.net/qq_45659769/article/details/125203559