针对于“上传文件”和“触发方式” 的解决方案(Antd个例)

修改前:

 封装的组件:

const MyUpload: FC<MyUploadProps> = ({title, prop}) => {
    return (
        <Upload maxCount={1} itemRender={() => null} {...prop} beforeUpload={checkFileSize}>
            <Button type="link" style={{color: title === '重新上传' ? '#080e1a' : ''}}>
                {title}
            </Button>
        </Upload>
    );
};

展示:

return (
        <>
                <Dragger
                    maxCount={1}
                    style={{display: fileUploadStatus.REMOVED === uploadStatus ? 'block' : 'none'}}
                    {...prop}
                    itemRender={() => null}
                    openFileDialogOnClick={false}
                    beforeUpload={checkFileSize}
                >
                    <Upload maxCount={1} itemRender={() => null} {...prop} beforeUpload={checkFileSize}>
                        <div>
                            <p className="ant-upload-drag-icon">
                                <CloudUploadOutlined />
                            </p>
                            <MyUpload prop={prop} title={'点击上传'} />
                        </div>
                    </Upload>
                </Dragger>
        </>
    );
};

解决方法研究:

( 需求:1.点击 "空白" 和 “点击上传”文字、拖拽都能生效

                2.上传完成后显示“重新上传” 点击后也能生效 )

=> 0.Dragger 的默认点击空白设置为 false,此时只能生效“拖拽”

=> 1.先去掉本来原本封装的 MyUpload 组件(它会触发两次上传函数--事件冒泡)

=> 2.在原有的 Dragger 组件中 直接嵌套 Upload 组件,再将展示的“标签”结构写入 Upload 中

=> 3.(关键!!!)

        此时需要给标签容器 div 设置 antd 上传组件的class类名(className="ant-upload-drag-main"),将整个内容撑满 Dragger。

(这样便解决了触发“二次”上传函数的回调

=> 本质是:用div内容100%,将点击触发 Upload 函数的范围扩大,

        使点击的范围去代替Dragger点击的空白范围

=> 4.疑问:上传成功后的“重新上传”文字可以实现点击、拖拽,但是“拖拽”必须精准到“文字上面”,

        后面想过在封装的 MyUpload 中使用 title 的属性直接传入整个展示的“标签”结构,

        但是会再次触发“ Upload 上传函数的二次回调,最终优化不下去。

综上:(目前是改动最小,优化最合适的方案),即使上传成功后的“重新上传”从用户角度考虑,

        99%是以点击触发方式最符合大众习惯,

        如果需要“拖动”也能在上传成功后“整个div中”实现,那就是另外的需求了。

修改后:

.ant-upload-drag-main {
            width: 470px;
            height: 160px;
            display: flex;
            justify-content: center;
            flex-direction: column;
        }
return (
        <>
            <div className={styles.decisionTest}>
                <div className={styles.subTitle}>批量测试文件</div>
                <Form.Item name="url" noStyle>
                    <p />
                </Form.Item>
                <Anchor href="" download="" id="downloadDiv" style={{display: 'none'}} />
                <Dragger
                    maxCount={1}
                    style={{display: fileUploadStatus.REMOVED === uploadStatus ? 'block' : 'none'}}
                    {...prop}
                    itemRender={() => null}
                    openFileDialogOnClick={false}
                    beforeUpload={checkFileSize}
                >
                    <Upload maxCount={1} itemRender={() => null} {...prop} beforeUpload={checkFileSize}>
                        <div className="ant-upload-drag-main">
                            <p className="ant-upload-drag-icon">
                                <CloudUploadOutlined />
                            </p>
                            <div>
                                将文件拖到此处,或 <span style={{color: '#2468f2'}}>点击上传</span>
                            </div>
                            {/* <MyUpload prop={prop} title={'点击上传'} /> */}
                        </div>
                    </Upload>
                </Dragger>

                <div
                    className={styles.uploadBox}
                    style={{
                        display: [fileUploadStatus.DONE, fileUploadStatus.UPLOADING, fileUploadStatus.ERROR].includes(
                            uploadStatus
                        )
                            ? 'flex'
                            : 'none'
                    }}
                >
                    {uploadStatus === fileUploadStatus.UPLOADING ? (
                        <div style={{display: 'flex', flexDirection: 'column', alignItems: 'center'}}>
                            <Progress
                                strokeColor={'#2468f2'}
                                size="small"
                                percent={percent}
                                style={{width: 150}}
                                showInfo={false}
                            />
                            <span>上传中...</span>
                        </div>
                    ) : null}
                    <div
                        style={{
                            display: fileUploadStatus.DONE === uploadStatus ? 'flex' : 'none',
                            flexDirection: 'column',
                            alignItems: 'center',
                            justifyContent: 'center'
                        }}
                    >
                        <div style={{display: 'flex', flexDirection: 'row', alignItems: 'center'}}>
                            <FileWordOutlined />
                            <div>{fileName}</div>
                        </div>
                        <div style={{display: 'flex', flexDirection: 'row'}}>
                            <MyUpload prop={prop} title={'重新上传'} />
                            <Button
                                type="link"
                                style={{color: '#080e1a', marginLeft: 10}}
                                onClick={() => {
                                    onSubmitDisabled && onSubmitDisabled(true);
                                    setUploadStatus(fileUploadStatus.REMOVED);
                                }}
                            >
                                删除
                            </Button>
                        </div>
                    </div>

                    <div
                        style={{
                            display: fileUploadStatus.ERROR === uploadStatus ? 'flex' : 'none',
                            flexDirection: 'column',
                            alignItems: 'center',
                            justifyContent: 'center'
                        }}
                    >
                        <div style={{display: 'flex', flexDirection: 'column'}}>
                            <ReloadOutlined style={{fontSize: 20, color: '#d9d9d9'}} />
                            <MyUpload prop={prop} title={'重新上传'} />
                        </div>
                    </div>
                </div>

                <div>
                    上传文档要求后缀为.xls, .xlsx,大小不超过10M 点此
                    <Button
                        type="link"
                        onClick={() => {
                            fileDownload('/api/file/download', 'TEMPLATE');
                        }}
                    >
                        下载模板文件
                    </Button>
                </div>
            </div>
        </>
    );

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寒枫落林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值