import { createNamespace, isDef, addUnit, inBrowser } from '../utils'; import Icon from '../icon'; const [createComponent, bem] = createNamespace('image'); export default createComponent({ props: { src: String, fit: String, alt: String, round: Boolean, width: [Number, String], height: [Number, String], radius: [Number, String], lazyLoad: Boolean, showError: { type: Boolean, default: true, }, showLoading: { type: Boolean, default: true, }, errorIcon: { type: String, default: 'photo-fail', }, loadingIcon: { type: String, default: 'photo', }, }, data() { return { loading: true, error: false, }; }, watch: { src() { this.loading = true; this.error = false; }, }, computed: { style() { const style = {}; if (isDef(this.width)) { style.width = addUnit(this.width); } if (isDef(this.height)) { style.height = addUnit(this.height); } if (isDef(this.radius)) { style.overflow = 'hidden'; style.borderRadius = addUnit(this.radius); } return style; }, }, created() { const { $Lazyload } = this; if ($Lazyload && inBrowser) { $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; this.$emit('error', event); }, onClick(event) { this.$emit('click', event); }, genPlaceholder() { if (this.loading && this.showLoading && inBrowser) { return (