热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

useModal(简单)

介绍因为一个项目中会有很多弹框,然后如果是同类型的弹框的话每次都要重新写一遍Modal。这样的话也不能说有事,就是会写很多重复代码并且在后期维护会感觉

介绍

因为一个项目中会有很多弹框,然后如果是同类型的弹框的话每次都要重新写一遍Modal。这样的话也不能说有事,就是会写很多重复代码并且在后期维护会感觉很难受,所以基于hooks我们也可以简单的做一个useModal

这里的话我是做了一个基于表单的useFormModal

封装

hooks/useFormModal

import React, { useState } from 'react';
import { Modal } from 'antd';interface modalState {initTitle: string,initContent: any,
}interface ModalProps {onOk: any,onCancel: any
}const useModal &#61; ({ initTitle, initContent }: modalState) &#61;> {const [visible, setVisible] &#61; useState(false);const content &#61; initContent;const [title, setTitle] &#61; useState(initTitle);const CustomModal &#61; (props: ModalProps) &#61;> {const onOk &#61; () &#61;> {const { onOk } &#61; props;const form &#61; content.props.form;onOk(form)}const onCancel &#61; () &#61;> {const { onCancel } &#61; props;onCancel()}return (<Modalvisible&#61;{visible}title&#61;{title}okText&#61;&#39;确定&#39;onOk&#61;{onOk}cancelText&#61;&#39;取消&#39;onCancel&#61;{onCancel}maskClosable&#61;{false}>{content}</Modal>)}const show &#61; () &#61;> {setVisible(true)}const hide &#61; () &#61;> {setVisible(false)}return { show, hide, CustomModal, setTitle }
}
export default useModal;

这里因为我是基于form封装的&#xff0c;所以最后我还是暴露form出去到最上面那层了

网上看到的例子是这样定义content的&#xff0c;但是我在后续使用中如果使用setContent的话会报错&#xff0c;所以我就改成了上面那种写法&#xff0c;不够感觉也足够了。如果有哪位大哥知道怎么用还请告知&#xff01;

const [content,setContent] &#61; useState(initContent);return { show, hide, CustomModal,setContent, setTitle }

还有一个问题&#xff0c;就是隐藏动画没了&#xff0c;我后面看了一下发现是dom节点隐藏的时候是被销毁了&#xff0c;而直接使用Modal的话是会保留在dom节点中&#xff0c;所以会有隐藏动画&#xff0c;不知道什么原因。

我的猜想就是使用hooks的话状态在另外一层&#xff0c;不在当前组件&#xff0c;所以他不会在当前页面保存&#xff0c;那这样就很有问题呀&#xff01;还是说倒回去用高阶组件包一层&#xff1f;

使用

addModal.tsx

import React from &#39;react&#39;;
import { Form, Input, Button } from &#39;antd&#39;;const layout &#61; {labelCol: { span: 24 },wrapperCol: { span: 24 }
}const tailLayout &#61; {wrapperCol: { offset: 8, span: 16 }
}export interface modalState {currentItem: any
}const AddModal &#61; (props: any) &#61;> {// console.log(&#39;AddModal&#39;, props)const { currentItem } &#61; props;const [form] &#61; Form.useForm()return (<Form{...layout}form&#61;{form}><Form.Itemlabel&#61;&#39;Username&#39;name&#61;&#39;username&#39;initialValue&#61;{currentItem.username}rules&#61;{[{ required: true, whitespace: true, message: &#39;请填写用户名&#39; }]}><Input autoComplete&#61;&#39;off&#39; /></Form.Item><Form.Itemlabel&#61;&#39;Password&#39;name&#61;&#39;password&#39;initialValue&#61;{currentItem.password}rules&#61;{[{ required: true, message: &#39;请填写密码&#39; }]}><Input.Password /></Form.Item><Form.Item {...tailLayout}><Button type&#61;&#39;primary&#39; htmlType&#61;&#39;submit&#39;>登录</Button></Form.Item></Form>)
}
export default AddModal;

这里的话主要就是接受数据渲染了&#xff0c;其他的最后扫尾就不用他来干了&#xff0c;这个组件就可以好好的专注于表单活动了。

index.tsx

import React from &#39;react&#39;;
import { Result, Button } from &#39;antd&#39;;
import moment from &#39;moment&#39;import useFormModal from &#39;&#64;/hooks/useFormModal&#39;;
import AddModal from &#39;./AddModal&#39;;import { modalState } from &#39;./TestModal&#39;;const userName &#61; window.localStorage.getItem(&#39;user&#39;);const currentItem &#61; {username: &#39;1&#39;,password: &#39;123456&#39;
}const ModalProps: modalState &#61; {currentItem,
}const Home &#61; () &#61;> {/** * 添加弹框*/const {show: addShow,hide: addHide,CustomModal: AddCustomModal} &#61; useFormModal({ initTitle: &#39;添加&#39;, initContent: AddModal(ModalProps) })// useModal/*** 添加*/const AddCustomModalProps &#61; {onOk: function () {console.log([...arguments][0]);const form &#61; [...arguments][0];let values &#61; form.getFieldValue();console.log(values);addHide()},onCancel: function () {addHide()}}return (<div><Resultstatus&#61;"success"title&#61;{&#96;Hello ${userName}!&#96;}subTitle&#61;{&#96;当前事件为&#xff1a; ${moment(new Date).format(&#39;YYYY.MM.DD HH:mm&#39;)}&#96;}extra&#61;{[<Button type&#61;"primary" key&#61;"1" onClick&#61;{addShow}>弹框1</ Button>]}/><AddCustomModal {...AddCustomModalProps} ></AddCustomModal></div>)
}
export default Home;

这样通过props来回归最后的提交动作&#xff0c;这样的话就专注于每个组件处理自己的事情。

效果

useFormModal

写在后面

不推荐上面这种封装写法&#xff0c;原因就是后面的节点不会留在dom中&#xff0c;所以一些动效就没了。然后也不够标准化&#xff0c;所以还是建议Modal单独写&#xff0c;不过他的title,type,visible可以单独拎出来做管理。类似这种

import { useState, useMemo } from &#39;react&#39;;declare type ModalType &#61; &#39;add&#39; | &#39;update&#39;;export interface useModalConfig {defaultVisible?: boolean;defaultType?: ModalType;
}export default function useModal(config: useModalConfig &#61; {}) {const { defaultType &#61; &#39;add&#39;, defaultVisible &#61; false } &#61; config;const [type, setType] &#61; useState<ModalType>(defaultType);const [visible, setVisible] &#61; useState<boolean>(defaultVisible);function toggle() {setVisible(!visible);}function setTypeWithVisible(val: ModalType) {setType(val);setVisible(true);}return useMemo(() &#61;> {return {type,setType,visible,setVisible,toggle,setTypeWithVisible,};}, [type, visible]);
}


推荐阅读
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • React项目中运用React技巧解决实际问题的总结
    本文总结了在React项目中如何运用React技巧解决一些实际问题,包括取消请求和页面卸载的关联,利用useEffect和AbortController等技术实现请求的取消。文章中的代码是简化后的例子,但思想是相通的。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 本文介绍了如何使用elementui分页组件进行分页功能的改写,只需一行代码即可调用。通过封装分页组件,避免在每个页面都写跳转请求的重复代码。详细的代码示例和使用方法在正文中给出。 ... [详细]
  • node.jsrequire和ES6导入导出的区别原 ... [详细]
author-avatar
我爱麦兜李
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有