基于React实现:弹窗组件与Promise的有机结合

这篇具有很好参考价值的文章主要介绍了基于React实现:弹窗组件与Promise的有机结合。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

弹窗在现代应用中是最为常见的一种展示信息的形式,二次确认弹窗是其中最为经典的一种。当我们在React,Vue这种数据驱动视图的前端框架中渲染弹窗基本是固定的使用形式。

使用方式:创建新的弹窗组件,在需要弹窗的地方引用并且需要在外层维护弹窗组件的显示/隐藏状态。

这只是庞大项目中一处需要弹窗的地方,如果项目中存在N个需要弹窗的场景,我们都需要将上述步骤重复一次。这会让我们的项目组件变得臃肿冗余。这也是前端开发者比较头疼且常见的问题。那么我们有没有办法解决这种问题呢?

思考

在最近的一次需求中,我尝试去解决这个问题。首先对于二次确认弹窗这种只有在执行某些动作的时候才需要进行展示,其他时间我们应该忽视它的存在。很明显根据传统的做法我们至少需要维护一个组件实例以及一个状态。

是否可以实现只有在执行具体的动作时才调用二次确认弹窗相关的代码呢?就比如命令式调用方法去渲染组件,可以通过ReactDOM.render实现的这种效果。

接着尝试思考第二个问题,对于二次确认弹窗的交互,其实本质上我们只关心用户点击的取消还是确认。对于这种状态二选一的问题,我脑海里面浮现出熟悉的Promise。

于是,我尝试将二次确认弹窗与Promise进行有机结合,实现出命令式二次确认弹窗。当然这种思路可以运用到其他任何类似的场景。

在线演示Live Demo

事实胜于雄辩,这是下方代码实现的真实效果,感兴趣的同学可自行访问看看效果。

Reconfirm Modal DEMO - FE Component Training

代码实现

普通方式实现

  1. 先通过通用方式实现二次确认弹窗

    import { ReactNode } from "react";
    import { Button } from "antd";
    import "./index.css";
    
    interface ModalOption {
      title: ReactNode;
      content: ReactNode;
      okText?: string;
      cancelText?: string;
    }
    
    interface ReconfirmModalProps {
      onConfirm: () => void;
      onClose: () => void;
      options: ModalOption;
    }
    
    function ReconfirmModal(props: ReconfirmModalProps) {
      const { onConfirm, onClose, options } = props;
      const { title, content, okText, cancelText } = options;
      return (
        <div className="reconfirm-modal" style={{ zIndex: 10001 }}>
          <div className="reconfirm-modal-body" style={{ width: 400 }}>
            <p className="reconfirm-modal-title">{title}</p>
    
            <p className="reconfirm-modal-content">{content}</p>
    
            <div className="reconfirm-modal-footer">
              <Button size="large" onClick={onClose} block>
                {cancelText || "取消"}
              </Button>
              <Button type="primary" size="large" block onClick={onConfirm}>
                {okText || "确认"}
              </Button>
            </div>
          </div>
        </div>
      );
    }
    
  2. 引用二次确认弹窗,进行简单交互

    export default function ReconfirmModalPage() {
      const [visible, setVisible] = useState(false);
    
      return (
        <div>
          <Button danger onClick={() => setVisible(true)}>
            删除
          </Button>
          {visible && (
            <ReconfirmModal
              onConfirm={() => {
                setVisible(false);
                alert("点击了确认按钮");
              }}
              onClose={() => {
                setVisible(false);
                alert("点击了取消按钮");
              }}
              options={{ title: "删除提示", content: "确认删除吗?" }}
            />
          )}
        </div>
      );
    }
    
  3. 看看展示效果

    基于React实现:弹窗组件与Promise的有机结合,前端知识图谱,前端,react,css3,javascript

有机结合Promise

我们需要梳理清晰我们的目的,然后再动手进行实现,通过理论指导实践。

首先创建一个方法,调用这个方法时唤醒二次确认弹窗,同时这个方法需要返回二次确认弹窗的交互结果。

通过ReactDOM.render方法将弹窗组件挂在到新创建的root节点上,将Promise的resolve方法传递给弹窗组件的两个按钮事件,此时用户点击按钮时即触发resove方法,Promise状态就从pending状态转移到fulfilled状态。

调用该方法的宿主方法即可得到用户点击二次确认弹窗的点击结果,我们的目的也就达到了。

export const openReconfirmModal = (options: ModalOption) => {
    return new Promise((resolve) => {
        const root = document.createElement('div')
        document.body.appendChild(root)

				// 移除react组件和DOM节点
        const removeModal = () => {
            ReactDOM.unmountComponentAtNode(root)
            document.body.removeChild(root)
        }

				// 点击取消按钮
        const onClose = () => {
            removeModal()
            resolve(false)
        }

	      // 点击确认按钮
        const onConfirm = () => {
            removeModal()
            resolve(true)
        }

        ReactDOM.render(createElement(ReconfirmModal, { onClose, onConfirm, options }), root)
    })
}

调用二次确认弹窗方法

function ReconfirmModalPage() {

  const handlePromseReconfirm = async () => {
		// !!! **直接这么调用就完事儿,简单直接**
    const res = await openReconfirmModal({
      title: "删除提示",
      content: "确认删除吗?",
    });
    if (res) {
      alert("点击了确认按钮");
    } else {
      alert("点击了取消按钮");
    }
  };

  return (
      <Button danger type="primary" onClick={handlePromseReconfirm}>
        Promise模式删除
      </Button>
  );
}

