返回顶部
首页 > 资讯 > 前端开发 > JavaScript >react实现全局组件确认弹窗
  • 486
分享到

react实现全局组件确认弹窗

2024-04-02 19:04:59 486人浏览 八月长安
摘要

本例基于React实现了一个简单的确认弹窗,可以让我们在项目中根据需要随时调用 创建全局modal组件 此处我将弹窗模态框独立出来,用户可以通过传入组件或Element来填充模态框的

本例基于React实现了一个简单的确认弹窗,可以让我们在项目中根据需要随时调用

创建全局modal组件

此处我将弹窗模态框独立出来,用户可以通过传入组件或Element来填充模态框的内容。

import ReactDOM from 'react-dom';
import React, { Fragment } from 'react';
import Button from 'components/common/button';
import Icon from 'components/common/icon';
import CSS from './index.less';

export interface Props {
  isCancelIcon?: boolean;
  cancelText?: string;
  okText?: string;
  onCancel?: () => void;
  onOk?: () => void;
  footer?: React.Reactnode;
  style?: object;
}

const Modal: React.FC<Props> = React.memo<Props>(({
  isCancelIcon, cancelText, okText, onOk, onCancel, footer, children, style
}) => {

  function renderBtn() {
    return (
      <Fragment>
        <Button 
          className={css.btn}
          onClick={() => onCancel()}
        >
          {cancelText}
        </Button>
        <Button 
          className={css.btn} 
          onClick={() => onOk()} 
          type="primary">
          {okText}
        </Button>
      </Fragment>
    );
  }

  return (
    <div className={css.masker}>
      <div className={css.box} style={{ ...style }} >
        {isCancelIcon && 
        <div 
          className={css.cancelIconBox}
          onClick={() => onCancel()}
        >
          <Icon className={css.cancelIcon} />
        </div>}
        {children}
        <div className={css.btnBox}>
          {footer || renderBtn()}
        </div>
      </div>
    </div>
  );
});

Modal.defaultProps = {
  okText: '确定',
  cancelText: '取消',
  onCancel: () => {},
  onOk: () => {},
  isCancelIcon: true
};

export default function ({ content, props }: { content: React.ReactNode; props: Props }) {
  
  const { onOk=() => {}, onCancel=() => {}, ...others } = props;
  
  function handleClose() {
    ReactDOM.unmountComponentAtNode(div);
    document.body.removeChild(div);
    onCancel();
  }
  
  function handleOk() {
    ReactDOM.unmountComponentAtNode(div);
    document.body.removeChild(div);
    onOk();
  }

  let div = document.createElement('div');
  document.body.appendChild(div);
  ReactDOM.render(
    <Modal 
      {...others}
      onOk={handleOk} 
      onCancel={handleClose}
    >
      {content}
    </Modal>,
    div);

  return {
    handleOk: () => handleOk(),
    handleClose: () => handleClose()
  };
}

less文件

@import '~common/less/index.less';
  .masker{
    width: 100vw;
    height: 100vh;
    background: @mask-color;
    position: fixed;
    left: 0;
    top: 0;
    display: flex;
    justify-content: center;
    flex-direction: column;
    align-items: center;
    overflow: hidden;
    .box{
      width: 500px;
      height: 230px;
      position: relative;
      background-color: white;
      position: relative;
      transition: .2s;
      animation: showModal .2s ease-in forwards;
      .cancelIconBox{
        width: 27px;
        height: 27px;
        line-height: 27px;
        text-align: center;
        position: absolute;
        right: 15px;
        top: 22px;
        cursor: pointer;
        .cancelIcon{
          .font(17px)
        }
      }
      .btnBox{
        width: 100%;
        position: absolute;
        left: 0;
        bottom: 20px;
        padding-right: 10px;
        display: flex;
        flex-flow: row;
        justify-content: flex-end;
        align-items: center;
          .btn{
            margin-right: 10px;
            .font(12px)
          }
        }
    }
  }

  @keyframes showModal {
    0%{
      transfORM:translate(-100px, 60px) scale(.5) ;
    }
    100%{
      transform:translate(0, 0) scale(1)  ;
    }
  }

