IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> XqUploadCustom -> 正文阅读

[JavaScript知识库]XqUploadCustom

<template>
  <XqFormItem :key="theRowKey" :wrapper="tableLabel?newItem['wrapper']:null">
  <div style="    display: flex;
    flex-wrap: wrap;">
 <draggable
      class="draggable"
      v-model="fileList"
      chosenClass="chosen"
       filter=".forbid"  
      forceFallback="true"
      group="people"
      animation="1000"
      @start="onStart"
      @end="onEnd"
    >
      <div v-for="(item, index) in fileList" :key="index" class="Uploading_img_warps">
        <div class="Uploading_img_warp">
          <div class="Uploading_imgs">
            <div v-if="item.url && limit !== 0" class="masking">
              <div class="maskings">
                <a-icon
               
                  type="eye"
                  class="icon forbid"
                  style="color: #fdfdfd"
                  @click="handlePreview(item)"
                />
               
                <a-icon
                  style="color: #fdfdfd"
                  type="delete"
                  class="icon forbid"
                  @click="ondelete(index)"
                />
              </div>
            </div>
            <img
             
              :src="item.url"
              alt=""
              class="Uploading_img"
            />
          

         
          </div>
        </div>
        <p style="overflow: hidden; white-space: nowrap; text-overflow: ellipsis">
          {{ item.name }}
        </p>
      </div> 

      <XqUpload
      class="forbid"
    :showUploadList="false"
      v-decorator="[
        theRowKey,
        {
          ...newItem['decorator'],
          valuePropName: 'fileList',
          getValueFromEvent: getValue
        }
      ]"
      name="files"
      :form="form"
      :customize="newItem['customize']"
      :defaultFileList="newValue"
      :fileList="fileList"
      :decorator="[
        theRowKey,
        {
          ...newItem['decorator'],
          valuePropName: 'fileList',
          getValueFromEvent: getValue
        }
      ]"
      @change="handleChange"
    >
      <template v-if="showUploadBtn">
        <a-button v-if="listType === 'text' || listType === 'picture'">
          <a-icon type="upload" />
          选择文件
        </a-button>
        <a-icon v-else type="plus" style="font-size: 32px; color: #999" />
      </template>
    </XqUpload>
    </draggable>
   
  </div>
      
    <a-modal :visible="previewVisible" :footer="null" @cancel="handleCancel">
      <img alt="example" style="width: 100%" :src="previewImage" />
    </a-modal>
  </XqFormItem>

