最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue和element上傳圖片以及進(jìn)行拖拽圖片排序問(wèn)題

 更新時(shí)間:2024年08月07日 09:21:34   作者:ing*_*  
這篇文章主要介紹了vue和element上傳圖片以及進(jìn)行拖拽圖片排序問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

需求場(chǎng)景

需求要求進(jìn)行上傳圖片的同時(shí)進(jìn)行排序,使用element的上傳圖片,拖拽使用的是vuedraggable的插件,記錄下

拖拽插件

插件中文翻譯git地址:https://github.com/itmier/Vue.Draggable,具體可去地址瀏覽

對(duì)vuedraggbale的插件進(jìn)行安裝使用:

  • 1.安裝插件
npm i -S vuedraggable
  • 2.局部引入插件(在.vue的文件中);
import draggable from 'uedraggbale'
components: {draggable},
  • 3.使用插件
//imgList:圖片的數(shù)據(jù)數(shù)組,
<draggable v-model="imgList"
          :animation="1000">
   <div v-for="item in imgList" :key="item.id">{{item.name}}</div>
</draggable>

el-upload上傳文件組件

   // 配合element的本身的樣式,不用寫(xiě)樣式。全部代碼
     <template>
  <div class='base-updata'>

    <div class="img-sort">
      <ul class="el-upload-list el-upload-list--picture-card">
        <draggable
          v-model="imgList"
          :animation="1000"
          :sort="true"
          v-if="showDraggable"
        >
          <li
            class="el-upload-list__item is-success animated"
            v-for="(item, index) in imgList"
            :key="index"
            style="margin-right:10px"
          >
            <img
              :src="item.url"
              alt=""
              class="el-upload-list__item is-success"
            >
          <!--   <i class="el-icon-close"></i> -->
            <span class="el-upload-list__item-actions">
              <!-- 預(yù)覽 -->
              <span
                class="el-upload-list__item-preview"
                @click="handlePictureCardPreview(item)"
              >
                <i class="el-icon-zoom-in"></i>
              </span>
              <!-- 刪除 -->
              <span
                class="el-upload-list__item-delete"
                @click="handleRemove(index)"
                  v-if="!disabled">
                <i class="el-icon-delete"></i>
              </span>
            </span>
          </li>
        </draggable>
        <template v-else>
          <li
            class="el-upload-list__item is-success animated"
            v-for="(item, index) in imgList"
            :key="index"
            style="margin-right:10px"
          >
            <img
              :src="item.url"
              alt=""
              class="el-upload-list__item is-success"
            >
            <i class="el-icon-close"></i>
            <span class="el-upload-list__item-actions">
              <!-- 預(yù)覽 -->
              <span
                class="el-upload-list__item-preview"
                @click="handlePictureCardPreview(item)"
              
              >
                <i class="el-icon-zoom-in"></i>
              </span>
              <!-- 刪除 -->
              <span
                class="el-upload-list__item-delete"
                @click="handleRemove(index)"
                  v-if="!disabled"
              >
                <i class="el-icon-delete"></i>
              </span>
            </span>
          </li>
        </template>
      </ul>
      <el-upload
        style="display: inline-block"
        ref="uploadFilemain"
        :show-file-list="false"
        :file-list="imgList"
        list-type="picture-card"
        :before-upload="beforeUpload"
        :http-request="(file, fileList) => requestImgHttps(file)"
        :on-preview="handlePictureCardPreview"
        :limit="limit"
        :disabled="disabled"
        :class="imgList.length == limit ? 'mf' : ''"
      >
        <!--            :disabled="optType == 'detail'" -->
        <i class="el-icon-plus"></i>
      </el-upload>
      <span style="position: relative; top: 116px; left: 10px">{{ imgList.length }} <span v-if="limit
      !=100">{{"/" + limit}}</span> <span v-if="showDraggable">(拖拽排序)</span></span>
    </div>
    <!-- 圖片預(yù)覽 -->
    <el-dialog :visible.sync="dialogVisible">
      <img
        width="100%"
        :src="dialogImageUrl"
        alt=""
      />
    </el-dialog>
  </div>
</template>
<script>
import draggable from "vuedraggable";

