如何在 React 中创建可重用的自定义模态组件?

2024-01-09

我对 React 中的模态概念有疑问。当使用带有 jQ​​uery 的服务器端渲染模板时,我习惯于有一个始终可用的空全局模态模板(包含在始终扩展的基本模板中)。然后,当进行 AJAX 调用时,我只是填充模态......如下所示:

$('.modal-global-content').html(content);
$('.modal-global').show();

那么如何在 React 中提出这个概念呢?


有几种方法可以做到这一点。第一个涉及从父组件传递模态状态。以下是如何做到这一点 - 首先与家长一起App.js成分:

// App.js

import React from "react";

import Modal from "./Modal";

const App = () => {
  const [showModal, updateShowModal] = React.useState(false);

  const toggleModal = () => updateShowModal(state => !state);

  return (
    <div>
      <h1>Not a modal</h1>
      <button onClick={toggleModal}>Show Modal</button>
      <Modal canShow={showModal} updateModalState={toggleModal} />
    </div>
  );
}

export default App;

这是Modal.js将呈现模式的子组件:

// Modal.js

import React from "react";

const modalStyles = {
  position: "fixed",
  top: 0,
  left: 0,
  width: "100vw",
  height: "100vh",
  background: "blue"
};

const Modal = ({ canShow, updateModalState }) => {
  if (canShow) {
    return (
      <div style={modalStyles}>
        <h1>I'm a Modal!</h1>
        <button onClick={updateModalState}>Hide Me</button>
      </div>
    );
  }

  return null;
};

export default Modal;

这种方式非常好,但如果您在应用程序的许多地方重复使用模式,它可能会有点重复。因此,我建议使用上下文 API。

为您的模式状态定义一个上下文对象,在应用程序顶部附近创建一个提供者,然后每当您有一个需要呈现模式的子组件时,您就可以呈现模式上下文的使用者。通过这种方式,您可以轻松地将模态嵌套在组件树中更深处,而不必一直向下传递回调。以下是执行此操作的方法 - 首先创建一个context.js file:

// context.js

import React from "react";

export const ModalContext = React.createContext();

现在更新了App.js file:

// App.js

import React from "react";

import { ModalContext } from "./context";
import Modal from "./Modal";

const App = () => {
  const [showModal, updateShowModal] = React.useState(false);

  const toggleModal = () => updateShowModal(state => !state);

  return (
    <ModalContext.Provider value={{ showModal, toggleModal }}>
      <div>
        <h1>Not a modal</h1>
        <button onClick={toggleModal}>Show Modal</button>
        <Modal canShow={showModal} updateModalState={toggleModal} />
      </div>
    </ModalContext.Provider>
  );
}

export default App;

最后更新了Modal.js file:

// Modal.js

import React from "react";

import { ModalContext } from "./context";

const modalStyles = {
  position: "fixed",
  top: 0,
  left: 0,
  width: "100vw",
  height: "100vh",
  background: "blue"
};

const Modal = () => {
  return (
    <ModalContext.Consumer>
      {context => {
        if (context.showModal) {
          return (
            <div style={modalStyles}>
              <h1>I'm a Modal!</h1>
              <button onClick={context.toggleModal}>Hide Me</button>
            </div>
          );
        }

        return null;
      }}
    </ModalContext.Consumer>
  );
};

export default Modal;

这是一个代码沙盒 https://codesandbox.io/s/practical-flower-xrcdb?file=/src/App.js使用上下文链接到工作版本。我希望这有帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 React 中创建可重用的自定义模态组件? 的相关文章

