react全局的公共组件-------弹框

最近研究react,发现写一个组件很容易,但是要写一个全局的好像有点麻烦。不能像VUE一样,直接在原型上面扩展,注册全局组件

下面实现一个弹框,只需要引入之后,直接调用方法即可,不需要写入组件

给出我写react全局组件的思路。

创建一个 div加入到body,用这个div当容器,渲染react组件,然后由改变组件的 state来控制弹框的显示隐藏

代码结构如下:

效果图如下:

alert.jsx

import React, { Component } from ‘react‘;
import { is, fromJS } from ‘immutable‘;
import ReactDOM from ‘react-dom‘;
import ReactCSSTransitionGroup from ‘react-addons-css-transition-group‘;
import ‘./alert.css‘;

class Alert extends Component{

  state = {
    alertStatus:false,
    alertTip:"提示",
    closeAlert:function(){}
  };
  // css动画组件设置为目标组件
  FirstChild = props => {
    const childrenArray = React.Children.toArray(props.children);
    return childrenArray[0] || null;
  }
  // 关闭弹框
  confirm = () => {
    this.setState({
      alertStatus:false
    })
    this.state.closeAlert();
  }

  shouldComponentUpdate(nextProps, nextState){
    return !is(fromJS(this.props), fromJS(nextProps)) || !is(fromJS(this.state), fromJS(nextState))
  }

  render(){
    return (
      <ReactCSSTransitionGroup
        component={this.FirstChild}
        transitionName=‘hide‘
        transitionEnterTimeout={300}
        transitionLeaveTimeout={300}>
        <div className="alert-con" style={this.state.alertStatus? {display:‘block‘}:{display:‘none‘}}>
          <div className="alert-context">
            <div className="alert-content-detail">{this.state.alertTip}</div>
            <div className="comfirm" onClick={this.confirm}>确认</div>
          </div>
        </div>
      </ReactCSSTransitionGroup>
    );
  }
}

let div = document.createElement(‘div‘);
let props = {

};
document.body.appendChild(div);

let Box = ReactDOM.render(React.createElement(
  Alert,
  props
),div);

let defaultState = {
  alertStatus:false,
  alertTip:"提示",
  closeAlert:function(){}
}

export default {
  open(options){
    options = options || {};
    options.alertStatus = true;

    Box.setState({
      ...defaultState,
      ...options
    })
  },
  close(){
    Box.setState({
      ...defaultState
    })
  }
}

  

 

alert.css

.alert-con {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, 0.3);
  z-index: 11;
}
.alert-context {
  background-color: #fff;
  border-radius: 16px;
  height: 200px;
  width: 80%;
  margin: 40% auto 0;
}
.alert-context .alert-content-detail {
  text-align: center;
  color: #333;
  font-size: 24px;
  height: 150px;
  line-height: 150px;
}
.alert-context .comfirm {
  border-top: 1PX solid #eee;
  box-sizing: border-box;
  height: 50px;
  line-height: 50px;
  text-align: center;
  font-size: 20px;
  color: #666;
}
.alert-enter {
  opacity: 0;
}
.alert-enter.alert-enter-active {
  transition: all 300ms;
  opacity: 1;
}
.alert-leave {
  opacity: 1;
}
.alert-leave.alert-leave-active {
  transition: all 300ms;
  opacity: 0;
}

  

使用方式:

import React, { Component } from ‘react‘;

import Alert from "../components/alert/alert.jsx";

class Two extends Component {
	constructor(props){
		super(props);
		this.state = {
			num:1
		};
	}

	open=()=>{
		Alert.open({
			alertTip:"这是一个测试弹框",
			closeAlert:function(){
				console.log("关闭了...");
			}
		});
	}
  render() {
    return (
       <div className="Two">
        	Two
		<button onClick={this.open}>
			 开启宝藏
		</button>
        	<div>{this.state.num}</div>
       </div>
    );
  }
}

export default Two;

上面直接引入 alert.jsx之后,调用 open函数即可

这样的好处,解决了弹框的层级问题,使用更加方便快捷

原文地址:https://www.cnblogs.com/muamaker/p/9623425.html

时间: 2024-11-10 11:27:54

react全局的公共组件-------弹框的相关文章

vue组件弹框过渡效果,如,点击显示为从左到右滑动,收回隐藏为从右到左滑动