确认框内容组件

此组件用以渲染确认框具体内容,项目中可根据具体情况渲染自己需要的内容

tsx文件

import React from 'react';
import classNames from 'classnames';
import Icon from 'components/common/icon';
import modal, { Props as ModalProps } from '../components/modal';
import css from './index.less';

interface Content {
  key: string;
  value: string;
}

export interface Props extends ModalProps {
  title?: string;
  content?: Content[];
}

export default function success({ title, content, ...others }: Props) {

  const node = (
    <div className={css.successWrap}>
      <div className={css.line} />
      <div className={css.content}>
        <Icon className={css.successIcon} />
        <div className={css.right}>
          <span className={css.successTitle}>{title}</span>
          {
            content && content.map((item, index) => {
              return (
                <div key={`content_${index}`} className={css.contentList}>
                  <div className={css.key}>{item.key}:</div>
                  <span>{item.value}</span>
                </div>
              );
            })
          }
        </div>
      </div>
    </div>
  );

  modal({
    content: node,
    props: others
  });
}

less文件

@import '~common/less/index.less';
  .successWrap{
    .line{
      width: 100%;
      height: 8px;
      background-color: #6EA204;
    }
    .content{
      display: flex;
      flex-flow: row;
      margin: 30px 0 0 40px;
      .successIcon{
        .font(72px);
      }
      .right{
        display: flex;
        flex-flow: column;
        padding-top: 10px;
        margin-left: 20px;
        .successTitle{
          .contentList();
          .font(18px);
          font-weight:500;
        }
        .contentList{
          display: flex;
          flex-flow: row;
          .font(12px);
          font-weight:400;
          color:@font-title-color;
          margin-bottom: 7px;
          .key{
            min-width: 72px;
          }
        }
      }
    }
  }

使用全局确认框

只需要在组件中引入全局组件,然后直接调用全局组件中的方法即可。

