React encapsulates the global bullet box method

React encapsulates the global bullet box method

This article example shares the specific code of react encapsulation global pop-up box for your reference. The specific content is as follows

Pop-up effect diagram

File Layout

index.js

/* eslint-disable react/no-render-return-value */
import React, { Component } from 'react'
import { is, fromJS } from 'immutable'
import ReactDOM from 'react-dom'
import './alert.less'

const close = require('../images/guanbi.png')
const line = require('../images/line.png')

const defaultState = {
  alertStatus: false,
  alertTip: null,
  alertTitle: 'Details',
  closeAlert: () => {}
}

class Toptips extends Component {
  state = {
    ...defaultState
  }

  //css animation component is set to the target component FirstChild = props => {
    const childrenArray = React.Children.toArray(props.children)
    return childrenArray[0] || null
  }

  // Close the pop-up box confirm = () => {
    const that = this
    console.log(that)
    this.setState(
      {
        alertStatus: false
      },
      () => {
        that.state.closeAlert()
      }
    )
  }

  open = data => {
    const options = data || {}
    options.alertStatus = true
    this.setState({
      ...defaultState,
      ...options
    })
  }

  close = () => {
    const that = this
    that.state.closeAlert()
    this.setState({
      ...defaultState
    })
  }

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

  render() {
    const { alertStatus, alertTip, alertTitle } = this.state
    console.log(alertTip, alertTitle)
    return (
        <div
          className="alert-con"
          style={alertStatus ? { display: 'block' } : { display: 'none' }}
        >
          <div className="alert-context">
            <div className="alert-content-title">{alertTitle}</div>
            <img className="alert-content-line" src={line} alt="line" />
            <div className="alert-content-detail">{alertTip}</div>
            <img
              role="presentation"
              onClick={() => {
                this.confirm()
              }}
              className="alert-close"
              src={close}
              alt="Close"
            />
          </div>
        </div>
    )
  }
}

const div = document.createElement('div')
const props = {}
document.body.appendChild(div)

const Box = ReactDOM.render(React.createElement(Toptips, props), div)

export default Box

less

.alert-con {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(255, 255, 255, 0.3);
  z-index: 222;
}
.alert-context {
  // background-color: #fff;
  // border-radius: 16px;
  position: relative;
  // height: 500px;
  height: 90%;
  width: 750px;
  margin: 40px auto 0;
  background: url(../images/alertBJ.png) no-repeat center;
  background-size: 100% 100%;
  .alert-close{
    width: 30px;
    height: 30px;
    position: absolute;
    right: 30px;
    top: 30px;
  }
  .alert-content-title{
    width: 100%;
    height: 80px;
    line-height: 80px;
    color: #fff;
    text-align: center;
    font-size: 36px;
    font-weight: bold;
    // background: url(../images/line.png) no-repeat left bottom;
  }
  .alert-content-line{
    width: 100%;
    height: 20px;
    margin-top: -44px;
    margin-left: -6px;
  }
  .alert-detais-list{
    width: 102%;
    height: 100%;
    overflow-y: auto;
    padding: 20px 60px;
    .alert-detais-list-C{
      p{
        &:nth-child(1){
          font-size: 14px;
          line-height: 20px;
          color: #FFFFFF;
          letter-spacing: 1.4px;
        }
        &:nth-child(2){
          line-height: 24px;
          font-size: 18px;
          color: #FFFFFF;
        }
      }
    }
  }
  .alert-content-detail{
    // height: 100%;
    height: calc(100% - 100px);
    /* overflow-y: auto; */
    overflow: hidden;
    width: 98%;
    margin-top: -26px;
  }
  .alert-details-pdf{
    width: 102%;
    height: 100%;
    overflow-y: auto;
    padding: 20px 60px;
    .alert-details-button{
      display: flex;
      flex-direction: row;
      justify-content: flex-end;
      margin-bottom: 10px;
      p{
        color:#fff;
        line-height: 35px;
        font-size: 16px;
        margin-right: 20px;
      }
      a{
        line-height: 35px;
        font-size: 16px;
        margin-right: 20px;
      }
    }
  }
.cameraWrap{
  width: 100%;
  height: 102%;
  box-sizing: border-box;
  padding: 12px 4px 0 14px;
}
}

usage

  • alertTitle pop-up title
  • alertTip pop-up content, custom style
  • closeAlert returns information when closing, which is optional, depending on your needs.
import Toptips from "./Toptips"
Toptips.open({
      alertTitle: 'Comment details',
      alertTip: that.htms(val),
      closeAlert: function () {
        console.log("Closed...");
      }
    });
  htms = val => {
    return (<div className="alert-detais-list">
      <div className="alert-detais-list-C">
        <p>Comment content:</p>
        <p>{val.fdTitle}</p>
      </div>
      <div className="alert-detais-list-C">
        <p>Comment details:</p>
        <p>{val.fdTitle}</p>
      </div>
      <div className="alert-detais-list-C">
        <p>Measures and Results:</p>
        <p>{val.fdContent}</p>
      </div>
      <div className="alert-detais-list-C">
        <p>Progress details:</p>
        <p></p>
      </div>
    </div>)
  }

The above is the full content of this article. I hope it will be helpful for everyone’s study. I also hope that everyone will support 123WORDPRESS.COM.

You may also be interested in:
  • React uses antd form assignment to modify the operation of the pop-up box
  • React Native implements sample code for progress bar pop-up

<<:  In-depth understanding of Mysql logical architecture

>>:  Convert XHTML CSS pages to printer pages

Recommend

Solution to overflow:hidden failure in CSS

Cause of failure Today, when I was writing a caro...

How does Vue download non-same-origin files based on URL

Generally speaking, we can have the following two...

Detailed tutorial on installing Python 3 virtual environment in Ubuntu 20.04

The following are all performed on my virtual mac...

HTML Frameset Example Code

This article introduces a framework made by Frame...

setup+ref+reactive implements vue3 responsiveness

Setup is used to write combined APIs. The interna...

Detailed explanation of Vue's TodoList case

<template> <div id="root"> ...

How to monitor and delete timed out sessions in Tomcat

Preface I accidentally discovered that the half-h...

Detailed explanation of CSS background and border tag examples

1. CSS background tag 1. Set the background color...

Ten popular rules for interface design

<br />This is an article I collected a long ...

Basic syntax of MySQL index

An index is a sorted data structure! The fields t...

Example analysis of the page splitting principle of MySQL clustered index

This article uses an example to illustrate the pa...

Solution to the horizontal scroll bar in iframe under IE6

The situation is as follows: (PS: The red box repr...