標簽:bottom radius review length otto position multi hang and
# el-upload上传列表实现 展开 收起 |
---|
#### 无图言*,所以先上最终效果图(想参考代码的可以直接滑到最后) |
![]() |
### 具体实现思路?? |
注意: 每个人的项目环境以及需求,都不尽相同,所以这里仅仅提供思路. |
#### 看看没有收起之前?? |
![]() |
可以看到,沒有實現收起之前,如果一直上傳文件,文件列表會一直向下延伸....... |
如果需求的上傳數量少的話,還可以接受,但是,讓我們看看需求 |
![]() |
???? 30 张 |
![]() |
可見,爲了盡可能的減少對頁面的影響,只能弄個展開以及收起了! |
#### 思考?? |
展開以及收起,無非是控制顯示數量,那麽我們就要對症下藥,先看看什麽屬性與上傳的文件數量有關 |
这时候我们就要去看 element-ui 的文档了 |
这里可以看到 file-list 这个属性与我们的上传文件列表有关,那我们就从它下手! |
这里我们用 slice() 方法 试试 |
關鍵代碼: |
注意:我這因爲有多項附件要上傳,所以列表是個數組 |
相應的每一項是一個item,所以這裏item.accessory才是我圖片存儲的地方 |
根據你們的實際數據格式看著來,不要完全照抄 |
```vue |
:file-list="item.accessory.slice(0, 1)" |
``` |
![]() |
隨後可以看到,不管我們怎麽上傳圖片,只會顯示第一張 |
那麽到這裏,我們限制顯示數量的需求達到了 |
然後不要著急,這時候我們先去弄個按鈕出來,飯要一口一口吃嘛 |
關鍵代碼: |
```vue |
// textFlg 是我自定的 类似于开关 |
<div v-show="item.accessory.length > 1" class="more" @click="res=>{item.textFlg = !item.textFlg}"> |
``` |
这个按钮的整体思路是,只有上传图片大于1张才显示; 默认显示当前上传的文件数量-1;每当点击之后,切换状态. |
![]() |
之後就能實現這種效果,樣式啥的我就不在這裏展開了,主要是傳遞一個思路! |
限制顯示數量又了,切換效果有了,那麽現在就剩展開了! |
上面我們這條代碼嗎? |
```vue |
:file-list="item.accessory.slice(0, 1)" |
``` |
这里我们将 slice() 方法 的第二个参数 固定成了 1 ; 这样就始终只显示一条! |
那麽我們要是根據某個狀態來切換這個1,不就達到我們想要的展開了嘛? |
說幹就幹! |
经过一番摸索之后! 实现了切换显示数量 |
```vue |
:file-list="item.accessory.slice(0, item.textFlg ? item.accessory.length : 1)" |
``` |
这里三元表达式的意思是 textFlg === true 吗? 如果为true 就显示与上传列表数组长度相等的数据 :(否则) 显示1 |
textFlg 就是我们用来控制按钮文字的状态,所以毫无疑问他们俩可以共用! |
至此,我們就實現了如最終效果圖的切換 |
![]() |
以上,就是大概的實現思路,當然例如樣式之類的等等細節,本文都選擇直接略過,還請諒解. |
最後我會貼出我的所有代碼,以及數據格式. |
當然,這肯定不是最優解,不過這是我的思路,有別的觀點或者解決方案歡迎討論~ |
### 仅供参考! 仅供参考! 仅供参考!?? |
我的數據格式: |
```json |
details:[ |
textFlg: false, |
] |
``` |
我的示例源碼: |
```vue |
<el-upload |
ref="upload" |
list-type="text" |
:style="{ width: item.accessory.length > 1 ? ‘140px‘ : ‘100%‘ }" |
:action="$store.state.config.uploadConfig.actionUrl" |
:headers="{ Authorization: Bearer ${$store.state.token} }" |
:on-preview="handlePreview" |
:auto-upload="true" |
:file-list="item.accessory.slice(0, item.textFlg ? item.accessory.length : 1)" |
:on-success=" |
(res, file) => { |
return handleSuccess(res, i, file) |
} |
" |
:on-remove="handleRemove" |
:before-upload="beforeAvatarUpload" |
multiple |
:limit="30" |
:on-exceed="handleExceed" |
:disabled="!isEdit" |
> |
<div v-show="item.accessory.length > 1" class="more" @click="more(item)"> |
{{ item.textFlg ? ‘收起‘ : +${item.accessory.length - 1} }} |
``` |
樣式: |
```css |
.more { |
margin: 0 0 0 110px; |
cursor: pointer; |
width: 45px; |
height: 20px; |
background: #ebeef5; |
text-align: center; |
border-radius: 5px; |
position: absolute; |
bottom: 12px; |
right: 5px; |
} |
``` |
如果能幫到你,是我最大的榮幸! |
標簽:bottom radius review length otto position multi hang and
原文地址:https://www.cnblogs.com/mosaicMask/p/14965568.html