vant/packages/vant-lazyload/src/lazy-container.js
2021-04-14 09:35:08 +08:00

90 lines
2.0 KiB
JavaScript

/* eslint-disable max-classes-per-file */
import { find, remove, ArrayFrom } from './util';
const defaultOptions = {
selector: 'img',
};
class LazyContainer {
constructor({ el, binding, vnode, lazy }) {
this.el = null;
this.vnode = vnode;
this.binding = binding;
this.options = {};
this.lazy = lazy;
this._queue = [];
this.update({ el, binding });
}
update({ el, binding }) {
this.el = el;
this.options = Object.assign({}, defaultOptions, binding.value);
const imgs = this.getImgs();
imgs.forEach((el) => {
this.lazy.add(
el,
Object.assign({}, this.binding, {
value: {
src: 'dataset' in el ? el.dataset.src : el.getAttribute('data-src'),
error:
('dataset' in el
? el.dataset.error
: el.getAttribute('data-error')) || this.options.error,
loading:
('dataset' in el
? el.dataset.loading
: el.getAttribute('data-loading')) || this.options.loading,
},
}),
this.vnode
);
});
}
getImgs() {
return ArrayFrom(this.el.querySelectorAll(this.options.selector));
}
clear() {
const imgs = this.getImgs();
imgs.forEach((el) => this.lazy.remove(el));
this.vnode = null;
this.binding = null;
this.lazy = null;
}
}
export default class LazyContainerMananger {
constructor({ lazy }) {
this.lazy = lazy;
lazy.lazyContainerMananger = this;
this._queue = [];
}
bind(el, binding, vnode) {
const container = new LazyContainer({
el,
binding,
vnode,
lazy: this.lazy,
});
this._queue.push(container);
}
update(el, binding, vnode) {
const container = find(this._queue, (item) => item.el === el);
if (!container) return;
container.update({ el, binding, vnode });
}
unbind(el) {
const container = find(this._queue, (item) => item.el === el);
if (!container) return;
container.clear();
remove(this._queue, container);
}
}