List.vue 2.17 KB
<!--
<template>
  <div :class="[prefixCls]">
    <ul>
      <slot></slot>
      <template v-for="item in filterEmpty($slots.default).slice(0, 3)"></template>


      <template v-if="maxLength > 0 && filterEmpty($slots.default).length > maxLength">
        <avatar-item :size="size">
          <avatar :size="size !== 'mini' && size || 20" :style="excessItemsStyle">{{ `+${maxLength}` }}</avatar>
        </avatar-item>
      </template>
    </ul>
  </div>
</template>
-->

<script>
import Avatar from 'ant-design-vue/es/avatar'
import AvatarItem from './Item'
import {filterEmpty} from '@/components/_util/util'

export default {
  AvatarItem,
  name: "AvatarList",
  components: {
    Avatar,
    AvatarItem
  },
  props: {
    prefixCls: {
      type: String,
      default: 'ant-pro-avatar-list'
    },
    /**
     * 头像大小 类型: large、small 、mini, default
     * 默认值: default
     */
    size: {
      type: [String, Number],
      default: 'default'
    },
    /**
     * 要显示的最大项目
     */
    maxLength: {
      type: Number,
      default: 0
    },
    /**
     * 多余的项目风格
     */
    excessItemsStyle: {
      type: Object,
      default: () => {
        return {
          color: '#f56a00',
          backgroundColor: '#fde3cf'
        }
      }
    }
  },
  data() {
    return {}
  },
  methods: {
    getItems(items) {
      const classString = {
        [`${this.prefixCls}-item`]: true,
        [`${this.size}`]: true
      }

      if (this.maxLength > 0) {
        items = items.slice(0, this.maxLength)
        items.push((<Avatar size={this.size} style={this.excessItemsStyle}>{`+${this.maxLength}`}</Avatar>))
      }
      const itemList = items.map((item) => (
        <li class={classString}>{item}</li>
      ))
      return itemList
    }
  },
  render() {
    const {prefixCls, size} = this.$props
    const classString = {
      [`${prefixCls}`]: true,
      [`${size}`]: true,
    }
    const items = filterEmpty(this.$slots.default)
    const itemsDom = items && items.length ? <ul class={`${prefixCls}-items`}>{this.getItems(items)}</ul> : null

    return (
      <div class={classString}>
        {itemsDom}
      </div>
    )
  }
}
</script>