缺点分析

因为我们是通过ReactDOM.render方法渲染的弹窗,这就意味着弹窗组件跟主应用App的状态是隔离的,如果弹窗中用到Redux这种需要上下文Provider能力的工具,就需要在弹窗组件中也初始化一次。但是对于像二次确认弹窗这种简单的纯展示的组件,结合Promise的方式是完全可行的。

总结

日常开发工作中总有一些能够优化的步骤和流程,我们能够多思考一下,转变思路,就能够让我们的代码更加赏心悦目。

原文链接

https://www.levenx.com/article/the-organic-combination-of-pop-up-components-and-promise

个人博客网站,记录更多更全面的内容,

“当你点赞的时候,触碰的不是冰冷的按钮,而是作者那颗感恩的心。”

——鲁迅《非我所言》文章来源地址https://www.toymoban.com/news/detail-695699.html

到了这里,关于基于React实现:弹窗组件与Promise的有机结合的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • react18 hooks自定义移动端Popup弹窗组件RcPop

    基于 React18 Hooks 实现手机端弹框组件 RcPop react-popup 基于 react18+hook 自定义多功能弹框组件。整合了 msg/alert/dialog/toast及android/ios 弹窗效果。支持 20+ 自定义参数、 组件式+函数式 调用方式,全方位满足各种弹窗场景需求。 在需要使用弹窗的页面引入组件。 RcPop支持  组件式+函

    2024年02月15日
    浏览(43)
  • 【react框架】结合antd做表单组件的一些心得记录

    作为一个前端最常遇见的需求场景就是写表单、写表格。写多了会逐渐的积累一些开发心得,此文章根据我使用vue和react的经验记录了一些东西,抛砖引玉的给大家看看。 举例react项目,在做表单的很多时候,我都是从antd上把其中一个form组件例子复制下来,然后再看看提供了

    2024年02月07日
    浏览(98)
  • 前端开发框架React技术如何与小程序结合,进行页面构建

    前端开发框架 React 可以通过小程序提供的开发工具和 API 进行结合。 例如使用小程序提供的 WebView 组件来加载前端框架的页面。 或者使用小程序提供的组件和 API 来实现前端框架的功能。 同时,也可以通过小程序提供的云开发功能来实现前端框架与后端数据的交互。 可以通

    2024年02月09日
    浏览(39)
  • Android笔记(八):基于CameraX库结合Compose和传统视图组件PreviewView实现照相机画面预览和照相功能

    CameraX是JetPack库之一,通过CameraX可以向应用增加相机的功能。在下列内容中,将介绍一个结合CameraX实现一个简单的拍照应用。本应用必须采用Android SDK 34。并通过该简单示例,了解传统View层次组件的UI组件如何与Compose组件结合实现移动应用界面的定制。 首先,新建一个项目

    2024年02月08日
    浏览(46)
  • 前端react入门day03-react获取dom与组件通信

    (创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 受控表单绑定  React中获取DOM 组件通信 父传子  父传子-基础实现 父传子-props说明 父传子 - 特殊的prop children 子传父  使用状态提升实现兄弟组件通信 使用Context机制跨

    2024年02月01日
    浏览(55)
  • 前端react入门day02-React中的事件绑定与组件

    (创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 React中的事件绑定 React 基础事件绑定 使用事件对象参数  传递自定义参数  同时传递事件对象和自定义参数  React中的组件  组件是什么 React组件 useState  修改状态的规

    2024年02月06日
    浏览(86)
  • 前端开发笔记 | React Hooks子组件和父组件交互

    前端开发框架目前比较常用的就是react、vue等,其中使用React Hooks 带来了不少的好处,今天来聊聊React Hooks开发方式下,子组件和父组件的交互。 子组件定义 父组件调用子组件 父组件定义 子组件中刷新父组件按钮文案 实际效果:点击子组件中“改变父组件按钮”,父组件中

    2024年02月11日
    浏览(83)
  • 基于Taro + React 实现微信小程序半圆滑块组件、半圆进度条、弧形进度条、半圆滑行轨道(附源码)

    1、四个档位 2、可点击加减切换档位 3、可以点击区域切换档位 4、可以滑动切换档位 给大家提供一些实现思路,找了一圈,一些文章基本不能直接用,错漏百出,代码还藏着掖着,希望可以帮到大家 ts的写法风格 index.tsx      index.module.less 防抖的工具函数debounce 的详细代码

    2024年02月06日
    浏览(60)
  • uniapp实现预约时间选择弹窗组件

    做了个组件,实现出当日预约时间组件,效果图如下 废话不多说,直接上代码,代码简单,参数自己任意改 在父组件中

    2024年02月15日
    浏览(42)
  • 基于element-ui el-dialog组件封装,可缩放+可移动的弹窗组件

    源码下载 改组件继承el-dialog组件百分之95属性,可直接对el-dialog进行替换。在项目中我的命名为: vue代码 :搞成组件,路径随意,推荐统一放在组件目录下 拖动及缩放操作js代码: 将skdialog.js注册为指令: 目录: 指令使用:(v-指令名称(SkDialogDrag)) 效果图: 注:吃水

    2024年02月03日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包