<template>
  <div id="upload">
    <el-upload
      v-if="url"
      ref="upload"
      :action="url"
      :list-type="listType"
      :file-list="fileList"
      :limit="limit"
      :on-exceed="outLimit"
      :on-preview="handlePictureCardPreview"
      :on-remove="handleRemove"
      :on-success="onSuccess"
      :show-file-list="showList"
      :accept="accept"
    >
      <el-button size="small" type="primary" v-if="isBtn">点击上传</el-button>
      <template v-else>
        <i class="el-icon-plus"></i>
      </template>
      <template #tip v-if="tip">
        {{ tip }}
      </template>
    </el-upload>
    <el-dialog :visible.sync="dialogVisible">
      <img width="100%" :src="dialogImageUrl" alt="" />
    </el-dialog>
  </div>
</template>

<script>
import _ from 'lodash';
export default {
  name: 'upload',
  props: {
    url: { type: null },
    limit: { type: Number },
    data: { type: null },
    type: { type: String },
    isBtn: { type: Boolean, default: false },
    showList: { type: Boolean, default: true },
    accept: { type: String },
    tip: { type: String, default: undefined },
    listType: { type: String, default: 'picture-card' },
  },
  components: {},
  data: () => ({
    dialogVisible: false,
    dialogImageUrl: '',
    fileList: [],
  }),
  created() {
    if (this.data) {
      this.defalutProcess(this.data);
    }
  },
  watch: {
    data: {
      handler(val) {
        this.defalutProcess(val);
      },
    },
  },
  computed: {},
  methods: {
    handlePictureCardPreview(file) {
      this.dialogImageUrl = file.url;
      this.dialogVisible = true;
    },
    handleRemove(file) {
      this.$emit('upload', { type: this.type, data: file });
      return true;
    },
    outLimit() {
      this.$message.error('只允许上传1个文件');
    },
    onSuccess(response, file, fileList) {
      //将文件整理好传回父组件
      this.$emit('upload', { type: this.type, data: response });
    },
    defalutProcess(val) {
      if (typeof val === 'object' && _.get(val, length) !== undefined && val.length > 0) {
        let newArr = [];
        val.map(item => {
          let object = {};
          object.name = item.name;
          object.url = `${item.uri}`;
          newArr.push(object);
        });
        this.$set(this, `fileList`, newArr);
      } else if (typeof val === 'object' && _.get(val, length) === undefined) {
        let object = {};
        object.name = val.name;
        object.url = `${val.uri}`;
        this.$set(this, `fileList`, [object]);
      } else if (typeof val === 'string') {
        this.$set(this, `fileList`, [{ name: '附件', url: val }]);
      }
    },
  },
};
</script>

<style lang="less" scoped></style>