React Hook实现对话框组件

 更新时间:2022年08月23日 14:59:16   作者:weixin_45703889  
这篇文章主要为大家详细介绍了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重新渲染超详细讲解

    什么是re-render(重新渲染)?哪些是必要的re-render?哪些是非必要的re-render?如果你对这些问题还不是很明白,那么可以在这篇文章中找到答案
    2022-11-11
  • React如何解决fetch跨域请求时session失效问题

    React如何解决fetch跨域请求时session失效问题

    这篇文章主要给大家介绍了关于React如何解决fetch跨域请求时session失效问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • React Native使用Modal自定义分享界面的示例代码

    React Native使用Modal自定义分享界面的示例代码

    本篇文章主要介绍了React Native使用Modal自定义分享界面的示例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • React hook实现简单的websocket封装方式

    React hook实现简单的websocket封装方式

    这篇文章主要介绍了React hook实现简单的websocket封装方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • 浅析React 对state的理解

    浅析React 对state的理解

    state状态是组件实例对象身上的状态,不是组件类本身身上的,是由这个类缔造的实例身上的。这篇文章主要介绍了React 对state的理解,需要的朋友可以参考下
    2021-09-09
  • Reactjs + Nodejs + Mongodb 实现文件上传功能实例详解

    Reactjs + Nodejs + Mongodb 实现文件上传功能实例详解

    今天是使用 Reactjs + Nodejs + Mongodb 实现文件上传功能,前端我们使用 Reactjs + Axios 来搭建前端上传文件应用,后端我们使用 Node.js + Express + Multer + Mongodb 来搭建后端上传文件处理应用,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2022-06-06
  • React css-in-js基础介绍与应用

    React css-in-js基础介绍与应用

    随着React、Vue等支持组件化的MVVM前端框架越来越流行,在js中直接编写css的技术方案也越来越被大家所接受。为什么前端开发者们更青睐于这些css-in-js的方案呢,下面带你了解它
    2022-09-09
  • React受控组件与非受控组件详细介绍

    React受控组件与非受控组件详细介绍

    具体来说这是一种react非受控组件,其状态是在input的react内部控制,不受调用者控制。可以使用受控组件来实现。下面就说说这个React中的受控组件与非受控组件的相关知识,感兴趣的朋友一起看看吧
    2022-09-09
  • Ant Design 组件库之步骤条实现

    Ant Design 组件库之步骤条实现

    这篇文章主要为大家介绍了Ant Design组件库之步骤条实现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • react16+antd4 RangePicker组件实现时间禁选示例

    react16+antd4 RangePicker组件实现时间禁选示例

    这篇文章主要为大家介绍了react16+antd4 RangePicker 时间禁选示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05

最新评论