</template>
<script>
//导入draggable组件
import draggable from "vuedraggable";
import XqFormItem from "./XqFormItem";
import XqUpload from "./XqUpload";
import { message } from "ant-design-vue";
export default {
  name: "",
  components: {
    XqFormItem,
    XqUpload,
    draggable
  },
  props: {
    form: {
      type: Object,
      default: () => {}
    },
    item: {
      type: Object,
      default: () => {}
    },
    dataSource: {
      type: Object,
      default: () => {}
    },
    editable: {
      type: Boolean,
      default: false
    },
    rowKey: {
      type: String,
      default: ""
    },
    tableLabel: {
      type: Boolean,
      default: () => {
        return false
      }
    }
  },
  data() {
    return {
      previewVisible: false,
      previewImage: "",
      fileList: [],
      defined: false
    };
  },
  computed: {
    newItem() {
      const tempItem = JSON.parse(JSON.stringify(this.item));
      return tempItem;
    },
    theRowKey() {
      return `${this.newItem['model']}${!!this.rowKey ? '_' + this.rowKey : ''}`;
    },
    newValue() {
      if (this.item && this.dataSource) {
        const value = this.dataSource[this.item["model"]];
        const list = this.initList(value);
        return list;
      }
      return [];
    },
    extendConfig() {
      return this.item["extend"];
    },
    size() {
      if(this.extendConfig && this.extendConfig.size) {
        return this.extendConfig.size;
      }
      return false;
    },
    limit() {
      if(this.extendConfig && this.extendConfig.limit) {
        return this.extendConfig.limit;
      }
      return false;
    },
    listType() {
      if(this.item && this.item["customize"] && this.item["customize"]["listType"]) {
        return this.item["customize"]["listType"];
      }
      return "text";
    },
    showUploadBtn() {
      if (this.limit && this.fileList && this.fileList.length >= this.limit) {
        return false;
      }
      return true;
    }
  },
  watch: {
    newValue: {
      handler(newVal) {
        if (newVal && !this.defined) {
          this.fileList = newVal;
          this.defined = true;
        }
      },
      immediate: true
    }
  },
  created() {},
  mounted() {},
  methods: {
    handleCancel() {
      this.previewVisible = false;
    },
     //开始拖拽事件
    onStart() {
      this.drag = true;
    },
    //拖拽结束事件
    onEnd() {
      this.drag = false;
    
      this.dataSource[this.item["model"]]=this.fileList
      this.$emit("change", this.fileList);
     
    },
       ondelete(index) {
      this.fileList.splice(index, 1);
           this.dataSource[this.item["model"]]=this.fileList
           this.$emit("change", this.fileList);
       
    },

     async handlePreview(file) {
      if (!file.url && !file.preview) {
        file.preview = await getBase64(file.originFileObj);
      }
      this.previewImage = file.url || file.preview;
      this.previewVisible = true;
    },
    getValue(e) {
      if(Array.isArray(e)) {
        return e;
      }
      return e && e.fileList;
    },
    handleChange({file, fileList, event}) {
      if(this.size){
        if(file.size / 1024 / 1024 > this.size){
          message.warning("文件体积超出限制,无法上传!")
          return false;
        }
      }
      let tempList = [...fileList];
      if(this.limit){
        tempList = tempList.slice(-this.limit);
      }
      tempList = tempList.map(li => {
        if(li.response && li.response.code === 200) {
          li.url = li.response.data[0]
        }
        return li;
      })   
      this.fileList = tempList;
      this.$emit("change", this.fileList);
     
    },
    initList(values) {
      if(values) {
        const urls = Array.isArray(values) ? values : values.split(",");
        if(urls.length > 0) {
          const tempList = [];
          for(let i = 0; i < urls.length; i++) {
            const url = urls[i];
            if (Object.prototype.toString.call(url) === '[object Object]') {
              tempList.push(url)
            } else {
              const nameArr = url.split("/");
              tempList.push({
                uid: -1 - i,
                name: nameArr[nameArr.length - 1],
                status: "done",
                url: url
              });
            }
          }
          return tempList;
        }
        return [];
      }
      return [];
    }
  }
}
</script>
<style lang="scss">
.uploading {
  width: 104px;
  display: inline-block;
}
.ant-upload-select-picture-card i {
  font-size: 32px;
  color: #999;
}
.clearfix {
  display: flex;
  flex-wrap: wrap;
}
 
.ant-upload-select-picture-card .ant-upload-text {
  margin-top: 8px;
  color: #666;
}
.Uploading_img_warp {
  width: 104px;
  height: 104px;
  border: 1px solid #d9d9d9;
  border-radius: 4px;
  display: flex;
  justify-content: center;
  align-items: center;
}
.Uploading_imgs {
  position: relative;
  width: 90px;
  height: 90px;
  overflow: hidden;
}
.Uploading_img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.masking {
  background-color: rgba(0, 0, 0, 0.5);
  display: none;
  width: 90px;
  height: 90px;
  position: absolute;
  left: 0;
  right: 0;
}
.maskings {
  width: 100%;
  height: 90px;
  display: flex;
  justify-content: center;
  align-items: center;
}
.Uploading_imgs:hover .masking {
  display: block;
}
.Uploading_file {
  display: inline-block;
  font-size: 90px;
  line-height: 90px;
}
.icon {
  cursor: pointer;
  margin: 0 2px;
  color: #fff;
}
.Uploading_img_warps {
  width: 114px;
  margin: 0 8px 8px 0;
}
.Uploading_loading {
  width: 100%;
  height: 90px;
  display: flex;
  justify-content: center;
  align-items: center;
}
.forbid {
  display: inline-block;width: 0%;
}
/*被拖拽对象的样式*/
.item {
  padding: 6px;
  background-color: #fdfdfd;
  border: solid 1px #eee;
  margin-bottom: 10px;
  cursor: move;
}
.draggable {
     display: flex;
    flex-wrap: wrap;
}
/*选中样式*/
.chosen {
  border: solid 1px #3089dc !important;
}</style>

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-16 11:16:35  更:2022-05-16 11:17:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:31:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码