当前位置: 首页 > news >正文

新增、修改弹窗封装

FormModal

传统问题:
1、弹窗关闭时数据为清空,下一次打开数据还在
2、写一个弹窗、需要创建一堆变量,如 visible、loading、onClose、onOk…
3、开发者需要关注的副作用多,如打开/关闭弹窗、保存成功后刷新列表
4、编辑时回显数据逻辑、保存逻辑重复代码过多

解决方案

const FormModal = props => {const {onRef, onSave, onEcho, onSuccessCallback, children} = props;const [open, setOpen] = useState(false);const [data, setData] = useState(null);const [loading, setLoading] = useState(false);const [form] = Form.useForm();const onClose = () => {setOpen(false);};const valid = async () => {try {return await form.validateFields();} catch (e) {return false;}};const onOk = async () => {try {const formValue = await valid();if (!formValue) return;setLoading(true);const msg = await onSave(formValue, data);setLoading(false);message.success(msg || '操作成功');onClose();onSuccessCallback?.();} catch (e) {message.error(e?.message || '操作失败');setLoading(false);}};useImperativeHandle(onRef, () => ({open(value = null) {setData(value);setOpen(true);},}));/** 回显加载数据*  */useEffect(() => {if (data && onEcho) {setLoading(true);onEcho(data).then(value => {form.setFieldsValue(value);}).catch(e => {onClose();message.error(e?.message || '数据回显失败');}).finally(() => {setLoading(false);});}}, [data]);/** 处理关闭弹窗副作用*  */useEffect(() => {if (!open) {form.resetFields();setData(null);}}, [open]);return (<ModalconfirmLoading={loading}maskClosable={false}closable={false}open={open}onOk={onOk}onCancel={onClose}styles={{footer: {display: 'flex', justifyContent: 'center', gap: 30},}}><Spin spinning={loading} tip="Loading"><Form form={form}>{children}</Form></Spin></Modal>);
};

使用

const BizModal = props => {const {onRef} = props;const onEcho = async params => {const res = await fetchData(params);return res.data;//需和表单字段一致};const onSave = async value => {const res = await fetchData(value);return res.msg;//返回成功提示信息即可};return (<FormModal onRef={onRef} onSave={onSave} onEcho={onEcho}><Form.Itemlabel="姓名"name="username"rules={[{required: true, message: '请输入姓名'}]}><Input /></Form.Item></FormModal>);
};

http://www.mrgr.cn/news/60597.html

相关文章:

  • flask自学教程(一)
  • 太阳能面板分割系统:训练自动化
  • 一种小型固定翼无人机弹射着陆系统的设计
  • Unity编辑器制作多级下拉菜单
  • Win11安装基于WSL2的Ubuntu
  • 什么是同步?什么是异步?各自优缺点?
  • java溯本求源之基础(二十七)之--Map常用子类及源码分析(6000字长文)
  • 中项到高项:软考信息系统项目管理师证书进阶指南
  • Pytest用例执行顺序和跳过执行详解
  • SQL-lab靶场less1-4
  • 《C++ 旧项目全局变量模块化改造:稳扎稳打,守护原有功能》
  • Flow-based生成模型理解
  • DevSecOps在数字政府建设中的实践研究
  • MinIO方法封装
  • 【C++】Type punning类型双关、union联合体、C++中的类型转换casting
  • 手机也能开数电票了,可能我也即将要失业了
  • Codigger桌面模式之Size Look介绍
  • 使用语言模型进行文本摘要的五个级别(llm)
  • 去中心化的概述
  • 机器学习中的谱聚类及实践案例
  • VLAN聚合
  • 1.字节大小
  • Java集合框架中的泛型有什么优点?
  • 第13天小整理
  • 机器学习入门之监督学习
  • 并联 高电压、高电流 放大器实现 2 倍输出电流模块±2A