网站首页 > 技术文章 正文
在 Vue 3 中,你可以使用 Composition API 来组织和管理你的组件逻辑。当你想要在 el-upload 组件中自定义上传逻辑而不设置 action 属性时,你可以使用 ref 和 watch 来跟踪文件的变化,并在适当的时候执行自定义的上传逻辑。
以下是一个 Vue 3 组件的示例,展示了如何自定义 el-upload 的上传逻辑:
<template>
<el-upload
ref="uploadRef"
:on-change="handleFileChange"
:show-file-list="false"
>
<el-button slot="trigger" size="small" type="primary">选择文件</el-button>
</el-upload>
</template>
<script>
import { ref, watch, onMounted } from 'vue';
import axios from 'axios';
export default {
setup() {
const uploadRef = ref(null);
const selectedFile = ref(null);
// 处理文件变化
const handleFileChange = (file, fileList) => {
selectedFile.value = file.raw; // 获取原始的 File 对象
};
// 自定义上传逻辑
const uploadFile = async () => {
if (!selectedFile.value) {
console.error('没有选择要上传的文件');
return;
}
// 在这里可以添加一些文件类型、大小的校验逻辑
// ...
const formData = new FormData();
formData.append('file', selectedFile.value);
try {
const response = await axios.post('/your-upload-api-url', formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
});
// 处理上传成功后的逻辑
console.log('上传成功', response.data);
} catch (error) {
// 处理上传失败后的逻辑
console.error('上传失败', error);
}
};
// 监听 selectedFile 的变化,并在组件挂载后执行上传逻辑(如果需要)
watch(selectedFile, (newVal) => {
if (newVal) {
uploadFile(); // 当文件被选择时,执行上传逻辑
}
}, { immediate: false }); // immediate: false 表示不在初始时触发
// 在组件挂载后执行其他逻辑(如果需要)
onMounted(() => {
// ...
});
// 返回需要暴露给模板的响应式引用
return {
uploadRef,
handleFileChange
};
}
};
</script>
在这个 Vue 3 组件中:
- 我们使用 ref 创建了两个响应式引用:uploadRef 用于访问 el-upload 组件的实例,selectedFile 用于存储用户选择的文件。
- handleFileChange 方法在文件变化时被调用,并将选中的文件保存到 selectedFile 中。
- uploadFile 方法包含了自定义的上传逻辑,它使用 Axios 发送一个 POST 请求到指定的上传 API 地址。
- 使用 watch 来监听 selectedFile 的变化。当文件被选择时,watch 的回调函数会被触发,并调用 uploadFile 方法执行上传。注意,immediate: false 表示我们不想在组件初始化时立即触发 watch 的回调函数。
- onMounted 钩子函数用于在组件挂载后执行任何必要的逻辑(如果需要的话)。
- 最后,通过 return 语句将 uploadRef 和 handleFileChange 暴露给模板,以便在模板中使用它们。
请确保将 /your-upload-api-url 替换为你实际的后端上传 API 地址,并根据你的需求调整文件选择和上传的逻辑。
猜你喜欢
- 2024-10-17 Vue实战072:CSS样式中的各种深度作用选择器的使用
- 2024-10-17 Vue与Element走过的坑……带上Axios
- 2024-10-17 在Vue开发中出现对话框被遮罩层挡住问题的解决教程
- 2024-10-17 vue里的el-radio怎么监听状态(vue如何监听localstorage)
- 2024-10-17 vue+element 组件el-tab-pane导致router-view加载多次
- 2024-10-17 vue中的select下拉框多选以及多选数据回显
- 2024-10-17 如何让vue+element-ui实现表格checkbox单选
- 2024-10-17 vue+element-ui中的el-table-column使用v-if导致位置错乱
- 2024-10-17 Vue3问题:如何实现el-table内容超出省略提示?第3条很少有人会
- 2024-10-17 Vue封装ajax的代码示例详解(vue 封装 axios)
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)