随机推荐

  • JavaScript 验证输入的日期

    我是新来的Javascript编程 我正在尝试验证输入的日期
  • ML 中 ref 函数的用法

    考虑到 ref 运算符 我很难理解它的应用以及以下指令的含义 1 在这个定义中我定义什么 val ref x ref 9 val x 9 int 2 我在这里用 ref x ref 12 做什么 val x ref 8 val x ref
  • 计算跨浏览器 iframe 高度

    我的 JavaScript 经验中最困难的问题之一是正确 即 跨浏览器 计算iframe 高度 在我的应用程序中 我有很多动态生成的 iframe 我希望它们都在加载事件结束时执行某种自动调整大小以调整其高度和宽度 如果是height计算我
  • 为什么不能在 osx 中原生安装 docker?

    我希望能够在 OSX 中的 Vagrant 之外使用 docker 目前这是不可能的 导致它不只限于linux安装的具体原因是什么 Docker 只是系统提供的容器之上的一个抽象和自动化层 技术限制是 OS X 不支持操作系统级虚拟化 ht
  • 如何添加添加图像作为下拉箭头?

    我创建了一个带有下拉箭头的应用程序 但箭头的尺寸太小 所以我决定放大箭头的大小 我需要添加图像而不是箭头 是否可以添加图像或调整箭头大小 我当前的 CSS 如下 custom select after content content siz
  • Play框架会话和cookie如何工作?

    play 如何验证 cookie 我注意到重新启动服务器后我仍然登录 即使我 不要在数据库中保存任何会话数据 我也注意到了 我可以将服务器上的日期设置为大于到期日 cookie 的日期 但我仍然登录 我退出了 将 cookie 保存到文本文
  • 简单文件上传返回NULL?

    我正在尝试在 MVC 5 中进行第一个简单的文件上传 我正在遵循我找到的一堆示例 但由于某种原因 在我的 创建 ActionResult 中 uploadFile 始终为 NULL 因此上传代码为从不运行 有人看到我可能做错了什么吗 Vie
  • 单独类库中数据注释的本地化

    我们正在尝试为我们的域模型实现本地化 这些模型存在于我们的解决方案中的单独的类库项目中 然而 我们无法让它工作 因为我们的模型数据注释属性根本没有被翻译 项目结构 Solution Web project 资源文件夹 包含 resx 文件
  • 如何制作一个永不结束的迭代器?

    我只是想知道无限期地迭代集合的最简单方法是什么 即当它到达末尾时next 调用第一个对象 我假设这不是 Java 中预定义的函数 所以只是寻找在 Java 中实现它的最简单方法 有一个方法很优秀谷歌收藏 https github com g
  • 如何使用 conda 或 virtualenv 在虚拟环境之间共享包?

    我有多个 python 项目 每个项目都有自己的虚拟环境 另外我有一个全局 python 环境 我想在虚拟 全局环境之间共享相同的包文件 而不需要多次复制它们 如果可能 Environment Packages GLOBAL A B C D
  • 在编译时完全枚举 D 维数组的索引

    为了测试一些多维结构 需要生成编译时多维索引以完全覆盖所有可能的情况 我寻找编译时廉价的方法来实现上述目的 我目前所做的 include
  • java 10 中使用局部变量类型推断的限制

    Java 10引入了局部变量类型推断特征JEP 286 http openjdk java net jeps 286 我们可以使用局部变量类型推断var这是保留类型名称 但使用它有一些限制 有人可以总结一下在哪些情况下我将无法使用 var
  • 如何在android的城市飞艇中注册apid?

    I have completed client side code by download sample from git for push notification in android After execute of app i go
  • 有条件地更改 Razor 视图中的 CSS 类

    我需要更改 CSS 类 div 带有 forumChild 类的标签 它必须每 3 个循环更改一次 foreach 循环 有没有办法在控制范围内做到这一点 div class Forum p The Forum p foreach var
  • 是否可以在同一帧中打开新的 fxml 文件

    我在锚点窗格中创建了 fxml 文件 但每次我单击按钮时 我都会在新框架中得到下一个 fxml 我希望它在同一帧中打开 public void baropen ActionEvent event handle the event here
  • 导航栏按钮和项目未在 swift 3 中显示

    我在 swift 中以编程方式使用导航栏 但无法在导航栏中显示栏按钮项目 这是我所做的代码 override func viewDidLoad super viewDidLoad let navBar UINavigationBar UIN
  • 存在主义类型。为异构映射编写类的实例

    使用以下类型和类定义 我不明白为什么在创建时会出现错误instance below 我需要 MyMap 来保存异构值的映射 LANGUAGE ExistentialQuantification module Scratch SO Extis
  • 在 Three.js 中将材质分配给 OBJLoader 模型

    我使用以下代码导入了 OBJ 模型 var loader new THREE OBJLoader loader addEventListener load function geometry object geometry content
  • 卸载前检查应用程序是否在 NSIS 中运行

    我是 NSIS 新手 我需要知道在卸载程序中 如何检查应用程序 C 中的 是否正在运行并在卸载之前将其关闭 这是一个稍微更友好的使用版本NS进程 http nsis sourceforge net NsProcess plugin请求应用程
  • 如何在 React 中创建可重用的自定义模态组件?

    我对 React 中的模态概念有疑问 当使用带有 jQ uery 的服务器端渲染模板时 我习惯于有一个始终可用的空全局模态模板 包含在始终扩展的基本模板中 然后 当进行 AJAX 调用时 我只是填充模态 如下所示 modal global