export default {
  name: "base-updata",
  components: {draggable},
  props: {
    //圖片列表
    imgList: {
      type: Array,
      default: () => {
        return [];
      },
    },
    //是否顯示拖拽
    showDraggable: {
      type: Boolean,
      default: () => {
        return false;
      },
    },
    //上傳圖片署名
    imgTypeName: {
      type: String,
      Request: true,
    },
    //上傳圖片下標(biāo)
    imgTypeIdex: {
      type: Number,
      Request: true,
    },
    //圖片限制
    limit: {
      type: Number,
       default: () => {
        return 100;
      },
    },
    //圖片禁止
    disabled: {
      type: Boolean,
       default: () => {
        return false;
      },
    },
  },
  data() {
    return {
      dialogVisible: false, //圖片預(yù)覽
    };
  },
  created() {},
  mounted() {},
  methods: {
    //圖片上傳驗(yàn)證
    beforeUpload(file) {
      return new Promise((resolve, reject) => {
        this.changeLimt(file).then((res) => {
          file.isFlag = res;
          if (file.isFlag) {
            return resolve(true);
          } else {
            return reject(false);
          }
        });
      });
    },
    changeLimt(file) {
      const _this = this;
      const isSize = new Promise(function (resolve, reject) {
        const _URL = window.URL || window.webkitURL;
        const img = new Image();
        img.src = _URL.createObjectURL(file);
        img.onload = function () {
          let e_width = img.width >= 600 && img.width <= 1200;
          let e_height = img.height >= 600 && img.height <= 1200;
          if (file.type == "image/png" || file.type == "image/jpg" || file.type == "image/jpeg") {
            const valid = e_width && e_height;
            if (valid) {
              return resolve();
            } else {
              return reject();
            }
          } else {
            return reject();
          }
        };
      }).then(
        () => {
          return true;
        },
        () => {
          _this.$message.warning({
            message: "圖片規(guī)格為jpg或png,建議形狀正方形,尺寸建議800*800像素,最大支持1200*1200像素",
            btn: false,
          });
          return false;
        }
      );

      return isSize;
    },
    //預(yù)覽
    handlePictureCardPreview(file) {
      this.dialogImageUrl = file.url;
      this.dialogVisible = true;
    },
    //刪除
    handleRemove(index) {
      this.$emit("handleRemove", this.imgTypeName, index);
    },
    /**
     * 上傳圖片 請(qǐng)求
     * @param {string} file 圖片文件
     * @param {string} imgTypeName 圖片署名
     * @param {string} imgTypeIdex 圖片位置下標(biāo)
     * @return {Function} 拋出函數(shù)requestImgHttps
     */
    requestImgHttps(file) {
      this.$emit("requestImgHttps", file, this.imgTypeName, this.imgTypeIdex);
    },
  },
};
</script>
<style lang='scss' scoped>
.img-sort {
  display: flex;
  flex-wrap: wrap;
}
.mf {
  ::v-deep .el-upload--picture-card {
    display: none !important;
  }
}
</style>

