vue3+ant-design-vue上传组件实现

ant-design-vue的上传组件直接拿来用要写的废话挺多的,封装起来调用就简介很多

组件内实现:

<template>
    <a-upload
      :accept="props.limit&&props.limit.accept || 'image'"
      list-type="picture-card"
      :data="upload.formData"
      :show-upload-list="false"
      :action="upload.uploadPath"
      :before-upload="
        function (file) {
          return beforeUpload(file, index);
        }
      "
      @change="function (file) {handleChange(file, index)}"
    />
</template>
<script setup>
import {ref,getCurrentInstance,watch} from "vue";
import { Form } from 'ant-design-vue';
import { message } from "ant-design-vue";
const { proxy } = getCurrentInstance();
const formItemContext = Form.useInjectFormItemContext();
const props = defineProps({
    limit:{
      type:Object,
      default:null,
    },
    value:{
      type:String,
      default:''
    }
})
const upload=ref({
  formData: {},
  uploadPath: "",
  value:props.value||"",
  loading:false,
})
watch(
    () => props.value,
    (newProps) => {
      upload.value.value = newProps
    }
);

const beforeUpload= async function (file, index) {
  try {
    if(file.size>props?.limit?.size){
      message.error(`需上传小于${props.limit.size/1024/1024}M的文件`);
      return false;
    }
    let resp = await proxy.$http.get(...);
    upload.value.formData = {...};
    upload.value.uploadPath = resp.result.cdn;
    upload.value.temporary =resp.result.url;
    return true;
  } catch (e) {
    console.log(e);
  }

  return false;
}

const handleChange=function (info, index) {
  if (info.file.status === "uploading") {
    upload.value.loading = true;
    return;
  }
  if (info.file.status === "done") {
    upload.value.loading = false;
    upload.value.value =upload.value.temporary;
    triggerChange(upload.value.value)
  }
  if (info.file.status === "error") {
    upload.value.loading = false;
    message.error(info.file.response);
  }
}
const emit = defineEmits(['update:value'])
const triggerChange = (changedValue) => {
  emit('update:value', changedValue)
   //通知form组件value更新
  formItemContext.onFieldChange()
}

</script>

使用:

<template>
<a-form
  :model="formState"
  @finish="onFinish"
>
    <a-form-item
     label="图片"
     name="icon"
     :rules="[{ required: true, message: '请上传图片' }]"
    >
        <upload
          v-model:value="formState.icon"
          :limit="{
            accept:'.jpg,.png',
          }"
        />
  </a-form-item>
  <a-form-item">
    <a-button type="primary" html-type="submit" block>确定</a-button>
  </a-form-item>
</a-form>
</template>
<script setup>
import {ref} from "vue"
import upload from "@/components/upload/index.vue"

const formState=ref({
  icon:'',
})
const onFinish=async function(e){
    console.log(e)
}
</script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Vue3中使用Ant Design Vue的样式,可以按照以下步骤进行操作: 1. 首先,在你的项目中安装Ant Design Vue组件库。你可以通过npm或者yarn进行安装,具体的安装命令可以在Ant Design Vue的官方文档中找到。 2. 在你的Vue组件中引入Ant Design Vue的样式文件。你可以在组件所在的Vue文件中使用import语句引入Ant Design Vue的样式文件。 例如,在你的Vue文件中添加以下代码: ```javascript <style lang="less" scoped> @import '~ant-design-vue/dist/antd.less'; </style> ``` 这将会导入Ant Design Vue的样式文件,并使它只在当前组件中生效。 3. 接下来,你可以根据需要自定义你的组件样式。你可以在style标签中使用普通的CSS语法来定义和修改组件的样式。 例如,你可以在style标签中添加以下代码来自定义一个按钮组件的样式: ```javascript <style lang="less" scoped> .my-button { border-radius: 10px; } </style> ``` 这将会给按钮组件添加一个圆角为10px的边框样式。 通过以上步骤,你就可以在Vue3中使用Ant Design Vue的样式了。记得按照官方文档中的指引导入需要的组件,并在模板中使用它们。如果你需要更多示例和帮助,可以参考官方文档或者Ant Design Vue的开源项目。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [vue3+ant design vue+ts实战【ant-design-vue组件库引入】](https://blog.csdn.net/XSL_HR/article/details/127396384)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [vue3+ant-design-vue按需加载组件](https://blog.csdn.net/qq_42263570/article/details/130143934)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [vue3+element-plus的后台管理系统模板 和 vue3+ant-design-vue的后台管理系统模板](https://blog.csdn.net/qq_61233877/article/details/131008600)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值