最近在项目中遇到一个需求,有一个列表需要滚动加载,类似于微博的无限滚动。当时第一反应时监听滚动事件,在判断滚动到达底部时加载下一页,同时心里也清楚,监听滚动事件需要做好截流。顺手搜索了下发现有一个现成的插件
vue-infinite-scroll
,用法也很简单,于是乎就用了起来。 需求上线后,对它的实现挺好奇的,于是研究了一番源码,这篇文章就是源码解析笔记。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
export default { bind(el, binding, vnode) { el[ctx] = { el, vm: vnode.context, expression: binding.value, }; const args = arguments; el[ctx].vm.$on('hook:mounted', function() { el[ctx].vm.$nextTick(function() { if (isAttached(el)) { doBind.call(el[ctx], args); }
el[ctx].bindTryCount = 0;
var tryBind = function() { if (el[ctx].bindTryCount > 10) return; el[ctx].bindTryCount++; if (isAttached(el)) { doBind.call(el[ctx], args); } else { setTimeout(tryBind, 50); } };
tryBind(); }); }); },
unbind(el) { if (el && el[ctx] && el[ctx].scrollEventTarget) el[ctx].scrollEventTarget.removeEventListener('scroll', el[ctx].scrollListener); }, };
|
一篇博客
。
这里我用两幅图来辅助理解上面的逻辑,相信会好懂很多。