React 模态框的设计(七)整合与测试

一个弹窗是不是也挺复杂的,是的,往往看似简单的东西真正做起来很复杂。只有多试验才能出真知。光看不练肯定是不行的。下面我们来把前几节的内容整合一下就大功告成了。

_Model.jsx

/** @jsxImportSource @emotion/react */
import { css, jsx, keyframes } from '@emotion/react'
import React, { useState, useRef, useEffect, useCallback } from 'react';import ModelHeader from './_ModelHeader';
import ModelMask from './_ModelMask';
import ModelContent from './_ModelContent';
import ModelActions from './_ModelActions';
import ModelContainer from './_ModelContianer';
import Draggable from './_Draggable';
import { ModelContext } from './_useModel';
import SThemeProvider from '../STheme/SThemeProvider';
import { useSTheme } from '../STheme/useToggleThemeHook';function Model(props) {const {sizeMode = "sm", //弹窗的大小level = "default", // 弹窗的类型(主要是颜色类型),选项有:normal, error, warning, success, infotitle = "提示", //标题isDark,onClose,  //关闭弹窗后的回调enableDragging = true,enableController = true, //是否显示控制按钮content = "暂无弹窗内容", //弹窗内容actions = [ //操作按钮{title: "确定", //按钮标题attention: false, //是否为操作按钮onClick: (setLoading, setTitle, setDisable, onClose) => { onClose(); } //按钮回调},],//功能按钮} = props;const [stateMode, setStateMode] = useState(1); // 弹窗的状态,0: 最小化, 1: 正常, 2: 最大化const theme = useSTheme(); //获取主题console.log(`theme => ${theme}`);return (<SThemeProvider isDark={isDark}><ModelContext.Provider value={{stateMode, // 弹窗的状态,0: 最小化, 1: 正常, 2: 最大化setStateMode, // 设置弹窗的状态sizeMode, //弹窗最大宽度onClose, //关闭弹窗的回调isDark, //是否是暗黑模式level, // 弹窗的类型(主要是颜色类型),选项有:normal, error, warning, success, info}}><ModelMask><DraggableenableDragging={enableDragging && stateMode !== 2 }enableHandler={true}stateMode={stateMode}><ModelContainer><ModelHeaderclassName=".model-handler"title={title}level={level}onClose={onClose}enableController={enableController}/>{content &&<ModelContent>{content}</ModelContent>}{actions && actions.length > 0 &&<ModelActions actions={actions} onClose={onClose} />}</ModelContainer></Draggable></ModelMask></ModelContext.Provider></SThemeProvider>);
};export default Model;

相关的内容前几节已经讲得很通透了。

下面我们来测试吧:

PopModelTest.jsx

import React from 'react';
import Stack from '@mui/material/Stack';
import Button from '@mui/material/Button';
import useModel from '../../framework-kakaer/SModel/_useModel';
import Model from '../../framework-kakaer/SModel/_Model';const longContent = `碧玉妆成一树高”,写柳树给人的总体印象。柳树的形象美在于它那曼长披拂的枝条,一年一度,它长出了嫩绿的新叶,丝丝下垂,在春风吹拂中,有着一种迷人的意态。这里的“碧玉”既可指真实的玉,又暗含“碧玉小家女”(《碧玉歌》)中“碧玉”之意,指小户人家出身的年轻秀美的女子。古典诗词常借用柳树的形象美来形容美人苗条的身段、婀娜的腰肢,但此诗别出新意,翻转过来,将柳树化身为美人。用“碧玉”来比柳实际上有两层意思:一是“碧玉”和柳的颜色有关,“碧”和下句的“绿”是互相生发、互为补充的;二是“碧玉”这个人在人们头脑中留下的是年轻的印象,在古代文学作品里,“碧玉”几乎成了年轻貌美的女子的泛称。用“碧玉”来比柳,人们就会想象到这美人还未到丰容盛鬋的年华,这柳也还是早春稚柳,没有到密叶藏鸦的时候,同时和下文的“细叶”“二月春风”又是有联系的。
“万条垂下绿丝绦”,具体描写那茂密并轻柔下垂的柳枝,它是柳树最具代表性的部分。有了上句的铺垫,这千条万缕的垂丝,也随之变成了美人的裙带。上句的“高”字,衬托出美人婷婷袅袅的风姿;下句的“垂”字,暗示出纤腰在风中款摆。诗中没有“杨柳”和“腰肢”字样,然而这早春的垂柳以及柳树化身的美人,却给写活了。《南史》说刘悛之为益州刺史,献蜀柳数株,“条甚长,状若丝缕”。齐武帝把这些杨柳种植在太昌云和殿前,玩赏不置,说它“风流可爱”。这里把柳条说成“绿丝绦”,可能是暗用这个关于杨柳的典故。但这里的化用,几乎看不出一点痕迹。
“不知细叶谁裁出,二月春风似剪刀。”这两句进一步细描细绘,刻画柳树的嫩叶。每一片树叶都造型别致,纹理细腻,仿佛都是精心裁剪而出。诗人由于惊叹不禁发问:这满树的细叶到底出自哪位高明的裁缝之手?接着找到了答案:原来是大自然的杰作,她手持二月春风这把大剪刀裁出了满树春色。绿叶好比美人衣裙上的花纹和图案,至此,那位美人便形神毕现地跃然纸上了。“二月春风似剪刀”这一新巧的比喻,把视之无形又不可捉摸的春风形象化地描绘出来。春风和剪刀,本来全不相干,它们的相同处只存在于诗人的想象之中。因此,“二月春风似剪刀”既新奇,又能唤起人们丰富的联想。
这首诗立意高远,比喻巧妙,先从大处着眼,然后分部描述,越写越细,把柳树的形神栩栩如生地表现了出来。题目是咏柳,但又不仅仅是咏柳,更是咏春,歌咏自然造化。全诗由“碧玉妆成”引出了“绿丝绦”,“绿丝绦”引出了“谁裁出”,最后,那视之无形的不可捉摸的“春风”,也被用“似剪刀”形象化地描绘了出来。这“剪刀”裁制出嫩绿鲜红的花花草草,给大地换上了新妆,它正是自然活力的象征,是春给予人们美的启示。从“碧玉妆成”到“剪刀”,可以看出诗人一系列艺术构思的过程。诗歌里出现的一连串的形象,是一环紧扣一环的。`;const normalContent = "唐玄宗天宝三载(744),贺知章奉诏告老回乡,百官送行。他坐船经南京、杭州,顺萧绍官河到达萧山县城,越州官员到驿站相迎,然后再坐船去南门外潘水河边的旧宅。此时正是二月早春,柳芽初发,春意盎然,微风拂面。贺知章如脱笼之鸟回到家乡,心情自然格外高兴,即景写下了这首诗。";function PopModelTest() { const alertDefault = useModel({title: "默认提示",content: normalContent,enableController: false,});const alertIno = useModel({title: "信息提示",level: "info",content: normalContent,enableController: false,});const alertSuccess = useModel({title: "成功提示",level: "success",content: normalContent,enableController: false,});const alertWarning = useModel({title: "警告提示",level: "warning",content: normalContent,enableController: false,});const alertError = useModel({title: "错误提示",level: "error",content: normalContent,enableController: false,});const alertLong = useModel({title: "长内容提示",content: longContent,enableController: false,});let initStatus = true;const alertLoading = useModel({title: "异步提交提示",content: normalContent,enableController: false,actions: [{title: "提交",attention: false,onClick: (setLoading, setTitle, setDisable, onClose) => {if (initStatus) {setLoading(true);setTimeout(() => {setLoading(false);setTitle("提交成功, 可关闭");initStatus = false;}, 3000);} else {initStatus = true;onClose();}}}]});const alertMaxMin = useModel({title: "最大化最小化测试",level: "warning",content: normalContent,enableController: true,enableDragging: true,});const alertDrag = useModel({title: "拖动测试",level: "error",content: normalContent,enableController: false,enableDragging: true,});const morActionsAlert = useModel({title: "confirm测试",level: "info",content: normalContent,enableController: false,actions: [{title: "取消",attention: false,onClick: (setLoading, setTitle, setDisable, onClose) => {onClose();}},{title: "确定",attention: true,onClick: (setLoading, setTitle, setDisable, onClose) => {setLoading(true);setTimeout(() => {onClose();}, 3000);}}]});return (<Stack spacing={2}><Buttonvariant='contained'onClick={() => { alertDefault(Model) }}>default 弹窗</Button><Buttonvariant='contained'onClick={() => { alertIno(Model) }}>info 弹窗</Button><Buttonvariant='contained'onClick={() => { alertError(Model) }}>error 弹窗</Button><Buttonvariant='contained'onClick={() => { alertWarning(Model) }}>warning 弹窗</Button><Buttonvariant='contained'onClick={() => { alertSuccess(Model) }}>success 弹窗</Button><Buttonvariant='contained'onClick={() => { alertLong(Model) }}>长文 弹窗</Button><Buttonvariant='contained'onClick={() => { alertLoading(Model) }}>loading 弹窗</Button><Buttonvariant='contained'onClick={() => { morActionsAlert(Model) }}>多Action 弹窗</Button><Buttonvariant='contained'onClick={() => { alertDrag(Model) }}>可拖动弹窗</Button><Buttonvariant='contained'onClick={() => { alertMaxMin(Model) }}>可最大化最小化弹窗</Button></Stack>)
}export default PopModelTest;

本示例中所有的引入目录的位置请根据自己的项目做适当的调整。是不是很不错? 本弹窗系列到此完结。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/710514.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Redis:事务】

1 &#x1f351;事务概念&#x1f351; Redis 的事务和 MySQL 的事务概念上是类似的&#xff0c;都是把⼀系列操作绑定成⼀组&#xff0c;让这⼀组能够批量执⾏。 但是注意体会 Redis 的事务和 MySQL 事务的区别: 弱化的原⼦性: redis 没有 “回滚机制”. 只能做到这些操作 “…

常用网络协议的学习

TCP/IP TCP/IP的定义 TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff0c;传输控制协议/互联网协议&#xff09;是互联网的基本协议&#xff0c;也是国际互联网络的基础。 TCP/IP 不是指一个协议&#xff0c;也不是 TCP 和 IP 这两个协议的合称…

Linux中如何进行LVM逻辑卷扩容?

#注意&#xff1a;如果lv所在的vg有空间直接扩容就ok了&#xff01; 1.创建pv pvcreate /dev/sdb 执行以上命令得到以下内容&#xff1a; Physical volume "/dev/sdb" successfully created. 2.直接vgextend扩容 vgextend vg1 /dev/sdb #卷组名字&#xff0c;将…

k8s资源管理之声明式管理方式

1 声明式管理方式 1.1 声明式管理方式支持的格式 JSON 格式&#xff1a;主要用于 api 接口之间消息的传递 YAML 格式&#xff1a;用于配置和管理&#xff0c;YAML 是一种简洁的非标记性语言&#xff0c;内容格式人性化&#xff0c;较易读 1.2 YAML 语法格式&#xff1a; ●…

.net 日志

一、Log4net 1、log4net写入文本 1、nuget引入log4net、Microsoft.Extensions.Logging.Log4Net.AspNetCore这2个 2、引入配置文件,可以直接去官网(log4net官网配置文件)复制下来,放到项目目录下面,设置成始终复制,因为这个文件最终要到我们项目运行目录下面去 3、要在pr…

Vue3+springboot实现简单登录demo

Vue3从0搭建脚手架步骤【默认已安装node.js】 前置条件&#xff1a;默认已安装node.js、yarn 第一步&#xff1a;创建项目 选择任意一个空白文件夹如下&#xff1a; cmd进入该文件夹下的命令窗口模式&#xff0c;然后输入指令创建vue项目&#xff1a;vue create my-project …

智能指针(C++)

目录 一、智能指针是什么 二、为什么需要智能指针 三、智能指针的使用和原理 3.1、RALL 3.2 智能指针的原理 3.3、智能指针的分类 3.3.1、auto_ptr 3.3.2、unique_ptr 3.3.3、shared_ptr 3.2.4、weak_ptr 一、智能指针是什么 在c中&#xff0c;动态内存的管理式通过一…

Linux上C语言如何获取线程的返回值

文章目录 一、线程的三个重要的应用程序接口&#xff08;API&#xff09;1.1 线程的创建1.2 线程的退出1.3 线程的等待 二、让线程返回int类型的值二、让线程返回字符串(char*)类型的值 一、线程的三个重要的应用程序接口&#xff08;API&#xff09; 1.1 线程的创建 #includ…

PYCHARM PYSIDE6 QT 打包异常处理 no qt platform plugin could be initialized

安装有PYSIDE6的电脑 异常错误 … no qt platform plugin could be initialized … 变量名&#xff1a;QT_QPA_PLATFORM_PLUGIN_PATH &#xff08;一个字都不能改&#xff01;&#xff01;&#xff09; 自己环境变量值&#xff1a;D:\Users\topma\anaconda3\Lib\site-package…

React中对表格实现列表的拖拽排序

1. 效果:推拽手柄列 2. 实现: react中我们需要两个包来实现 ‘array-move’‘react-sortable-hoc’Installation Use npm $ npm install react-sortable-hoc --save 引入 import { arrayMoveImmutable } from array-move import { SortableContainer, SortableElement, Sort…

Jenkins笔记(一)

个人学习笔记&#xff08;整理不易&#xff0c;有帮助点个赞&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 目录 一&#xff1a;简单了解 二&#xff1a;什么是DevOps 三&#xff1a;安装Jenkins 四&#xff1…

Spring Boot 和 Spring Cloud: 区别与联系

Spring Boot 和 Spring Cloud: 区别与联系 在当今软件开发领域&#xff0c;微服务架构和快速开发成为了主流趋势。Spring框架作为Java生态系统中最流行的开发框架之一&#xff0c;也不例外地推出了Spring Boot和Spring Cloud这两个项目来满足这些需求。本文将详细探讨它们之间…

RK3568平台 EXPORT_SYMBOL的作用

一、EXPORT_SYMBOL 的作用 1.在一个模块中使用 EXPORT_SYMBOL(name)。name 表示函数或者变量等符号&#xff0c;它是对全部内核代码公开的&#xff0c;因此在您的内核模块中可以直接调用 name&#xff0c;即使用 EXPORT_SYMBOL 可以将一个函数以符号的方式导出给其他模块使用。…

MongoDB聚合运算符:$cond

文章目录 语法用法举例 $cond聚合运算符根据布尔表达式的结果返回两个表达式中的一个。 语法 { $cond: { if: <boolean-expression>, then: <true-case>, else: <false-case> } }或&#xff1a; { $cond: [ <boolean-expression>, <true-case>…

(案例贴2) html+css 倒计时器

欢迎大家使用这个计时器噢 老哥直接附代码咯. timer.html <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">&l…

GitLab--Merge Request 权限管理

场景 团队在日常开发工作中需要进行分支管理&#xff0c;通常使用feature分支进行开发&#xff0c;然后依次合并到dev分支、release分支&#xff0c;整个代码合并过程不仅仅是代码合并还需要对代码进行审核&#xff0c;如果在线下进行审核合并&#xff0c;这样操作无法保留痕迹…

【力扣hot100】刷题笔记Day18

前言 晚上巩固一下今天的回溯题&#xff0c;基础不牢地动山摇&#xff0c;po一张代码随想录总结的 组合补充 77. 组合 - 力扣&#xff08;LeetCode&#xff09; class Solution:def combine(self, n: int, k: int) -> List[List[int]]:path []res []def backtrack(star…

go垃圾回收

1 go 垃圾回收变更 Go 语言的垃圾回收器&#xff08;GC&#xff09;自其诞生以来一直在不断演进和优化&#xff0c;以提高性能、减少暂停时间和对程序执行的影响。以下是一些关键的改进和变更点&#xff1a; 并发标记周期&#xff1a; Go 语言从一开始就采用了并发标记&#xf…

日立F-4700FL数据分析实验报告

实验设定 日立F-4700FL为荧光分光光度计,可输出三维光谱扫描结果到计算机。D和L为两种化合物。对4种不同的溶液进行三维光谱扫描,得到的光谱文件如下。 溶质光谱文件无K.txtDD.txtLL.txtD+LH.txt光谱文件(txt)的内容格式如下。 Sample: ... File name: ... Run date: ... …

[C#] 重难点区分[In]、[Out]、in、out、in T、out T

[In] 属性&#xff1a; - [In] 属性用于标识参数是一个输入参数。这意味着参数的值将被传递到方法或函数&#xff0c;但在其执行期间不会被修改。 - 当通过 P/Invoke 或 COM 互操作调用函数时&#xff0c;使用 [In] 属性指示参数的传递方式为输入。 - 示例&#xff1a…