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

Vue3+ElementPlus封裝圖片空間組件的門面實例

 更新時間:2024年09月18日 10:26:46   作者:勿語&  
圖片空間是用于管理上傳圖片的工具,可以讓用戶方便地存儲、管理和調(diào)用圖片,提高工作效率,它通常具備多樣的樣式,但操作入口統(tǒng)一,便于使用,通過圖片空間組件,用戶能直接在其他模塊(例如商品圖片)中選擇所需圖片

什么是圖片空間?

圖片空間就是專門管理我們上傳圖片的地方。

就好比用戶管理一樣,我們對要上傳的圖片進行管理。

這樣做的好處有哪些?

我們把可能需要的圖片都上傳到圖片管理中。在其他需要圖片的地方(如:商品圖片等)可以直接調(diào)用圖片空間組件,從圖片空間中進行選擇。

圖片空間的樣式多種多樣,但是它們的入口都是一樣的,所以這里封裝了圖片空間的門面。

1.PictureSpaceFacade.vue 組件

<script setup>
const props=defineProps({
  // 圖片數(shù)組或字符串(http://a.com/1.jpg,http://a.com/2.jpg 用逗號隔開)
  modelValue: {
    type: [Array,String,Object],
  },
  // 圖片寬度
  pictureWidth: {
    type:String,
    default: '100px'
  },
  // 圖片高度
  pictureHeight:{
    type:String,
    default: '100px'
  }
})

const emits=defineEmits(['update:modelValue'])

import {ref, watch} from "vue";

// 圖片數(shù)組
const pictureList = ref([])

// 監(jiān)聽props.modelValue變化
watch(() => props.modelValue, (newValue) => {
  if (newValue){
    pictureList.value=Array.isArray(newValue) ? newValue : props.modelValue.split(",");
  }else{
    pictureList.value = []
  }
},{deep:true,immediate:true})

// 預(yù)覽圖片開關(guān)
const previewVisible = ref(false)
// 預(yù)覽圖片url
const previewImageUrl = ref('')
// 點擊預(yù)覽圖片按鈕回調(diào)
function previewPicture(url) {
  previewVisible.value = true
  previewImageUrl.value = url
}
// 點擊刪除圖片按鈕回調(diào)
function deletePicture(url) {
  pictureList.value = pictureList.value.filter(item => url !== item)
  emits('update:modelValue', pictureList.value)
}

</script>

<template>
  <div id="app">
    <div class="container">
      <div class="container-item" :style="{width:pictureWidth ,height:pictureHeight}" v-for="item in pictureList" :key="item">
        <img class="img-item" :src="item" alt=""/>
        <div class="overlay">
          <span class="opt" @click="previewPicture(item)">預(yù)覽</span>
          <span class="opt" @click="deletePicture(item)">刪除</span>
        </div>
      </div>
      <div class="container-item add-container" :style="{width:pictureWidth ,height:pictureHeight}">
        <slot>+</slot>
      </div>
    </div>

    <!--    圖片預(yù)覽-->
    <el-dialog v-model="previewVisible" style="overflow: auto">
      <div style="height: 100%; width: 100%; display: flex; justify-content: center; align-items: center;">
        <img style="object-fit: cover; height: 100%; width: 100%;" :src="previewImageUrl" alt="Preview Image"/>
      </div>
    </el-dialog>

  </div>
</template>
<style scoped lang="scss">

.container {
  display: flex;
  flex-wrap: wrap;
  width: 100%;
}

.container-item {
  height: 150px;
  width: 150px;
  margin: 3px;
  border: 1px solid #cecaca;
  border-radius: 5px;
  overflow: hidden;
  position: relative;

  &:hover .overlay {
    opacity: 1;
  }

  .img-item {
    height: 100%;
    width: 100%;
  }

  .overlay {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: rgba(0, 0, 0, 0.5);
    display: flex;
    justify-content: center;
    align-items: center;
    color: #fff;
    font-size: 14px;
    opacity: 0;
    transition: opacity .5s;

    .opt {
      cursor: pointer;
      margin: 8px;
    }
  }
}

.add-container {
  border: 1px dashed #cecaca;
  cursor: pointer;
  display: flex;
  justify-content: center;
  align-items: center;

  &:hover {
    border: 1px dashed blue;
  }
}
</style>

2.PictureSpaceFacade 組件使用

<script setup>
import {ref} from "vue";
import PictureSpaceFacade from "./components/PictureSpaceFacade.vue";

// 獲取隨機圖片
async function getPicture() {
  const response = await fetch('https://dog.ceo/api/breeds/image/random')
  const res = await response.json()
  return res.message
}

// 圖片數(shù)組
const pictureList = ref([])
// 初始化圖片數(shù)組(準(zhǔn)備測試數(shù)據(jù))
async function initPicture() {
  for (let i = 0; i < 3; i++) {
    pictureList.value.push(await getPicture())
  }
}

// 圖片空間開關(guān)
const pictureSpaceVisible = ref(false)

