element Image组件

摘要:
_scrollContainer||!
<template>
  <div class="el-image">
    <slot v-if="loading"name="placeholder">
      <div class="el-image__placeholder"></div>
    </slot>
    <slot v-else-if="error"name="error">
      <div class="el-image__error">{{ t('el.image.error') }}</div>
    </slot>
    <img
      v-else
      class="el-image__inner":src="src":alt="alt":style="{ 'object-fit': fit }">
  </div>
</template>

<script>import Locale from 'element-ui/src/mixins/locale';
  import { on, off, getScrollContainer, isInContainer } from 'element-ui/src/utils/dom';
  import { isString, isHtmlElement } from 'element-ui/src/utils/types';
  import throttle from 'throttle-debounce/throttle';

  export default{
    name: 'ElImage',

    mixins: [Locale],

    props: {
      //src    图片源,同原生    string
src: String,
      //fit    确定图片如何适应容器框,同原生 object-fit    string    fill / contain / cover / none / scale-down
fit: String,
      //lazy    是否开启懒加载    boolean    —    false
lazy: Boolean,
      //scroll-container    开启懒加载后,监听 scroll 事件的容器    string / HTMLElement    —    最近一个 overflow 值为 auto 或 scroll 的父元素
scrollContainer: [String, HTMLElement],
      //alt    原生 alt    string
alt: String
    },

    data() {
      return{
        loading: true,
        error: false,
        show: !this.lazy
      };
    },

    watch: {
      //监听src变化,加载新图片
src: {
        handler(val) {
          this.show && this.loadImage(val);
        },
        immediate: true},
      //show变化,加载新图片
show(val) {
        val && this.loadImage(this.src);
      }
    },

    mounted() {
      //初始化如果有lazy,执行滚动监听
      this.lazy && this.addLazyLoadListener();
    },

    beforeDestroy() {
      this.lazy && this.removeLazyLoadListener();
    },

    methods: {
      //加载图片
loadImage(val) {
        //reset status
        this.loading = true;
        this.error = false;

        const img = newImage();
        img.onload = this.handleLoad.bind(this);
        img.onerror = this.handleError.bind(this);
        img.src =val;
      },
      //load    图片加载成功触发    (e: Event)
handleLoad(e) {
        this.loading = false;
        this.$emit('load', e);
      },
      //error    图片加载失败触发    (e: Error)
handleError(e) {
        this.loading = false;
        this.error = true;
        this.$emit('error', e);
      },
      //如果滚动元素还在当前组件内,移除监听
handleLazyLoad() {
        if(isInContainer(this.$el, this._scrollContainer)) {
          this.show = true;
          this.removeLazyLoadListener();
        }
      },
      //添加滚动监听
addLazyLoadListener() {
        if(this.$isServer) return;

        const { scrollContainer } = this;
        let _scrollContainer = null;

        if(isHtmlElement(scrollContainer)) {
          _scrollContainer =scrollContainer;
        } else if(isString(scrollContainer)) {
          _scrollContainer =document.querySelector(scrollContainer);
        } else{
          _scrollContainer =getScrollContainer(this.$el);
        }

        if(_scrollContainer) {
          this._scrollContainer =_scrollContainer;
          //节流函数,每隔200ms检测一次加载完毕事件移除监听
          this._lazyLoadHandler =throttle(200, this.handleLazyLoad);
          //绑定到滚动元素,监听元素滚动事件
on(_scrollContainer, 'scroll', this._lazyLoadHandler);
          //首次执行
          this.handleLazyLoad();
        }
      },
      //移除滚动监听
removeLazyLoadListener() {
        const { _scrollContainer, _lazyLoadHandler } = this;

        if(this.$isServer || !_scrollContainer || !_lazyLoadHandler) return;

        off(_scrollContainer, 'scroll', _lazyLoadHandler);
        this._scrollContainer = null;
        this._lazyLoadHandler = null;
      }
    }
  };
</script>

免责声明:文章转载自《element Image组件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇微信小程序插件使用【Android】让你的安卓app国际化、支持语言自动切换下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Selenium3+python3--如何定位鼠标悬停才显示的元素

做自动化定位元素的时候,经常会碰到一个场景:鼠标放在某个元素上面的时候,我们需要定位的元素才显示出来。 例如: 其实如果用robotframework这个问题就很好解决, 直接用关键字:mouse over 那么,用python3该如何解决呢? 其实也简单。 解决办法: 引入鼠标的操作方法。 from selenium import webdriverf...

selenium webdriver 执行原理

selenium webdriver源码结构 Python版的源码结构,只看webdriver相关 selenium-masterpyseleniumwebdriver emote 下的文件 |-- command.py 命令相关...

EJB3 阶段总结+一个EJB3案例 (2)

这篇博文接着上一篇博文的EJB案例。 在上一篇博文中,将程序的架构基本给描述出来了,EJB模块分为5层。 1)DB层,即数据库层     在则一部分,我使用的数据库为mysql。在EJB程序中,访问数据库是通过Jboss中配置好的数据源进行的,然后在数据库中建立相应的数据库,不用建立表,在程序中使用JPA后通过Jboss启动会自动在数据库中间表     具...

C语言两个libxml2库使用的问题

最近使用libxml2想做点东西,翻看一些example后还是有些疑问,去segmentfault问了下,感谢@pingjiang的热心解答,问题解决,记录如下 (一)如下是一个XML文件,p为根结点 <p> <one>1</one> <two>2</two> <th...

未分类[selenium] 玩转python selenium鼠标键盘操作(ActionChains)

摘自-脚本之家,作者:huilan_same,如有版权问题请及时联系本人,谢谢.  用selenium做自动化,有时候会遇到需要模拟鼠标操作才能进行的情况,比如单击、双击、点击鼠标右键、拖拽等等。而selenium给我们提供了一个类来处理这类事件——ActionChains selenium.webdriver.common.action_chains.A...

Selenium 实现鼠标悬浮

http://blog.csdn.net/huilan_same/article/details/52305176 #ActionChains基本用法 from selenium import webdriver from selenium.webdriver.common.action_chains import * import time dri...