import React from 'react';
import success from 'components/common/confirm/success';
const content = [
  { 
    key: '代理商姓名',
    value: '东东东'
  },
  { 
    key: '联系方式',
    value: '18978765678'
  },
  { 
    key: '代理商账号',
    value: '这是一个测试登录用户名'
  },
  { 
    key: '初始密码',
    value: '这是一个测试登录用户名'
  },
];
export interface Props {}
const Components: React.FC<Props> = () => {

return (
 <Button onClick={() => success({ 
 content, title: '代理商录入成功', 
 okText: '继续录入', 
 cancelText: '返回列表' 
 })}
 >成功状态框</Button>
)

Components.defaultProps = {};

export default Components

实现效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: react实现全局组件确认弹窗

本文链接: https://lsjlt.com/news/165777.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • react实现全局组件确认弹窗
    本例基于react实现了一个简单的确认弹窗,可以让我们在项目中根据需要随时调用 创建全局modal组件 此处我将弹窗模态框独立出来,用户可以通过传入组件或Element来填充模态框的...
    99+
    2024-04-02
  • React实现动效弹窗组件
    我们在写一些 UI 组件时,若不考虑动效,就很容易实现,主要就是有无的切换(类似于 Vue 中的 v-if 属性)或者可见性的切换(类似于 Vue 中的 v-show 属性)。 1...
    99+
    2024-04-02
  • 详解Vue全局组件的挂载之实现弹窗组件
    目录vue组件挂载类型组件挂载代码示例1.vue.extend()方法2.render函数挂载vue组件挂载类型 vue中组件的挂载分为两种类型: vue.extend() rend...
    99+
    2022-11-13
    Vue组件挂载 弹窗 Vue组件挂载 Vue弹窗组件 Vue 弹窗
  • vue extend+promise封装全局弹窗组件
    本文实例为大家分享了vue extend+promise封装全局弹窗组件的具体代码,供大家参考,具体内容如下 因为项目没有引入第三方UI库,所以所有的公共组件都需要自己封装现在需要一...
    99+
    2024-04-02
  • vue全局挂载如何实现APP全局弹窗
    本篇内容主要讲解“vue全局挂载如何实现APP全局弹窗”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue全局挂载如何实现APP全局弹窗”吧!需求背景app端对接网页端的客服系统,在用户实现网页...
    99+
    2023-06-30
  • vue全局挂载实现APP全局弹窗的示例代码
    目录需求背景需求分析代码展示需求背景 app端对接网页端的客服系统,在用户实现网页客户系统发起询问时,app不论在哪个页面都需要弹窗提示 需求分析 这个需求分为两步,一个是负责双向...
    99+
    2024-04-02
  • react实现Modal弹窗效果
    本文实例为大家分享了react实现Modal弹窗效果的具体代码,供大家参考,具体内容如下 一、Dialog.js文件 import React, {useMemo, useEffec...
    99+
    2024-04-02
  • vue自定义全局组件实现弹框案例
    本文实例为大家分享了vue自定义全局组件实现弹框案例的具体代码,供大家参考,具体内容如下 说明:本案例是封装的一个弹框页面,因为只想要一个遮罩,内容自定义。因为ElementUI上已...
    99+
    2024-04-02
  • Vue3+hook如何实现弹窗组件
    本文小编为大家详细介绍“Vue3+hook如何实现弹窗组件”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue3+hook如何实现弹窗组件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。要封装什么如果是普通弹窗使...
    99+
    2023-07-04
  • Vue弹窗组件的实现方法
    本文实例为大家分享了Vue弹窗组件的实现具体代码,供大家参考,具体内容如下 弹窗组件包含内容: 弹窗遮罩层内容层的实现(涉及slot、props、$on、$emit) 实现步骤: 1...
    99+
    2024-04-02
  • React实现动态调用的弹框组件
    最近在用react开发项目,遇到一个需求——开发一个弹框组件。在react中创建一个组件是很简单的,只需要使用class创建并引入就可以了,但是要做到可以用j...
    99+
    2024-04-02
  • vue中怎么实现一个toast弹窗组件
    本篇文章给大家分享的是有关vue中怎么实现一个toast弹窗组件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。首先,我们来分析一下弹窗组件的特...
    99+
    2024-04-02
  • Vue基于Element-ui实现表格弹窗组件
    本文实例为大家分享了Vue基于Element-ui实现表格弹窗组件的具体代码,供大家参考,具体内容如下 效果图 使用方式 acTable1 () {   this.$modalTa...
    99+
    2024-04-02
  • 怎么封装一个vue中也可使用的uniapp全局弹窗组件
    这篇文章主要介绍了怎么封装一个vue中也可使用的uniapp全局弹窗组件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么封装一个vue中也可使用的uniapp全局弹窗组件文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-07-05
  • ReactNative中实现确认码组件示例详解
    目录正文实现原理开源方案正文 确认码控件也是一个较为常见的组件了,乍一看,貌似较难实现,但实则主要是障眼法。 实现原理 上图 CodeInput 组件的 UI 结构如下: <...
    99+
    2022-11-13
    React Native确认码组件 React Native
  • vue如何实现自定义模态弹窗组件
    本篇内容主要讲解“vue如何实现自定义模态弹窗组件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue如何实现自定义模态弹窗组件”吧! 一、创建弹窗组件 qu...
    99+
    2024-04-02
  • Element修改弹窗类组件的层级的实现
    目录前情坑位Why解决方案前情 Element,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库,在项目中我们就使用了它,非常nice 坑位 在使用Eleme...
    99+
    2024-04-02
  • vue中的slot封装组件弹窗怎么实现
    这篇文章主要介绍了vue中的slot封装组件弹窗怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue中的slot封装组件弹窗怎么实现文章都会有所收获,下面我们一起来看看吧。slot封装组件弹窗<t...
    99+
    2023-06-30
  • 如何使用vue实现一个toast弹窗组件
    本篇内容介绍了“如何使用vue实现一个toast弹窗组件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先,我们来分析一下弹窗组件的特性(需...
    99+
    2023-07-04
  • react如何实现路由跳转前确认
    这篇文章主要介绍“react如何实现路由跳转前确认”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“react如何实现路由跳转前确认”文章能帮助大家解决问题。react实现路由跳转前确认功能的方法:1、...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作