vue muit-ui infinite-scroll源码解析

infinite scroll基本使用vue的mint-ui的infinite scroll的基本使用地址:infinite-scroll接入指南. 简单解释一下: 1、指令接受的method:处理loadmore回调 2、自定义属性infinite-scroll-disabled:为false时:不会进行是否到达底部的判断,因此就触发不了loadmore回调 3、自定义属性infinite
摘要由CSDN通过智能技术生成

infinite scroll基本使用

vue的mint-ui的infinite scroll的基本使用地址:infinite-scroll接入指南.
简单解释一下:
1、指令接受的method:处理loadmore回调
2、自定义属性infinite-scroll-disabled:为false时:不会进行是否到达底部的判断,因此就触发不了loadmore回调
3、自定义属性infinite-scroll-distance:doCheck通过此distance来判断是否到达底部
4、自定义属性infinite-scroll-immediate-check: 是否在绑定到Vue上面就立刻执行 check函数
5、自定义属性infinite-scroll-listen-for-event: 通过Vue.$on()来注册此事件,此事件的回调函数是 当前指令定义回调函数(也就是loadmore)

源码解析

找到mint-ui源码的infinite-scroll目录,找到它的入口文件index.js,其代码如下:

import 'mint-ui/src/style/empty.css'; // 需要的css文件
export { default } from './src/infinite-scroll.js'; // 核心代码

infinite-scroll.js的代码如下:

import InfiniteScroll from './directive';
import 'mint-ui/src/style/empty.css';
import Vue from 'vue';
//当前 infinite-scroll的 install方法,用于Vue开发插件使用,在Vue.use()里面调用此对象的install函数,在安装此插件的时候,注册当前指令
const install = function(Vue) {
   
  Vue.directive('InfiniteScroll', InfiniteScroll);//注册指令
};
//已经在初始化的时候,帮我们调动了Vue.use()
if (!Vue.prototype.$isServer && window.Vue) {
  window.infiniteScroll = InfiniteScroll;
  Vue.use(install); // eslint-disable-line
}
InfiniteScroll.install = install;
export default InfiniteScroll;

通过上面得知InfiniteScroll代码在./directive.js里面,查看它的入口函数如下:

export default {
  // 指令绑定的钩子函数
  bind(el, binding, vnode) {
    // 为当前el添加我们需要使用的属性,它的value就是我们后面操作所需的对象
    el[ctx] = {
      el, // 当前指令绑定的dom节点
      vm: vnode.context, // 当前vNode所在的Vue实例
      expression: binding.value
    };
    const args = arguments;
    // 当前Vue实例挂载到到dom上之后执行的回调函数
    var cb = function() {
   
      //在此次事件循环完成dom相关更新之后,执行当前指令相关业务
      el[ctx].vm.$nextTick(function() {
    
        if (isAttached(el)) {
  // 当前dom在html标签里面  当前dom不在 documentFragment里面
          doBind.call(el[ctx], args);
        }

        el[ctx].bindTryCount = 0;

        var tryBind = function() {
   
          if (el[ctx].bindTryCount > 10) return; //eslint-disable-line
          el[ctx].bindTryCount++;
          if (isAttached(el)) {
            doBind.call(el[ctx], args);
          } else {
            setTimeout(tryBind, 50);
          }
        };

        tryBind();
      });
    };
    if (el[ctx].vm._isMounted) {
      cb();
      return;
    }
    el[ctx].vm.$on('hook:mounted', cb);// 如果阅读过vue源码, Vue通过callHook()调用其相关生命周期方法,此时也会调用通过hook注册的回调钩子函数
  },
  //当前指令解绑定的回调钩子函数
  unbind(el) {
    //将当前scroll view的 scroll事件remove掉
    if (el[ctx] && el[ctx].scrollEventTarget) {
      el[ctx].scrollEventTarget.removeEventListener(<
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值