React Hook实现对话框组件

React Hook实现对话框组件,供大家参考,具体内容如下

准备

思路:对话框组件是有需要的时候希望它能够弹出来,不需要的时候在页面上是没有任何显示的,这就意味着需要一个状态,在父组件点击按钮或其他的时候能够更改+ 它并显示,同时子组件(对话框组件)点击关闭的时候也需要更改这个状态。

      进阶:为对话框组件背景添加蒙皮,当对话框内容需要滚动时限制浏览器页面的滚动。

React Hook 主要用到了 useState,useContext,useContext 主要用于将父组件的 setStatus 传递给子组件以至于它可以更新状态。

附上 Dialog 和 DialogMain组件代码,其中DialogMain 为父组件,使用时只需将其挂载至 App.js。

代码

DialogMain 父组件代码

import React from "react"; import Dialog from "./dialog"; //初始化 Context export const StatusContext = React.createContext(); const DialogTest = () => {     //设置状态控制对话框的打开与关闭     const [status, setStatus] = React.useState(false);     //条件渲染,符合条件返回 Dialog 组件否则返回 null     function GetDialog() {         if (status) return <Dialog />;         else return null;     }     //打开函数     function openDialog() {         //打开时禁止浏览器外面的滚动,注释掉这行鼠标在对话框外面时可以滚动浏览器界面         document.body.style.overflow = "hidden";         setStatus(true);     }     return (         <div>             {/* 按钮绑定打开函数 */}             <button onClick={openDialog}>打开对话框</button>             {/* 使用 Context 的 Provider 暴露 setStatus 方法 */}             <StatusContext.Provider value={{ setStatus }}>                 <GetDialog />             </StatusContext.Provider>         </div>     ); }; export default DialogTest;

Dialog子组件代码

import React from "react"; import { StatusContext } from "./dialogMain"; const Dialog = (props) => {     //利用解构赋值将 setState 从 useContext分离出来     const { setStatus } = React.useContext(StatusContext);     //关闭时更改 Status 状态为 false     function uninstallDialog() {         setStatus(false);         //关闭时重新将浏览器界面设置为滚动或其他         document.body.style.overflow = "scroll";     }     // 点击蒙层本身时关闭对话框,点击对话框的内容时不关闭     function handleClick(event) {         if (event.target === event.currentTarget) {             //调用关闭的方法             uninstallDialog();         }     }     return (         // 为整个组件添加css 样式并让其置于顶层,同时对话框意外的地方添加模糊效果         <div             style={{                 position: " fixed",                 top: 0,                 left: 0,                 right: 0,                 bottom: 0,                 background: "rgba(0, 0, 0, 0.3)",                 zIndex: " 99",             }}             onClick={handleClick}         >             {/* 为对话框添加 css 样式,absolute定位时相对于容器的位置 ,同时将 overflow 设置为自动*/}             <div                 style={{                     position: "absolute",                     left: "50%",                     top: "50%",                     overflow: "auto",                     transform: "translate(-50%, -50%)",                     padding: "30px 30px",                     width: " 200px",                     height: " 200px",                     border: "2px solid yellow",                     borderRadius: "8px",                     background: "yellow",                 }}             >                 {/* 为关闭按钮绑定关闭方法 */}                 <button onClick={uninstallDialog}>关闭</button>                 对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框                 对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框                 对话框 对话框 对话框 对话框 对话框 对话框 对话框 对话框 对话框             </div>         </div>     ); }; export default Dialog;

App.js代码

import "./App.css"; import DialogMain from "./component/dialogTest/dialogMain"; function App() {     return (         <div className="App">             <div style={{ height: "2000px" }}>                 <DialogMain />             </div>         </div>     ); } export default App;

运行界面

推荐阅读

    React解决长列表方案|react-virtualized

    React解决长列表方案|react-virtualized,元素,过程,github地址高效渲染大型列表的响应式组件 使用窗口特性,即在一个滚动的范围内,呈现你

    ReactOS是什么

    ReactOS是什么,审查,开发者,通用,开放源码,项目,维护,  ReactOS是一个开发与Windows NT和Windows 2000 应用程序、硬件驱动程序兼容的开源操

    用React完成一个图片轮播组件

    用React完成一个图片轮播组件,用,React,完成,一个,图片,轮播,组件,使用,React,,  使用React实现上述功能,首先,划分组件:  <SlideMS><Sli

    初学react用什么书籍

    初学react用什么书籍,初学,react,用,什么,书籍,初学,react,用,什么,,  初学react用什么书籍?  如果你没接触过JS,那么就要从JS基础开始

    Vue3.0API介绍中reactive使用示例

    Vue3.0API介绍中reactive使用示例,Vue3.0API,介绍,中,reactive,使用,示例,Vue3.0API,,Vue3.0API介绍中reactive使用示例reactive返回对象

    Angular 4.x中表单Reactive Forms详解

    这篇文章主要介绍了Angular 4.x中表单Reactive Forms的相关资料,文中通过示例代码介绍的非常详细,相信对大家具有一定的参考价值,需要的朋