element源码解析(3) -- AutocompleteSuggestions

element源码解析(3) – AutocompleteSuggestions

template

<template>
  <transition name="el-zoom-in-top" @after-leave="doDestroy">
    <div
      v-show="showPopper"
      class="el-autocomplete-suggestion el-popper"
      :class="{ 'is-loading': !parent.hideLoading && parent.loading }"
      :style="{ width: dropdownWidth }"
      role="region">
      <el-scrollbar
        tag="ul"
        wrap-class="el-autocomplete-suggestion__wrap"
        view-class="el-autocomplete-suggestion__list">
        <li v-if="!parent.hideLoading && parent.loading"><i class="el-icon-loading"></i></li>
        <slot v-else>
        </slot>
      </el-scrollbar>
    </div>
  </transition>
</template>

三层dom结构,过渡动画transition,是否显示列表建议,滚动内容
1.transition
过渡名name为el-zoom-in-top,从顶部开始Y轴方向放大
默认透明度为0,大小为0
进入时恢复设置值
在这里插入图片描述

.el-zoom-in-top-enter-active,
.el-zoom-in-top-leave-active {
  opacity: 1;
  transform: scaleY(1);
  transition: $--md-fade-transition;
  transform-origin: center top;
}
.el-zoom-in-top-enter,
.el-zoom-in-top-leave-active {
  opacity: 0;
  transform: scaleY(0);
}

2.是否显示建议列表
v-show=“showPopper”
3.溢出隐藏滚动条
加载加载状态或插槽

script

import

导入一个组件两个混入

  import Popper from 'element-ui/src/utils/vue-popper';
  import Emitter from 'element-ui/src/mixins/emitter';
  import ElScrollbar from 'element-ui/packages/scrollbar';

data

data() {
      return {
        parent: this.$parent,
        dropdownWidth: ''
      };
    },

parent 获取整个父组件

dropdownWidth 下拉列表宽度

props

两个属性,没太大用处

props: {
      options: {
        default() {
          return {
            gpuAcceleration: false
          };
        }
      },
      id: String
    },

生命周期

updated

监听更新钩子,调用混入popper方法

this.$nextTick(_ => {
        this.popperJS && this.updatePopper();
      });

mounted

当前dom元素赋给popperElm

this.$parent.popperElm = this.popperElm = this.$el;
      this.referenceElm = this.$parent.$refs.input.$refs.input;
      this.referenceList = this.$el.querySelector('.el-autocomplete-suggestion__list');
      this.referenceList.setAttribute('role', 'listbox');
      this.referenceList.setAttribute('id', this.id);

created

根据父组件监听建议列表是否可见时,广播visible事件,获取当前val和下拉列表宽度,与父组件保持一致;

this.$on('visible', (val, inputWidth) => {
        this.dropdownWidth = inputWidth + 'px';
        this.showPopper = val;
      });

methods

父组件监听item-click,但没见这组件里面何处用到了

 select(item) {
        this.dispatch('ElAutocomplete', 'item-click', item);
      }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值