// 打開圖片空間
function openPictureSpace() {
  pictureSpaceVisible.value = true
}

// 關(guān)閉圖片空間(從圖片空間選擇圖片后對 pictureList進行填充)
async function closePictureSpace() {
  for (let i = 0; i < 2; i++) {
    pictureList.value.push(await getPicture())
  }
  pictureSpaceVisible.value = false
}

initPicture()
</script>
<template>
  <el-row>
    <el-col :span="8">
      <PictureSpaceFacade v-model="pictureList" width="220px" picture-width="100px" picture-height="100px">
        <div style="height: 100%;width: 100%;display: flex;justify-content: center;align-items: center;"
             @click="openPictureSpace">+
        </div>
      </PictureSpaceFacade>
    </el-col>
  </el-row>

  <!--  圖片空間彈出框-->
  <el-dialog v-model="pictureSpaceVisible" title="圖片空間" @close="closePictureSpace">

  </el-dialog>
</template>

<style scoped lang="scss">

</style>

圖片寬度和高度就是圖片自身。

鼠標(biāo)懸浮會出現(xiàn)操作按鈕(這里的文字可以自行修改為icon圖標(biāo))。

點擊圖片添加框,會彈出圖片空間組件供我們選擇。

我們通過選項綁定將pcitureList存入圖片空間,這樣在圖片空間中就能夠修改我們的圖片數(shù)組。

總結(jié)

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

相關(guān)文章

  • vue與原生app的對接交互的方法(混合開發(fā))

    vue與原生app的對接交互的方法(混合開發(fā))

    vue開發(fā)h5項目特別是移動端的項目,很多都是打包后掛載在原生APP上的,這篇文章主要介紹了vue與原生app的對接交互的方法,非常具有實用價值,需要的朋友可以參考下
    2018-11-11
  • Vue跑馬燈marquee組件使用方法詳解

    Vue跑馬燈marquee組件使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Vue跑馬燈marquee組件的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • vue實現(xiàn)搜索小功能

    vue實現(xiàn)搜索小功能

    這篇文章主要為大家詳細(xì)介紹了vue實現(xiàn)搜索小功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • vue router 通過路由來實現(xiàn)切換頭部標(biāo)題功能

    vue router 通過路由來實現(xiàn)切換頭部標(biāo)題功能

    在做單頁面應(yīng)用程序時,一般頁面布局頭尾兩塊都是固定在布局頁面,中間為是路由入口。這篇文章主要介紹了vue-router 通過路由來實現(xiàn)切換頭部標(biāo)題 ,需要的朋友可以參考下
    2019-04-04
  • 淺談VUE監(jiān)聽窗口變化事件的問題

    淺談VUE監(jiān)聽窗口變化事件的問題

    下面小編就為大家分享一篇淺談VUE監(jiān)聽窗口變化事件的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • Vue+Mock.js模擬登錄和表格的增刪改查功能

    Vue+Mock.js模擬登錄和表格的增刪改查功能

    這篇文章主要介紹了Vue+Mock.js模擬登錄和表格的增刪改查功能,需要的朋友可以參考下
    2018-07-07
  • Vue基礎(chǔ)之偵聽器詳解

    Vue基礎(chǔ)之偵聽器詳解

    這篇文章主要為大家介紹了Vue基礎(chǔ)之偵聽器,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • vue-cli如何修改打包項目結(jié)構(gòu)及前綴

    vue-cli如何修改打包項目結(jié)構(gòu)及前綴

    這篇文章主要介紹了vue-cli如何修改打包項目結(jié)構(gòu)及前綴問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Vue Axios異步與數(shù)據(jù)類型轉(zhuǎn)換問題淺析

    Vue Axios異步與數(shù)據(jù)類型轉(zhuǎn)換問題淺析

    總的來說這并不是一道難題,那為什么要拿出這道題介紹?拿出這道題真正想要傳達的是解題的思路,以及不斷優(yōu)化探尋最優(yōu)解的過程。希望通過這道題能給你帶來一種解題優(yōu)化的思路,Axios是一個開源的可以用在瀏覽器端和Node JS的異步通信框架,主要作用就是實現(xiàn)AJAX異步通信
    2023-01-01
  • vue.js 動態(tài)組件詳解

    vue.js 動態(tài)組件詳解

    這篇文章主要介紹了vue.js 動態(tài)組件詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09

最新評論

阜新| 宿迁市| 丰都县| 怀宁县| 泰来县| 武功县| 棋牌| 泗洪县| 宜君县| 湟中县| 翁牛特旗| 桓台县| 阳东县| 正阳县| 鄂州市| 台前县| 茌平县| 鸡西市| 昭苏县| 绥阳县| 丹巴县| 宣城市| 正镶白旗| 施甸县| 镇远县| 青州市| 文化| 武功县| 开化县| 新和县| 鄄城县| 沿河| 九江市| 澄江县| 阳信县| 唐山市| 皮山县| 乌兰察布市| 措美县| 宁河县| 固阳县|