vue组件 <transition name="carHistory"> <car-History-Line v-show="showHistoryLine" @closeHitsory='closeHitsory'></car-History-Line> </transition> css .carHistory-enter { animation: carHistory-dialog-fade-in 0.3s ea

公共组件的抽取-page-title

我们在开发的时候,难免遇到公共组件的开发,这时为了复用,可以开发一个公共的模块,那么react怎么开发公共组件呢? 需求: 开发公共的page-title组件 1.静态模版先写好(html+css) <div classname="row"> <div classname="col-md-12"> <h1 classname="page-title">首页</h1> </div> <

基于vue以及vuex的dialog弹出框公共组件

说明:    一款dialog公共组件, 组件功能: 1. 可拖拽.放大缩小 2. 通过传入属性决定是否使用遮罩层    3. 可根据屏幕自动适应宽高,也可自动传入宽高 4. 自动适应位置相对屏幕居中 5. close关闭按钮等回调函数 详细见github地址:https://github.com/SwnCowDevil/my-dialog 原文地址:https://www.cnblogs.com/sunweinan/p/8695341.html

react初探(二)之父子组件通信、封装公共组件

一.前言 在组件方面react和Vue一样的,核心思想玩的就是组件,下面举两个组件常用的情景. 场景一:假如我们现在有一个页面包含表格以及多个弹框,这种时候如果将这个页面的业务代码写在一个组件中,那么这一块的代码会看着非常恶心.如果这个时候我们将这个页面的表格以及弹框这些单独的模块分别写成组件的形式,然后再在这个页面中将这些组件引入进来,那样我们的代码会看着非常整洁.这样做会需要使用到父子组件之间的通信,下面会详细解释. 场景二:日常项目中我们会经常遇到某一个功能会在不同地方使用,但是每次使用的

弹框组件

因为项目中使用的较多,因此封装了一个组件,便于使用. /* *@file 弹框组件 *@description 用于所有提示弹框 *@time 2016/11/29 */ function PopModel(options) { var that = this; this.defaults = { width: '100px', // 默认框 height: '120px', // 默认高 isMask: true, // 是否遮罩 dir: 'mid', // mid中间,left左下,rig

移动端(H5)弹框组件--简单--实用--不依赖jQuery

俗话说的好,框架是服务与大家的,包含的功能比较多,代码多.在现在追求速度的年代.应该根据自己的需求去封装自己所需要的组件. 下边就给大家介绍一下自己封装的一个小弹框组件,不依赖与jQuery,代码少,适用于一般移动端小项目. 这个插件名称:MobileUi 包含功能:弹框,正在加载,tips1.5秒消失,清除正在加载. 如图:    接下来我来告诉大家怎么用吧!! 第一步:配置<meta name="viewport" content="width=device-wid

在iframe框架下实现全局弹框

公司使用的是iframe的框架来写的后台,即包含top,left,right,bottom,想要实现有消息时出现弹框,该弹框在所有的页面内都可以显示,现有实现方式如下: 原先的布局为在index页面设置的iframe等参数: <frameset rows="64,750,*" frameborder="NO" border="0" framespacing="0">    <frame src="t

VUE2.0增删改查附编辑添加model(弹框)组件共用

Vue实战篇(增删改查附编辑添加model(弹框)组件共用) 前言 最近一直在学习Vue,发现一份crud不错的源码 预览链接 https://taylorchen709.github.io/vue-admin/#/login 自己下载下来后仔细研究了起来,发现编辑和增加写了两个弹框,我觉得这不符合vue的组件原则,于是自己把编辑和添加改成共用的 因为也是纯粹的写写前端页面,所以数据方面用的是mock.js,真实的模拟请求. 这个项目用到的 技术栈: vue + webpack + vuex +

vue移动端弹框组件

最近做一个移动端项目,弹框写的比较麻烦,查找资料,找到了这个组件,但是说明文档比较少,自己研究了下,把我碰到的错,和详细用法分享给大家!有疑问可以打开组件看一看,这个组件是仿layer-mobile的,很多用法都一样,可以看看哦! 一.npm 安装 // 当前最新版本 1.2.0  npm install vue-layer-mobile // 如新版遇到问题可回退旧版本  npm install [email protected] 二.调整配置:因为这个组件中有woff,ttf,eto,svg