实现ProFormUploadButton和Upload组件回显的办法

应用场景

实现Ant Design Pro表单中编辑功能的文件回显。

在开发基于Ant Design Pro的React应用时,我们经常需要在表单中集成文件上传功能。Ant Design Pro提供了`ProFormUploadButton`与`Upload`组件,它们是处理文件和图片上传的强大工具。然而,一个常见的挑战是在编辑模式下,如何优雅地回显之前上传的文件URL,以便用户能直观地看到已添加的文件或图片,并进行修改。

目标功能

本文旨在详细介绍如何在使用`ProFormUploadButton`和`Upload`组件的表单中,实现在编辑场景下自动加载和展示之前上传的文件URL。这一功能对于增强用户体验、简化编辑流程至关重要。

实现步骤

ProFormUploadButton

1.设置组件属性

<ProFormUploadButton
    name="file"
    max={1}
    rules={[{ required: true, message: '请上传章节' }]}
    disabled={radio === undefined ? true : false}
    accept={
            (
              formRef.current?.getFieldValue('coursewareTypeId')
                ? formRef.current?.getFieldValue('coursewareTypeId') == 2
                : current?.coursewareTypeId == 2
            )
              ? 'video/*'
              : '.ppt,.pptx'
          }
    tooltip={addOrUpdate === 'add' ? '' : '如需修改,请重新上传!'}
    fieldProps={{
        //上传进度条
        progress: {
            strokeColor: {
                '0%': 'red',
                '100%': 'blue'
            },
            strokeWidth: 3,
            format: (percent) => percent && `${parseFloat(percent.toFixed(2))}%`,
        },
        //自定义上传接口
        customRequest: async (info: any) => {
            const formData = new FormData();
            formData.append('file', info.file);
            formData.append('type', "1");//1是文档
            try {
                const { success, data } = await minio_upload(formData);
                if (success) {
                    info.onSuccess(info.file);
                    setMinioUrl(data);
                    return success;
                } else {
                        message.error('上传失败,请刷新重试');
                        return false;
                       }
             } catch (error) {
                    message.error('上传失败,请刷新重试');
                    return false;
                  }
        },
        //实现预览
        onPreview: (file: any) => { window.open(file?.url, '_blank') }
    }}
    />

2.设置组件回显值

useEffect(()=>{
    //使用Form表单的formRef设置初始值
    formRef?.current?.setFieldsValue({
        file:[
              {
                url: record?.url,//设置后,组件的onProview属性才能生效
                uid: '-1',
                name: record?.chapterName,
                //设置缩略图图片,若不设置,则回显时图片为空
                thumbUrl: require("../../../../../../public/images/learnblue.png")
              }
             ]
        })
},[])

Upload

1.设置组件属性

//1.页面布局
<Col span={8}>
//ProFormSwitch控制是否展示Upload组件
    <ProFormSwitch
        name="homeState"
        label="是否首页"
        fieldProps={{
            checkedChildren: "是",
            unCheckedChildren: "否",
            defaultChecked: false,
            onChange: () => {
                setFileList([])
            }
        }}
    />
</Col>
              
<Col span={8}>
//使用ProFormDependency实现表单项间的依赖
    <ProFormDependency name={['homeState']}>
        {({ homeState }) => {
            return homeState ?
                        <Row>
                            <Col span={1} />
                            <Col span={11}>首页图片:</Col>
                            <Col span={12}>
                                <Upload
                                    {...uploadProps}//设置上传属性
                                    name="homeImg"
                                    maxCount={1}
                                    listType="picture-card"
                                    fileList={fileList}//设置回显列表
                                    onChange={onChange}
                                    onPreview={onPreview}
                                >
                                    //Upload文字提示
                                    {fileList.length < 1 && '+ 点击上传'}
                                </Upload>
                            </Col>
                        </Row> : ''
        }}
    </ProFormDependency>
</Col>

//2.函数部分
//上传属性
const uploadProps = {
    accept: '.jpg,.jpeg.,.png',
    customRequest: async (info: any) => {
        const formData = new FormData();
        formData.append('file', info.file);
        try {
            const { success, data } = await upload_homeImg(formData);
            if (success) {
              info.onSuccess(info.file);
              setHomeImg(data);//上传接口返回的数据存在homeImg状态中
              return success;
            } else {
                  message.error('上传失败,请刷新重试');
                  return false;
              }
        } catch (error) {
            message.error('上传失败,请刷新重试');
            return false;
          }
    },
    onPreview: () => { }
}

const onChange = (res: any) => {
    setFileList(res?.fileList?.map((e: any) => (
        { ...e, url:e.response?.data?.downloadUrl })));
};

2.设置组件回显值

//自定义函数,函数体实现改变fileList状态值
//使用函数的目的是解决setFileList()的异步情况,使得fileList的值总是最新的
const funcSetFileList = (homeImg: any) => {
    setFileList([
        {
          url: homepageImgPre + `${homeImg}`,
          uid: '-1',
          name: 'homeImg.png',
        }
    ])
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用 element-ui 的 upload 组件回显图片,可以将图片地址存储在一个数组中,然后在 upload 组件的 `success` 回调函数中将图片地址添加到这个数组中。然后,可以通过 v-for 指令将这个存储图片地址的数组渲染成一个图片列表。 以下是一个示例代码: ``` <template> <div> <el-upload class="avatar-uploader" action="/upload" :show-file-list="false" :on-success="handleSuccess" > <img v-if="imageUrl" :src="imageUrl" class="avatar"> <i v-else class="el-icon-plus avatar-uploader-icon"></i> </el-upload> <div v-if="imageList.length > 0"> <div v-for="(image, index) in imageList" :key="index"> <img :src="image" class="uploaded-image"> </div> </div> </div> </template> <script> export default { data() { return { imageUrl: '', imageList: [] } }, methods: { handleSuccess(response, file) { this.imageUrl = URL.createObjectURL(file.raw) this.imageList.push(this.imageUrl) } } } </script> <style scoped> .avatar-uploader { display: inline-block; width: 100px; height: 100px; border-radius: 50%; border: 1px dashed #ccc; text-align: center; background-size: cover; background-position: center; overflow: hidden; } .avatar { width: 100%; height: 100%; display: block; } .avatar-uploader-icon { font-size: 28px; color: #999; line-height: 100px; } .uploaded-image { width: 150px; height: 150px; margin-right: 10px; margin-bottom: 10px; } </style> ``` 在这个示例中,我们使用了 element-ui 的 upload 组件来上传图片,并且在上传成功后将图片地址存储在 `imageList` 数组中。然后,我们使用 v-for 指令将这个数组中的图片地址渲染成一个图片列表。如果需要修改已上传的图片,可以在图片列表中添加一个按钮,点击后弹出一个上传组件,上传新的图片并更新数组中对应的图片地址即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值