使用組件

        <el-form-item label="商品輪播圖:" prop="images_circulate" >
          <upload-img
            :imgList="formInfo.images_circulate"
            :limit="5"
            :showDraggable="true"
            :imgTypeName="`swiperImg`"
            @handleRemove="handleRemove"
            @requestImgHttps="requestImgHttps"
            :disabled="$route.query.type == 3?true:false"
          ></upload-img>
        </el-form-item>

    //圖片刪除
    handleRemove(type, index) {
      switch (type) {
        //輪播圖刪除
        case "swiperImg":
          this.formInfo.images_circulate.splice(index, 1);
          break;
        default:
          break;
      }
    },
    //圖片上傳
    requestImgHttps(file, key, index) {
      var formdata = new FormData();
      formdata.append("img", file.file);
      switch (key) {
        case "mainImg":
          this.uploadFile(formdata).then((res) => {
            if (res.code == 200) {
              let ob = { name: "xxx.jpg", url: res.data };
              this.formInfo.image_main.push(ob);
            } else {
              thi s.$message({
                  type: "warning",
                  message: res.msg,
                });
            }
          });
          break;
        default:
          break;
      }
    },

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用vue實(shí)現(xiàn)滑動(dòng)滾動(dòng)條來(lái)加載數(shù)據(jù)

    使用vue實(shí)現(xiàn)滑動(dòng)滾動(dòng)條來(lái)加載數(shù)據(jù)

    在vuejs中,我們經(jīng)常使用axios來(lái)請(qǐng)求數(shù)據(jù),但是有時(shí)候,我們請(qǐng)求的數(shù)據(jù)量很大,那么我們?nèi)绾螌?shí)現(xiàn)滑動(dòng)滾動(dòng)條來(lái)加載數(shù)據(jù)呢,接下來(lái)小編就給大家介紹一下在vuejs中如何實(shí)現(xiàn)滑動(dòng)滾動(dòng)條來(lái)動(dòng)態(tài)加載數(shù)據(jù),需要的朋友可以參考下
    2023-10-10
  • vue開(kāi)發(fā)頁(yè)面自適應(yīng)屏幕尺寸的實(shí)例代碼

    vue開(kāi)發(fā)頁(yè)面自適應(yīng)屏幕尺寸的實(shí)例代碼

    使用vue開(kāi)發(fā)的頁(yè)面都是通過(guò)px設(shè)置它的尺寸,如果換了一個(gè)不同尺寸的屏幕就會(huì)出現(xiàn)頁(yè)面排版錯(cuò)亂,顯示不完整等情況,下面通過(guò)插件將px裝換為rem單位適應(yīng)不同尺寸的屏幕,需要的朋友可以參考下
    2022-12-12
  • element tree懶加載:load="loadNode"只觸發(fā)一次的解決方案

    element tree懶加載:load="loadNode"只觸發(fā)一次的解決方案

    本文主要介紹了element tree懶加載:load="loadNode"只觸發(fā)一次的解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • vue+Echart實(shí)現(xiàn)立體柱狀圖

    vue+Echart實(shí)現(xiàn)立體柱狀圖

    這篇文章主要為大家詳細(xì)介紹了vue+Echart實(shí)現(xiàn)立體柱狀圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Vuex實(shí)現(xiàn)簡(jiǎn)單購(gòu)物車(chē)

    Vuex實(shí)現(xiàn)簡(jiǎn)單購(gòu)物車(chē)

    這篇文章主要為大家詳細(xì)介紹了Vuex實(shí)現(xiàn)簡(jiǎn)單購(gòu)物車(chē),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • 詳解vue中使用axios對(duì)同一個(gè)接口連續(xù)請(qǐng)求導(dǎo)致返回?cái)?shù)據(jù)混亂的問(wèn)題

    詳解vue中使用axios對(duì)同一個(gè)接口連續(xù)請(qǐng)求導(dǎo)致返回?cái)?shù)據(jù)混亂的問(wèn)題

    這篇文章主要介紹了詳解vue中使用axios對(duì)同一個(gè)接口連續(xù)請(qǐng)求導(dǎo)致返回?cái)?shù)據(jù)混亂的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • vue.js源代碼core scedule.js學(xué)習(xí)筆記

    vue.js源代碼core scedule.js學(xué)習(xí)筆記

    這篇文章主要為大家詳細(xì)介紹了vue.js源代碼core scedule.js的學(xué)習(xí)筆記,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 使用vue指令實(shí)現(xiàn)吸頂效果

    使用vue指令實(shí)現(xiàn)吸頂效果

    要想實(shí)現(xiàn)一個(gè)吸頂效果不是很難,網(wǎng)絡(luò)上有很多教程,其中有一種就是通過(guò)fiexd加top來(lái)實(shí)現(xiàn),今天突然就想做一個(gè)吸頂效果,因?yàn)樽罱荚谟胿ue,所以想用vue來(lái)做一個(gè)吸頂效果的案例,感興趣的朋友可以參考下
    2023-11-11
  • vue中echarts圖表大小適應(yīng)窗口大小且不需要刷新案例

    vue中echarts圖表大小適應(yīng)窗口大小且不需要刷新案例

    這篇文章主要介紹了vue中echarts圖表大小適應(yīng)窗口大小且不需要刷新案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • Vue3中頁(yè)面跳轉(zhuǎn)方式總結(jié)

    Vue3中頁(yè)面跳轉(zhuǎn)方式總結(jié)

    Vue.js?是一個(gè)用于構(gòu)建用戶界面的漸進(jìn)式?JavaScript?框架,它提供了多種方法來(lái)實(shí)現(xiàn)頁(yè)面之間的導(dǎo)航,本文將詳細(xì)介紹?Vue?3?中的各種頁(yè)面跳轉(zhuǎn)方式,有需要的小伙伴可以參考一下
    2024-12-12

最新評(píng)論

富顺县| 潜江市| 连南| 镇江市| 大新县| 山东| 福州市| 永登县| 浦江县| 城口县| 岳池县| 新绛县| 师宗县| 乐山市| 华阴市| 沧源| 东港市| 白城市| 鲜城| 镇宁| 聂拉木县| 徐州市| 胶州市| 平顶山市| 宜黄县| 杭锦旗| 密云县| 甘谷县| 吉水县| 孙吴县| 宣化县| 丽江市| 招远市| 沙田区| 莒南县| 平顺县| 宁南县| 盱眙县| 织金县| 武川县| 宾阳县|