vue3.0+plus上传图片后隐藏上传图标

这篇博客介绍了如何使用 Vue 和 Element UI 实现图片上传功能,特别是当上传图片达到限制数量时动态隐藏上传按钮,以及在移除图片后重新显示。通过 `v-if` 和 `v-else` 指令结合动态 class 管理上传按钮的显示状态,并通过 `on-change`、`on-remove` 事件处理图片列表的变化。同时,博客还涉及了图片预览、大小限制、上传成功回调等细节。

我这的需求是上传三张图片之后就不显示上传按钮,如果移除了某一张图片上传按钮继续展示
这里是通过动态的class来变化的

 				<el-upload
                      v-if="state.fileHandleList.length == 0"
                      :action="global.Global + '/sysoss/upload'"
                      :class="{
                        uoloadSty: state.showHandleImg,
                        disUoloadSty: state.noneHandleUrl,
                      }"
                      list-type="picture-card"
                      :limit="3"
                      :on-preview="handlePictureCardPreview"
                      :on-remove="handleRemove"
                      :headers="headerObj"
                      :before-upload="beforeUploadImg"
                      :on-success="handleImageSuccess"
                      :data="filePath"
                      :on-exceed="handleExceed"
                      :on-change="imgHandleChange"
                    >
                      <el-icon><Plus /></el-icon>
                    </el-upload>
                    <el-upload
                      v-else
                      :action="global.Global + '/sysoss/upload'"
                      :class="{
                        uoloadSty: state.showHandleImg,
                        disUoloadSty: state.noneHandleUrl,
                      }"
                      list-type="picture-card"
                      :limit="3"
                      :on-preview="handlePictureCardPreview"
                      :on-remove="handleRemove"
                      :headers="headerObj"
                      :before-upload="beforeUploadImg"
                      :on-success="handleImageSuccess"
                      :data="filePath"
                      :on-exceed="handleExceed"
                      :on-change="imgHandleChange"
                    >
                      <el-icon><Plus /></el-icon>
                    </el-upload>
<style>
.uoloadSty .el-upload--picture-card {
  width: 100px;
  height: 100px;
  line-height: 100px;
}
.disUoloadSty .el-upload--picture-card {
  display: none; /* 上传按钮隐藏 */
}
</style>

下面是让css动态起来的方法

