IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> antd的Modal组件confirm state 未更新解决方案 -> 正文阅读

[JavaScript知识库]antd的Modal组件confirm state 未更新解决方案

记录一下使用antd的Modal组件遇到的坑

正常使用Modal

import { FC, useState } from "react";
import { SaveOutlined } from '@ant-design/icons';
import { Modal } from 'antd';
import { ExclamationCircleFilled } from '@ant-design/icons';
import globalStore from '@store/store'; 
import { runInAction} from "mobx";

const Save: FC<any> = () => {
    const { confirm } = Modal;
    const showPop = () => {
        console.log('showPop');
        confirm({
            icon: <ExclamationCircleFilled style={{color: "#FF4D4F"}}  />,
            title: "标题",
            content: 
            <div>
            	<div>展示内容</div>
            	<div>
					<Select style={{ width: 254 }} placeholder="请选择" onChange={v => {
                		runInAction(() => {
                    		globalStore.fileType = v; // 存到全局的状态
                		})
           			 }}
                bordered={false}>
                <Option value="A">A</Option>
                <Option value="B">B</Option>
            </Select>s
				</div>
            	<div className={globalStore.fileType ? "hide" : "show"}>
            		提示:...</div>
            	</div>,
            onOk() {
              console.log('OK');
            },
            onCancel() {
              console.log('Cancel');
            },
          });
    }

    return (
        <div onClick={showPop}>
            <SaveOutlined />
        </div>
    )
}
export default Save;

这种情况会导致confirm的弹框在弹出后没有被更新

原因

confirm的弹框在弹出后没有被更新,网上查了说是闭包原因;

处理方法

import { FC, useEffect, useRef, useState } from "react";
import { Button, Radio, Modal, Select, message } from 'antd';
import { DownloadOutlined, ExclamationCircleFilled } from '@ant-design/icons';
import './ExportData.less';
import { downloadExcel } from '@/utils/excel';
import globalStore from '@store/store';
import { observer, useLocalObservable } from "mobx-react";
import { listTypes } from "@/utils/mock/listType";
import { observable, runInAction, toJS } from "mobx";

const ExportData: FC<any> = () => {
    // const [mode, setMode] = useState('');
    const globalStores = useLocalObservable(() => globalStore);

    const { confirm } = Modal;
    const { Option } = Select;
    
    // 修改content的写法,以组件调用形式;且对其使用observer;
    let modal: any;
    const ModalContent = observer(() => <div className="pop">
        <div className="selectbox">
            <span className="leftIcon">*</span>
            <span className="popcell">文件格式:</span>
            <Select style={{ width: 254 }} placeholder="请选择" onChange={v => {
                runInAction(() => {
                    globalStore.fileType = v
                })
            }}
                bordered={false}>
                <Option value="xlsx">xlsx</Option>
                <Option value="xls">xls</Option>
            </Select>
        </div>
        <div className={globalStore.fileType ? "hide" : "introduce"}>
       		{globalStore.fileType}请选择导出格式</div>
    	</div>)
    useEffect(() => {
    	// 更新弹出框组件
        modal && modal.update(prev => ({
            ...prev,
            content: <ModalContent />
        }))
    }, [globalStore.fileType])

    const showPop = () => {
        console.log('showPop');
        modal = confirm({
            icon: <ExclamationCircleFilled style={{ color: "#FF4D4F" }} />,
            title: "数据导出",
            okText: "导出",
            content: <ModalContent />,
            onOk() {
                if (!globalStore.fileType) {
                    showPop()
                    return; // 未选格式
                }
                // 执行下载
                onExportExcel()
                runInAction(() => {
                    globalStore.fileType = ''
                })
            },
            onCancel() {
                // console.log('Cancel');
                runInAction(() => {
                    globalStore.fileType = ''
                })
            },
        });
    }
    return (
        <div>
            <Button type="primary" icon={<DownloadOutlined />} onClick={() => {
                showPop()
            }} >
                数据导出
            </Button>
        </div>
    )
}
export default observer(ExportData);
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-10 22:22:38  更:2022-03-10 22:25:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:23:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码