From 168730d2ac1ffeec1e74828d464468faa1f461d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=98=89=E6=B6=B5?= Date: Sat, 8 Jun 2019 10:05:53 +0800 Subject: [PATCH] [bugfix] Image: load event not triggered when enable lazy-load --- packages/image/index.js | 40 +++++++++++--- .../test/__snapshots__/index.spec.js.snap | 9 ++++ packages/image/test/index.spec.js | 54 +++++++++++++++++++ 3 files changed, 97 insertions(+), 6 deletions(-) diff --git a/packages/image/index.js b/packages/image/index.js index 27166dc25..1a7d40006 100644 --- a/packages/image/index.js +++ b/packages/image/index.js @@ -43,12 +43,42 @@ export default sfc({ } }, + created() { + const { $Lazyload } = this; + + if ($Lazyload) { + $Lazyload.$on('loaded', this.onLazyLoaded); + $Lazyload.$on('error', this.onLazyLoadError); + } + }, + + beforeDestroy() { + const { $Lazyload } = this; + + if ($Lazyload) { + $Lazyload.$off('loaded', this.onLazyLoaded); + $Lazyload.$off('error', this.onLazyLoadError); + } + }, + methods: { onLoad(event) { this.loading = false; this.$emit('load', event); }, + onLazyLoaded({ el }) { + if (el === this.$refs.image && this.loading) { + this.onLoad(); + } + }, + + onLazyLoadError({ el }) { + if (el === this.$refs.image && !this.error) { + this.onError(); + } + }, + onError(event) { this.error = true; this.loading = false; @@ -85,10 +115,6 @@ export default sfc({ }, style: { objectFit: this.fit - }, - on: { - load: this.onLoad, - error: this.onError } }; @@ -97,10 +123,12 @@ export default sfc({ } if (this.lazyLoad) { - return ; + return ; } - return ; + return ( + + ); } }, diff --git a/packages/image/test/__snapshots__/index.spec.js.snap b/packages/image/test/__snapshots__/index.spec.js.snap index c6603965a..cfa3f8b71 100644 --- a/packages/image/test/__snapshots__/index.spec.js.snap +++ b/packages/image/test/__snapshots__/index.spec.js.snap @@ -7,6 +7,15 @@ exports[`lazy load 1`] = ` `; +exports[`lazy-load error event 1`] = ` +
+
+
+
+`; + +exports[`lazy-load load event 1`] = `
`; + exports[`load event 1`] = `
`; exports[`load event 2`] = ` diff --git a/packages/image/test/index.spec.js b/packages/image/test/index.spec.js index 961733f80..f3a493fc8 100644 --- a/packages/image/test/index.spec.js +++ b/packages/image/test/index.spec.js @@ -7,6 +7,7 @@ test('click event', () => { wrapper.trigger('click'); expect(wrapper.emitted('click')[0][0]).toBeTruthy(); + wrapper.destroy(); }); test('load event', () => { @@ -47,3 +48,56 @@ test('lazy load', () => { expect(wrapper).toMatchSnapshot(); }); + +test('lazy-load load event', done => { + const wrapper = mount(Image, { + propsData: { + lazyLoad: true, + src: 'https://img.yzcdn.cn/vant/cat.jpeg' + }, + mocks: { + $Lazyload: { + $on(eventName, hanlder) { + if (eventName === 'loaded') { + setTimeout(() => { + hanlder({ el: null }); + hanlder({ el: wrapper.find('img').element }); + expect(wrapper.emitted('load').length).toEqual(1); + expect(wrapper).toMatchSnapshot(); + wrapper.destroy(); + }); + } + }, + $off() { + done(); + } + } + } + }); +}); + +test('lazy-load error event', done => { + const wrapper = mount(Image, { + propsData: { + lazyLoad: true + }, + mocks: { + $Lazyload: { + $on(eventName, hanlder) { + if (eventName === 'error') { + setTimeout(() => { + hanlder({ el: null }); + hanlder({ el: wrapper.find('img').element }); + expect(wrapper.emitted('error').length).toEqual(1); + expect(wrapper).toMatchSnapshot(); + wrapper.destroy(); + }); + } + }, + $off() { + done(); + } + } + } + }); +});