Skip to content

Commit de7afec

Browse files
committed
backup
1 parent 5b1ac5d commit de7afec

File tree

4 files changed

+88
-55
lines changed

4 files changed

+88
-55
lines changed

demo/src/App.vue

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
<style lang="less">
2-
.container {
2+
.lazy-ref {
33
height: 640px;
44
overflow: auto;
55
}
66
7-
.lazy-ref {
8-
}
9-
107
img {
118
width: 200px;
129
height: 200px;
@@ -31,6 +28,13 @@
3128
height: 200px;
3229
}
3330
31+
.buttons {
32+
position: fixed;
33+
right: 20px;
34+
bottom: 20px;
35+
z-index: 20;
36+
}
37+
3438
@-webkit-keyframes sk-rotateplane {
3539
0% {
3640
-webkit-transform: perspective(120px)
@@ -60,35 +64,61 @@
6064
</style>
6165
<template>
6266
<div>
63-
<div class="container">
64-
<div class="lazy-loading"></div>
65-
<lazy-ref ref="lazyRef" class="lazy-ref" opts="{classTarget:'parent'}">
67+
<div>
68+
<lazy-ref ref="lazyRef" class="lazy-ref" :opts="{classTarget:'parent'}">
6669
<div>
6770
<img v-lazy="{ref:'lazyRef', src:img}">
6871
</div>
72+
<div class="list">
73+
<div v-for="img in imgs">
74+
<img v-lazy="{ref:'lazyRef', src:img}">
75+
</div>
76+
</div>
6977
</lazy-ref>
7078
</div>
71-
<button @click="changeImg">Change img</button>
79+
<div class="list">
80+
<div v-for="img in imgs">
81+
<img v-lazy="{classTarget:'parent', src:img}">
82+
</div>
83+
</div>
84+
<div class="buttons">
85+
<button @click="changeImg">Change img</button>
86+
<button @click="changeImgs">Change imgs</button>
87+
</div>
7288
</div>
7389
</template>
7490
<script>
7591
let i = 0;
7692
93+
const LIST_LEN = 20;
94+
7795
function genImgSrc() {
7896
return 'img/lenna.png?_t=' + Math.floor(Math.random() * 100000) + '.' + Date.now();
7997
}
8098
99+
function genImgList(len) {
100+
const arr = [];
101+
while (len--) {
102+
arr.push(genImgSrc());
103+
}
104+
return arr;
105+
}
106+
81107
export default {
82108
data() {
83109
return {
84110
img: genImgSrc(),
111+
imgs: genImgList(LIST_LEN),
85112
show: true
86113
};
87114
},
88115
methods: {
89116
changeImg() {
90117
this.img = genImgSrc();
91118
},
119+
changeImgs() {
120+
this.imgs = genImgList(LIST_LEN);
121+
},
92122
changeShow() {
93123
this.show = !this.show;
94124
},
@@ -98,6 +128,4 @@ export default {
98128
}
99129
};
100130
101-
102-
103131
</script>

demo/src/main.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ import Vue from 'vue'
22
import app from './App'
33
import { VueLLazyload } from '../../src/index';
44

5-
Vue.use(VueLLazyload);
5+
Vue.use(VueLLazyload, {
6+
once: false
7+
});
68

79
new Vue({
810
el: '#app',
911
template: '<app></app>',
1012
components: {
1113
app
1214
}
13-
});
15+
});

src/index.js

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ const Lazy = {
7070
refStr = opts.ref;
7171

7272
// add to after $refs has references
73-
Vue.nextTick(() => {
73+
vm.$nextTick(() => {
7474
// Prevent it's unbound before initialization
7575
if (el._lazyBound) {
7676
var ref;
@@ -81,39 +81,44 @@ const Lazy = {
8181
}
8282
}
8383

84-
const loader = el._$lazy = new LazyLoader({
85-
...opts,
86-
parent: ref && ref.$lazy,
87-
el: el
88-
});
84+
const mergedOpts = {
85+
...opts,
86+
el: el
87+
},
88+
$lazy = ref && ref.$lazy;
89+
90+
if ($lazy !== undefined) {
91+
mergedOpts.parent = $lazy;
92+
}
93+
94+
const loader = el._$lazy = new LazyLoader(mergedOpts);
8995

9096
loader.check();
9197
}
9298
});
9399
},
94-
componentUpdated(el, binding, vnode) {
95-
var opts = binding.value;
100+
componentUpdated(el, binding) {
101+
var opts = binding.value,
102+
oOpts = binding.oldValue,
103+
nSrc = isStr(opts) ? opts : opts.src,
104+
oSrc = isStr(oOpts) ? oOpts : oOpts.src;
96105

97-
if (isStr(opts)) {
98-
opts = {
99-
src: opts
100-
};
101-
}
102-
103-
const loader = el._$lazy;
106+
if (nSrc != oSrc) {
107+
const loader = el._$lazy;
104108

105-
if (loader) {
106-
loader.update({
107-
src: opts.src
108-
});
109+
if (loader) {
110+
loader.update({
111+
src: nSrc
112+
});
113+
}
109114
}
110115
},
111-
unbind(el){
116+
unbind(el, binding, vnode){
112117
if (el._lazyBound) {
113118
el._lazyBound = false;
114119
}
115120

116-
Vue.nextTick(() => {
121+
vnode.context.$nextTick(() => {
117122
const loader = el._$lazy;
118123
if (loader) {
119124
loader.destroy();
@@ -126,7 +131,7 @@ const Lazy = {
126131
const VueLLazyload = {
127132
install(Vue, options = {}) {
128133
LazyLoader = LazyClass(Vue);
129-
Vue.prototype.$lazy = new LazyLoader({
134+
Vue.$lazy = new LazyLoader({
130135
...options,
131136
isRoot: true
132137
});
@@ -137,10 +142,8 @@ const VueLLazyload = {
137142
}
138143
};
139144

140-
export default VueLLazyload;
141-
142145
export {
143146
LazyRef,
144147
Lazy,
145148
VueLLazyload
146-
};
149+
};

src/lazy.js

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import Vue from 'vue';
2-
import { $ } from './util';
1+
import {$} from './util';
32

43
const EV_SCROLL = 'scroll',
54

@@ -44,7 +43,7 @@ try {
4443
}
4544

4645
var loaderID = 0;
47-
function LazyClass(scope) {
46+
export function LazyClass(scope) {
4847
return class LazyLoader {
4948
constructor(opts) {
5049
const me = this,
@@ -83,8 +82,10 @@ function LazyClass(scope) {
8382
}
8483
else {
8584
// inherit parent LazyLoader's options
86-
opts = Object.create(parent && parent.opts, {
87-
parent: scope.$lazy,
85+
const $rootLazy = scope.$lazy;
86+
opts = Object.assign({
87+
parent: $rootLazy
88+
}, parent && parent.opts || $rootLazy.opts, {
8889
...opts
8990
});
9091
}
@@ -141,8 +142,8 @@ function LazyClass(scope) {
141142
preloadRatio = me.opts.preloadRatio,
142143
isWin = parentEl === win,
143144
parentElOffset = isWin ? {
144-
left: 0,
145-
top: 0,
145+
left: win.scrollX,
146+
top: win.scrollY,
146147
width: win.innerWidth,
147148
height: win.innerHeight
148149
} : offset(parentEl),
@@ -153,14 +154,14 @@ function LazyClass(scope) {
153154
parentElHeight = parentElOffset.height * preloadRatio,
154155
elLeft = elOffset.left,
155156
elTop = elOffset.top,
156-
elWidth = elOffset.width * preloadRatio,
157-
elHeight = elOffset.height * preloadRatio;
157+
elWidth = elOffset.width,
158+
elHeight = elOffset.height;
158159

159160
// Collision detection
160-
if (elLeft > parentElLeft - elLeft &&
161-
elLeft < parentElLeft + parentElWidth + elWidth &&
162-
elTop > parentElTop - elHeight &&
163-
elTop < parentElTop + parentElHeight + elHeight) {
161+
if (elLeft < parentElLeft + parentElWidth &&
162+
elLeft + elWidth > parentElLeft &&
163+
elTop < parentElTop + parentElHeight &&
164+
elTop + elHeight > parentElTop) {
164165
result = true;
165166
}
166167
}
@@ -186,7 +187,7 @@ function LazyClass(scope) {
186187
cb = cbs[event];
187188

188189
if (!cb) {
189-
cbs[event] = throttle(function () {
190+
cb = cbs[event] = throttle(function () {
190191
for (var j = 0, jLen = queue.length; j < jLen; j++) {
191192
queue[j].check();
192193
}
@@ -208,6 +209,8 @@ function LazyClass(scope) {
208209

209210
// reset
210211
me.stat = STAT_NOT_LOAD;
212+
213+
me.check();
211214
}
212215

213216
rmChild(lazyLoader) {
@@ -268,7 +271,6 @@ class Req {
268271
}
269272

270273
me.canceled = false;
271-
me.stat = STAT_LOADING;
272274
me.retry = retry;
273275

274276
el.onload = () => {
@@ -327,6 +329,7 @@ function loadHandler(lazyLoader) {
327329
switchClass(elTarget, classLoaded);
328330
}
329331
else {
332+
lazyLoader.stat = STAT_LOADING;
330333
lazyLoader.req = new Req({
331334
el: el,
332335
src: src,
@@ -346,6 +349,3 @@ function loadHandler(lazyLoader) {
346349
}
347350
}
348351

349-
export default {
350-
LazyClass
351-
};

0 commit comments

Comments
 (0)