// 处理-上传图片-------------------------showHandleImg  noneHandleUrl 控制的显示隐藏------------
const handlePictureCardPreview = (file, fileList) => {
  dialogImageUrl.value = file.response.data.url;
  state.dialogVisible = true;
};
const imgHandleChange = (file, fileList) => {
  state.noneHandleUrl = fileList.length >= state.limitHandleUrl;
};
const handleExceed = (res, file) => {
  ElMessage.error("最多上传三张图片");
};
const handleRemove = (file, fileList) => {
  state.noneHandleUrl = fileList.length >= state.limitHandleUrl;
  let arr = fileList.map((item) => {
    return item.response.data.url;
  });
  handleForm.handle_pic = arr;
};
const beforeUploadImg = (file) => {
  const isImg = /^image\/(jpeg|png|jpg)$/.test(file.type);
  const isLt2M = file.size / 1024 / 1024 < 2;
  if (!isImg) {
    ElMessage({
      message: "上传图片格式不对哦",
      type: "warning",
    });
    return false;
  }
  if (!isLt2M) {
    ElMessage({
      message: "上传图片大小不能超过 2MB!",
      type: "warning",
    });
    return false;
  }
  return isImg && isLt2M;
};
const handleImageSuccess = (res, fileList) => {
  // console.log(res, "file");
	//上传成功之后放到囊中
  handleForm.handle_pic.push(res.data.url);
  ElMessage.success("上传成功");
};
<think>我们正在处理一个关于Vue3.0和Element Plus的问题,用户想要实现一个下拉框表格组件。根据引用内容,我们可以获取一些关键信息:1.引用[1]中提到ElementPlus的下拉框、日期等组件使用Popover,并可以通过设置`:teleported="false"`来解决定位问题。2.引用[2]和[3]展示了如何封装ElementPlus的表格组件以及如何结合日期选择器进行前端筛选。 用户的需求是实现一个“下拉框表格组件”。这听起来像是需要在一个下拉框中展示表格数据,而不是传统的简单选项。ElementPlus的`<el-select>`组件通常用于展示一组选项(每个选项是简单的文本或图标),但用户可能需要在下拉框中展示一个表格(多行多列的数据)。在ElementPlus中,我们可以通过自定义`<el-select>`的选项模板来实现复杂内容。具体来说,就是使用`<el-option>`的插槽来自定义选项内容。这样,我们可以在一个选项里放置一个表格。但是,需要注意的是,下拉框的宽度和高度通常有限,展示表格可能需要调整样式,比如设置下拉框的宽度足够大,以及设置表格的样式(如紧凑模式)。 另外,引用[1]中提到,如果遇到定位问题(例如下拉框被遮挡或位置不正确),可以在`<el-select>`上设置`:teleported="false"`。因此,实现步骤大致如下:1.使用`<el-select>`组件,并设置`:teleported="false"`(如果需要解决定位问题)。 2.在`<el-select>`内部,使用`<el-option>`循环生成选项,但每个选项使用自定义模板(通过`#default`插槽)。 3.在自定义模板中,放置一个表格(可以使用ElementPlus的`<el-table>`组件)。 4.注意:由于每个选项是一个表格行,但这里我们实际上是在一个下拉框中展示整个表格(即一个选项对应整个表格?)。这可能需要重新考虑设计。实际上,更常见的需求是在下拉框中展示一个表格,让用户选择表格中的某一行。那么,整个下拉框的内容就是一个表格,而每个选项就是表格的一行。然而,ElementPlus的`<el-select>`组件设计上是一个选择器,每个选项是独立的。如果我们想要在下拉框中展示一个表格,那么整个下拉框应该只包含一个表格,也就是说,这个下拉框实际上是一个表格的弹出层。因此,我们可以不使用`<el-select>`,而是使用`<el-popover>`或`<el-dropdown>`来模拟下拉框,内部放置表格。 但是,用户明确提到了“下拉框表格组件”,所以我们考虑两种实现方式:-方式一:使用`<el-select>`自定义选项,每个选项是表格的一行(这样选项就是一行行表格行)。但这样表头无法显示。-方式二:使用`<el-popover>`或`<el-dropdown>`来创建一个弹出层,内部包含一个完整的表格(包括表头)。考虑到表格通常需要表头,方式二更合适。不过,我们也可以参考Element Plus中的`<el-cascader>`组件,它支持级联选择,并且可以自定义内容,但同样不支持表格。 实际上,ElementPlus提供了一个`<el-table>`组件,我们可以将其放入一个弹出框中,然后通过一个输入框或按钮触发弹出框,选择表格中的一行后,将选中的行数据展示在输入框中,并关闭弹出框。这类似于下拉选择,但内容是一个表格。 因此,我们可以这样实现: 1.使用一个输入框(或使用`<el-input>`)作为触发元素,当点击输入框时,弹出表格。2.使用`<el-popover>`或`<el-dialog>`来包裹表格,但这里为了类似下拉框的效果,使用`<el-popover>`更合适。3.在弹出层中放置`<el-table>`,并设置表格的数据和列。 4.当用户点击表格中的某一行时,将这一行的数据作为选择的值,并更新输入框的显示,同时关闭弹出层。 但是,ElementPlus的`<el-popover>`组件可以轻松实现弹出效果,并且可以绑定到输入框上。 然而,引用[1]中提到了`:teleported="false"`,这是因为ElementPlus的弹出层默认会插入到body上,可能导致定位问题。所以我们在使用`<el-popover>`时也可以设置这个属性。下面,我们将按照使用`<el-popover>`和`<el-table>`来实现一个下拉表格组件的示例。 示例代码:```html<template><div><!--使用el-popover来触发表格弹出--><el-popover:width="600"placement="bottom-start"trigger="click":teleported="false"><template #reference><!--触发popover的输入框,显示选中的值 --><el-inputv-model="selectedValue"placeholder="请选择"readonly@click="handleInputClick"/></template><!--在popover的内容中放置表格 --><el-table:data="tableData"style="width:100%"@row-click="handleRowClick"><el-table-column prop="date" label="日期" width="180" /><el-table-column prop="name" label="姓名" width="180" /><el-table-column prop="address" label="地址" /></el-table></el-popover></div> </template><script setup> import{ ref} from&#39;vue&#39;; constselectedValue =ref(&#39;&#39;); //用于显示在输入框中的值,可以是选中行的某个属性consttableData= ref([{date:&#39;2016-05-03&#39;,name: &#39;王小虎&#39;,address:&#39;上海市普陀区金沙江路1518弄&#39;,},{date: &#39;2016-05-02&#39;,name:&#39;王小虎&#39;,address: &#39;上海市普陀区金沙江路1518弄&#39;,},{date:&#39;2016-05-04&#39;,name: &#39;王小虎&#39;,address:&#39;上海市普陀区金沙江路1518弄&#39;,},]); consthandleRowClick =(row) =>{//当点击一行时,将选中的值设置为该行的某个字段(例如,这里用name)selectedValue.value= row.name;//注意:这里需要手动关闭popover,但是el-popover没有提供直接关闭的方法,我们可以使用v-model:visible来控制,但上面的示例没有使用visible绑定//因此,我们可以通过给el-popover设置ref,然后调用其方法关闭,或者使用v-model来控制显示//我们修改一下,使用v-model来控制popover的显示};//修改后的代码:使用visible变量控制popover</script> ```上面的示例有一个问题:点击行后无法自动关闭popover。因此,我们需要使用一个变量来控制popover的显示。改进后的代码: ```html<template><div><el-popoverv-model:visible="popoverVisible":width="600"placement="bottom-start"trigger="click":teleported="false"><template#reference><el-inputv-model="selectedValue"placeholder="请选择"readonly/></template><el-table:data="tableData"style="width:100%"@row-click="handleRowClick"><el-table-column prop="date" label="日期" width="180" /><el-table-column prop="name" label="姓名" width="180" /><el-table-column prop="address" label="地址" /></el-table></el-popover></div> </template><script setup> import{ ref} from&#39;vue&#39;; constpopoverVisible =ref(false); constselectedValue= ref(&#39;&#39;); consttableData= ref([...]); //同上consthandleRowClick =(row) =>{selectedValue.value =row.name;popoverVisible.value =false;//关闭popover}; </script>``` 这样,当用户点击表格行时,popover会自动关闭。另外,我们也可以使用`<el-dropdown>`,但它通常用于下拉菜单(菜单项是按钮或操作),不太适合放置表格。所以使用`<el-popover>`更灵活。 如果用户希望实现的是在`<el-select>`中每个选项都是一个表格行,那么可以这样:```html<template><el-select v-model="selectedValue" :teleported="false" placeholder="请选择"><el-optionv-for="item intableData":key="item.date":label="item.name":value="item.name"><!--自定义选项内容--><divstyle="display:flex;width:100%"><divstyle="width:180px">{{item.date}}</div><divstyle="width:180px">{{item.name}}</div><divstyle="flex:1">{{ item.address }}</div></div></el-option></el-select> </template><script setup> import{ ref} from&#39;vue&#39;; constselectedValue= ref(&#39;&#39;); consttableData= ref([...]); //同上</script>``` 但是,这种方式没有表头,而且选项的样式需要手动调整成表格样式,并且下拉框的宽度需要设置足够大(可以通过设置`style`属性或类名调整)。用户可以根据实际需求选择不同的实现方式。 综上所述,我们提供了两种实现方法: 1.使用`<el-popover>`和`<el-table>`实现一个完整的表格选择器。2.使用`<el-select>`和自定义选项模板模拟表格行。根据用户的具体需求(是否需要表头、多列展示等),可以选择合适的方式。最后,生成相关问题。</think>在 Vue 3.0 中结合 Element Plus 实现下拉框表格组件,可以通过以下两种主流方法实现: ### 方法一:使用 `<el-select>` 自定义选项模板 ```html <template> <el-select v-model="selectedValue" :teleported="false" placeholder="请选择" @visible-change="handleDropdownToggle" > <el-option :value="null" label="" style="height: auto; padding: 0;"> <!-- 表格组件 --> <el-table :data="tableData" style="width: 100%" @row-click="handleRowSelect" > <el-table-column prop="id" label="ID" width="80" /> <el-table-column prop="name" label="名称" /> <el-table-column prop="status" label="状态"> <template #default="{ row }"> <el-tag :type="row.status ? &#39;success&#39; : &#39;danger&#39;"> {{ row.status ? &#39;启用&#39; : &#39;停用&#39; }} </el-tag> </template> </el-table-column> </el-table> </el-option> </el-select> </template> <script setup> import { ref } from &#39;vue&#39;; const selectedValue = ref(&#39;&#39;); const tableData = ref([ { id: 1, name: &#39;选项一&#39;, status: true }, { id: 2, name: &#39;选项二&#39;, status: false } ]); // 行选择处理 const handleRowSelect = (row) => { selectedValue.value = row.id; }; // 控制下拉框显示(解决点击表格关闭问题) const handleDropdownToggle = (visible) => { if (!visible && !selectedValue.value) { selectedValue.value = null; } }; </script> ``` **关键点说明**: 1. `:teleported="false"`:解决下拉框定位异常问题[^1] 2. 空值选项技巧:使用 `:value="null"` 选项作为表格容器 3. 行点击事件:通过 `@row-click` 捕获选择操作 4. 显隐控制:`@visible-change` 处理选择后的关闭逻辑 ### 方法二:使用 `<el-popover>` 封装独立组件 ```html <template> <div> <!-- 触发按钮 --> <el-input v-model="displayText" readonly placeholder="请选择" @click="popoverVisible = true" /> <!-- 表格弹出层 --> <el-popover v-model:visible="popoverVisible" :teleported="false" placement="bottom" trigger="click" :width="600" > <el-table :data="tableData" highlight-current-row @current-change="handleSelection" > <el-table-column prop="id" label="ID" width="80" /> <el-table-column prop="name" label="名称" /> <el-table-column label="操作" width="100"> <template #default="{ row }"> <el-button size="small" @click="selectItem(row)">选择</el-button> </template> </el-table-column> </el-table> </el-popover> </div> </template> <script setup> import { ref, computed } from &#39;vue&#39;; const popoverVisible = ref(false); const selectedItem = ref(null); const displayText = computed(() => selectedItem.value ? `${selectedItem.value.name} (ID: ${selectedItem.value.id})` : &#39;&#39; ); const selectItem = (row) => { selectedItem.value = row; popoverVisible.value = false; }; </script> ``` ### 注意事项 1. **定位问题**:所有弹出类组件需添加 `:teleported="false"` 避免定位异常[^1] 2. **表格高度**:外层容器需设置明确高度(如 `h100` 类)保证表格正常渲染[^2] 3. **数据绑定**:使用 Vue 3 的 `ref` 和 `computed` 实现响应式数据绑定 4. **性能优化**:大数据量时建议添加分页组件(参考 `el-pagination`) 5. **样式覆盖**:通过 `popper-class` 自定义下拉框样式 ```css /* 调整下拉框内表格样式 */ .el-select-dropdown__list { padding: 0 !important; } .el-table__body { cursor: pointer; } ``` ### 应用场景 1. 带复杂信息的选项选择(如商品列表) 2. 需要展示多列数据的筛选器 3. 状态/操作集成的选择控件 4. 数据量较小的表格内联选择 > **提示**:方法一适合轻量级数据展示,方法二更适合复杂交互场景。实际开发中可根据需求结合 Element Plus 的 `<el-pagination>`[^2] 和日期组件[^3] 实现更强大的表格筛选功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值