经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » React » 查看文章
React?Hook实现对话框组件
来源:jb51  时间:2022/8/23 15:36:29  对本文有异议

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

准备

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

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

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

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

代码

DialogMain 父组件代码

  1. import React from "react";
  2. import Dialog from "./dialog";
  3. //初始化 Context
  4. export const StatusContext = React.createContext();
  5. const DialogTest = () => {
  6. ? ? //设置状态控制对话框的打开与关闭
  7. ? ? const [status, setStatus] = React.useState(false);
  8. ? ? //条件渲染,符合条件返回 Dialog 组件否则返回 null
  9. ? ? function GetDialog() {
  10. ? ? ? ? if (status) return <Dialog />;
  11. ? ? ? ? else return null;
  12. ? ? }
  13. ? ? //打开函数
  14. ? ? function openDialog() {
  15. ? ? ? ? //打开时禁止浏览器外面的滚动,注释掉这行鼠标在对话框外面时可以滚动浏览器界面
  16. ? ? ? ? document.body.style.overflow = "hidden";
  17. ? ? ? ? setStatus(true);
  18. ? ? }
  19. ? ? return (
  20. ? ? ? ? <div>
  21. ? ? ? ? ? ? {/* 按钮绑定打开函数 */}
  22. ? ? ? ? ? ? <button onClick={openDialog}>打开对话框</button>
  23. ? ? ? ? ? ? {/* 使用 Context 的 Provider 暴露 setStatus 方法 */}
  24. ? ? ? ? ? ? <StatusContext.Provider value={{ setStatus }}>
  25. ? ? ? ? ? ? ? ? <GetDialog />
  26. ? ? ? ? ? ? </StatusContext.Provider>
  27. ? ? ? ? </div>
  28. ? ? );
  29. };
  30.  
  31. export default DialogTest;

Dialog子组件代码

  1. import React from "react";
  2. import { StatusContext } from "./dialogMain";
  3.  
  4. const Dialog = (props) => {
  5. ? ? //利用解构赋值将 setState 从 useContext分离出来
  6. ? ? const { setStatus } = React.useContext(StatusContext);
  7. ? ? //关闭时更改 Status 状态为 false
  8. ? ? function uninstallDialog() {
  9. ? ? ? ? setStatus(false);
  10. ? ? ? ? //关闭时重新将浏览器界面设置为滚动或其他
  11. ? ? ? ? document.body.style.overflow = "scroll";
  12. ? ? }
  13. ? ? // 点击蒙层本身时关闭对话框,点击对话框的内容时不关闭
  14. ? ? function handleClick(event) {
  15. ? ? ? ? if (event.target === event.currentTarget) {
  16. ? ? ? ? ? ? //调用关闭的方法
  17. ? ? ? ? ? ? uninstallDialog();
  18. ? ? ? ? }
  19. ? ? }
  20. ? ? return (
  21. ? ? ? ? // 为整个组件添加css 样式并让其置于顶层,同时对话框意外的地方添加模糊效果
  22. ? ? ? ? <div
  23. ? ? ? ? ? ? style={{
  24. ? ? ? ? ? ? ? ? position: " fixed",
  25. ? ? ? ? ? ? ? ? top: 0,
  26. ? ? ? ? ? ? ? ? left: 0,
  27. ? ? ? ? ? ? ? ? right: 0,
  28. ? ? ? ? ? ? ? ? bottom: 0,
  29. ? ? ? ? ? ? ? ? background: "rgba(0, 0, 0, 0.3)",
  30. ? ? ? ? ? ? ? ? zIndex: " 99",
  31. ? ? ? ? ? ? }}
  32. ? ? ? ? ? ? onClick={handleClick}
  33. ? ? ? ? >
  34. ? ? ? ? ? ? {/* 为对话框添加 css 样式,absolute定位时相对于容器的位置 ,同时将 overflow 设置为自动*/}
  35. ? ? ? ? ? ? <div
  36. ? ? ? ? ? ? ? ? style={{
  37. ? ? ? ? ? ? ? ? ? ? position: "absolute",
  38. ? ? ? ? ? ? ? ? ? ? left: "50%",
  39. ? ? ? ? ? ? ? ? ? ? top: "50%",
  40. ? ? ? ? ? ? ? ? ? ? overflow: "auto",
  41. ? ? ? ? ? ? ? ? ? ? transform: "translate(-50%, -50%)",
  42. ? ? ? ? ? ? ? ? ? ? padding: "30px 30px",
  43. ? ? ? ? ? ? ? ? ? ? width: " 200px",
  44. ? ? ? ? ? ? ? ? ? ? height: " 200px",
  45. ? ? ? ? ? ? ? ? ? ? border: "2px solid yellow",
  46. ? ? ? ? ? ? ? ? ? ? borderRadius: "8px",
  47. ? ? ? ? ? ? ? ? ? ? background: "yellow",
  48. ? ? ? ? ? ? ? ? }}
  49. ? ? ? ? ? ? >
  50. ? ? ? ? ? ? ? ? {/* 为关闭按钮绑定关闭方法 */}
  51. ? ? ? ? ? ? ? ? <button onClick={uninstallDialog}>关闭</button>
  52. ? ? ? ? ? ? ? ? 对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框
  53. ? ? ? ? ? ? ? ? 对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框对话框
  54. ? ? ? ? ? ? ? ? 对话框 对话框 对话框 对话框 对话框 对话框 对话框 对话框 对话框
  55. ? ? ? ? ? ? </div>
  56. ? ? ? ? </div>
  57. ? ? );
  58. };
  59. export default Dialog;

App.js代码

  1. import "./App.css";
  2. import DialogMain from "./component/dialogTest/dialogMain";
  3. function App() {
  4. ? ? return (
  5. ? ? ? ? <div className="App">
  6. ? ? ? ? ? ? <div style={{ height: "2000px" }}>
  7. ? ? ? ? ? ? ? ? <DialogMain />
  8. ? ? ? ? ? ? </div>
  9. ? ? ? ? </div>
  10. ? ? );
  11. }
  12.  
  13. export default App;

运行界面

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号