首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

React :所有的Modal都会一次打开,当我在modal中传递道具时,只有最后一个会出现

React是一个用于构建用户界面的JavaScript库。它采用组件化的开发模式,可以将界面拆分成独立的、可复用的组件,通过组件的组合和嵌套来构建复杂的用户界面。

在React中,Modal是一种常见的弹出窗口组件,用于在当前页面上展示额外的内容或交互。根据提供的问题描述,所有的Modal都会一次打开,这可能是由于Modal组件的使用方式不正确导致的。

当在Modal中传递道具(props)时,只有最后一个会出现,这可能是由于在循环中创建多个Modal组件时,没有正确地传递不同的道具值导致的。解决这个问题的方法是确保每个Modal组件都有独立的道具值,可以通过在循环中为每个Modal组件创建一个独立的道具对象来实现。

以下是一些可能导致问题的代码示例:

代码语言:txt
复制
// 错误示例
const modals = [
  { id: 1, content: 'Modal 1' },
  { id: 2, content: 'Modal 2' },
  { id: 3, content: 'Modal 3' },
];

const App = () => {
  const [showModal, setShowModal] = useState(false);
  
  const handleOpenModal = () => {
    setShowModal(true);
  };
  
  return (
    <div>
      {modals.map(modal => (
        <Modal key={modal.id} show={showModal} content={modal.content} />
      ))}
      <button onClick={handleOpenModal}>Open Modal</button>
    </div>
  );
};

const Modal = ({ show, content }) => {
  return (
    <div className={`modal ${show ? 'show' : ''}`}>
      <div className="modal-content">{content}</div>
    </div>
  );
};

在上述示例中,由于所有的Modal组件都使用了相同的show道具值,导致它们会同时显示或隐藏。而在循环中传递的content道具值是正确的,但由于Modal组件的显示状态相同,只有最后一个Modal组件的内容会显示出来。

为了解决这个问题,我们可以为每个Modal组件创建一个独立的显示状态和内容道具值。以下是修改后的示例代码:

代码语言:txt
复制
// 正确示例
const modals = [
  { id: 1, content: 'Modal 1' },
  { id: 2, content: 'Modal 2' },
  { id: 3, content: 'Modal 3' },
];

const App = () => {
  const [showModal, setShowModal] = useState({});
  
  const handleOpenModal = (modalId) => {
    setShowModal(prevState => ({
      ...prevState,
      [modalId]: true,
    }));
  };
  
  return (
    <div>
      {modals.map(modal => (
        <Modal
          key={modal.id}
          show={showModal[modal.id]}
          content={modal.content}
        />
      ))}
      <button onClick={() => handleOpenModal(1)}>Open Modal 1</button>
      <button onClick={() => handleOpenModal(2)}>Open Modal 2</button>
      <button onClick={() => handleOpenModal(3)}>Open Modal 3</button>
    </div>
  );
};

const Modal = ({ show, content }) => {
  return (
    <div className={`modal ${show ? 'show' : ''}`}>
      <div className="modal-content">{content}</div>
    </div>
  );
};

在修改后的示例中,我们使用了一个对象来存储每个Modal组件的显示状态。showModal对象的键是Modal的id,值表示Modal是否显示。当点击打开Modal的按钮时,我们更新showModal对象中对应Modal的显示状态,从而实现只显示一个Modal的效果。

腾讯云提供了一些与React相关的产品和服务,例如云服务器、云数据库、云存储等,可以根据具体需求选择适合的产品。更多关于腾讯云产品的信息可以参考腾讯云官方网站:腾讯云

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

优秀组件设计的关键:自私原则

一次迭代都会使组件进一步陷入困境,直到产品的设计和需求超过了组件本身的能力。 让我们考虑一下谦虚的Button组件。它具有欺骗性的复杂性,而且经常被困在考虑模式,因此,是一个很好的工作实例。...然而,在这个例子,开发团队决定将所有的变体放在同一个Button组件。 相反, text prop 被标记为可选。...但是问题来了,如果Button只有一个图标,应该使用哪个图标道具?iconAtStart和iconAtEnd都没有适当地描述Button。最终,我们决定把原来的图标道具带回来,用于仅有图标的变体。...以前的 Button 组件,第一个主要限制是 text prop 。从第一次迭代开始,就对Button的内容进行了限制。...任何喷射性的旅行者都会很快谈论他们的下一个目的地。对于像模态、抽屉和工具提示这样的组件来说,它们何时何地也同样重要。像这样的组件并不总是DOM呈现的。

1.8K30

React】1935- 来看看 SWR 如何用 React Hook 实现优雅请求

我们每一次发送请求后,后端响应的数据都会被缓存下来,当我们下一次请求相同接口,SWR 依然会发送请求,但是它会先将上一次请求的数据直接给你,然后再去发送请求。...当我们加载表格,我们会发送请求以获取表格需要的数据,在请求的过程我们可能会展示一个加载动画或者骨架屏。...如果我们表格数据加载完成后,我们操作一下表格的数据,例如删掉其中一条,此时发送删除请求成功后,我们一般重新请求一下表格的数据,那么此时 又会出现一次加载动画或者骨架屏。...Modal 组件中都使用了 SWR 请求同一个数据,当页面渲染Modal 组件的 useSWR 与页面的 useSWR 几乎同时触发,一定时间内重复的请求会被 SWR 删除,因此只会发送一个请求...而修改后每次打开弹窗都会随着 Modal 组件的挂载和卸载重新执行 Modal 组件内的 useSwr 方法,造成重复请求,如果你的 hook 还是嵌套使用的,那么重复请求的数量就更大了。

54110

鲁迅:世上本只需要一个Modal组件

背景 本文旨在分享,React hook 中大型台项目中的实践,适合熟悉 React hook 用法的同学,希望能对你有帮助。...看完这2个源码不到40行的状态管理库,你感叹:React简单状态的管理本该这样。...每次只有一个激活的modal和选中的数据一一对应,两者都是用操作的一瞬间确定的,且每次只有一个 modal 处于激活状态,所以用户的各种操作只是不断更新modal和data而已。...使用modal的页面,我们只需不断去更新全局记录值,当modal关闭只需全局记录值置为空即可。这样在当前的页面不需要再将烦人的众多modal一次次的引入,也不需要维护一系列的visible。...最后将data传入通过key确定的modal,塞进全局的modalContext。 // fn 是一个根据key返回对应 modal 的函数。

1.5K10

看完这篇,你也能把 React Hooks 玩出花

componentDidUpdate:该生命周期每次页面更新后都会被调用。那么按照之前的逻辑,就应该把所有的状态全部放在第二个状态,但是这样的话新增/删除一个状态都需要改变第二参数。...类组件,如果在 componentDidMount 多次调用 setState 设置一个值(当然不推荐这样做),并在成功的回调打印该值,那么最后的结果很可能会打印很多个相同的最后一次设置的值...而在 useEffect ,所有的变量的值都会保留在该副作用执行的时刻,类似于 for 循环中的 let 或者 闭包,所有的变量都维持副作用执行时的状态,也有人称这个为 Capture Value...useRef 保存的变量不会随着每次数据的变化重新生成,而是保持我们最后一次赋值的状态,依靠这种特性,再配合 useCabllback 和 useEffect 我们可以实现 preProps/preState...于是我们可以得出一个结论,使用了 Hook 的函数式组件,我们使用副作用/引用子组件都需要时刻注意对代码进行性能上的优化。

3.4K31

看完这篇,你也能把 React Hooks 玩出花

先讲概念 React v16.7.0-alpha 一次引入了 Hooks 的概念, v16.8.0 版本被正式发布。...componentDidUpdate:该生命周期每次页面更新后都会被调用。那么按照之前的逻辑,就应该把所有的状态全部放在第二个状态,但是这样的话新增/删除一个状态都需要改变第二参数。...类组件,如果在 componentDidMount 多次调用 setState 设置一个值(当然不推荐这样做),并在成功的回调打印该值,那么最后的结果很可能会打印很多个相同的最后一次设置的值...而在 useEffect ,所有的变量的值都会保留在该副作用执行的时刻,类似于 for 循环中的 let 或者 闭包,所有的变量都维持副作用执行时的状态,也有人称这个为 Capture Value...useRef 保存的变量不会随着每次数据的变化重新生成,而是保持我们最后一次赋值的状态,依靠这种特性,再配合 useCabllback 和 useEffect 我们可以实现 preProps/preState

2.9K20

【送红宝书】JavaScript 测试系列实战(四):掌握 React Hooks 测试技巧

result 属性又包含两个属性: current:测试 Hook 的返回值 error:测试 Hook 抛出的错误(如果有的话) 让我们来结合实际的例子看一下。...之前 useModalManagement 钩子的测试代码,我们仅仅只测试了调用 Hook 不会报错。...实际上,我们还希望测试以下用例: 默认渲染一个关闭的模态框 当调用 openModal 函数,能够打开模态框 我们来看看新的测试代码: // src/useModalManagement.test.js...注意 在编写 Jest 异步测试用例,如果涉及到 Promise 的使用(包括 async/await ),要确保 return 一个值,否则测试超时。详细介绍请参考 Jest 异步测试文档。...combineReducers 将所有的 Reducer 结合成 rootReducer(虽然这里只有一个 Reducer,但是这里为了完整地演示): // src/reducers/index.js

2.1K00

前端客户端性能优化实践

第一种方式Modal组件每次渲染都会被创建和销毁,而在第二种方式只有editVisible为true才会创建和渲染Modal组件。...而没有使用useCallback的情况下,每次组件重新渲染都会创建一个新的renderContent函数,即使函数的实现逻辑完全相同。这可能导致性能问题,特别是组件层级较深或渲染频繁的情况下。...但是需要注意的是,只有计算的成本比较高才需要使用useMemo,否则可能带来额外的开销**React.memo**- export default Item+ import { isEqual...这样做的目的是为了组件的初始渲染,给knowledge_list一个默认值,以避免解构出现undefined的情况。...所以,总结起来就是默认值如果传给子组件,父组件每一次更新都会导致子组件更新,导致子组件的React.memo失效拆分为状态自治的独立组件当一个组件的代码变得复杂或包含大量的子组件,可以考虑将其中的一部分代码抽取为一个独立的子组件

27600

Hooks + TS 搭建一个任务管理系统(三)-- 项目列表功能模块

forceRender 属性,这个属性可以控制是否强制渲染,这也是为了解决,我们打开,组件未渲染导致报错的问题 同时我们也可以发现,我们在当中设置了三元判断,这样是为了优化我们的用户体验,前面也提过了... : 这样其实我们的 modal 就已经做好了,接下来我们来完善一下这个 modal 的周边措施,当我们创建完成或者编辑完成,我们需要关闭...modal我们的 useProjectModel 已经暴露了 close 方法,我们只需要在 onFinish 调用即可 当 form 表单成功提交自动调用 onFinish 方法,...实现编辑,创建功能 我们点击编辑按钮,首先需要弹出 modal 编辑信息点击保存后,才需要调用发送请求 上代码 首先先处理 modal 的显示和关闭 (截取下拉框的关键代码)我们点击编辑按钮触发.../> } }, 在这里我们采用柯里化的方式优化了这段代码,我们在编写 pinProject ,采用了柯里化的方式,一次接收一个参数,返回一个函数,最后执行 mutate const { mutate

1.2K30

写给 vue2.0 开发者的 vue3.0 教程

这是因为使用ref创建的反应变量被包装在一个对象。这对于保持它们传递过程的活性是必要的。 如果您想详细了解refs的工作方式,最好查阅Vue Composition API文档。...最后,我们从setup方法返回modalState和toggleModalState,因为它们是模板呈现时传递给模板的值。...然而,它仍然像它在层级的最初位置一样工作(关于道具,事件等)。 因此,您保存代码之后,重新加载页面,开发工具检查DOM,您感到惊讶!...但是,Vue 3,现在建议您使用新的component选项显式地声明组件的事件。就像使用道具一样,您可以简单地创建一个字符串数组来命名组件将发出的每个事件 ......问题是,当槽内容仍然属于父内容,在编译确定了作用域样式。 Vue 3提供的解决方案是提供一个伪选择器::v- sloated(),允许您使用提供插槽的组件的作用域规则来锁定插槽内容。

2.7K40

快速了解React 16新特性

支持render返回数组和字符串 以前,一个组件的 render 方法如果要返回多个 element ,必须使用一个元素将它们包裹起来。这样可能导致很多不必要的嵌套。...React Fiber是什么东西呢?官方的解释是“React Fiber是对核心算法的一次重新实现”。 react加载或者更新组件的过程是同步进行的,所以当组件树比较庞大的时候,问题就出现了。...把一个耗时很长的任务分成很多小片,即让更新过程碎片化,每执行完一段任务,就交回控制权。这时react检查有没有优先级更高的任务要做,如果有那就去执行,没有的话就继续更新。...如DOM传递的自定义属性是函数类型或event handler,依然会被React忽略。...打包 react/lib/* 和 react-dom/lib/*已经被移除了。即使CommonJS环境React和ReactDOM都会被提前编译为一个单独的文件(“flat bundles”)。

1.2K10

19道高频vue面试题解答(上)

如果想实现一个 Modal怎么设计?...computed: 是计算属性,依赖其它属性值,并且 computed 的值有缓存,只有它依赖的属性值发生改变,下一次获取 computed 的值才会重新计算 computed 的值;watch:...更多的是「观察」的作用,类似于某些数据的监听回调 ,每当监听的数据变化时都会执行回调进行后续操作;运用场景:当我们需要进行数值计算,并且依赖于其它数据,应该使用 computed,因为可以利用 computed...v-if 是真正的条件渲染,因为它会确保切换过程条件块内的事件监听器和子组件适当地被销毁和重建;也是惰性的:如果在初始渲染条件为假,则什么也不做——直到条件第一次变为真,才会开始渲染条件块。...:它自身不会渲染一个 DOM 元素,也不会出现在父组件链

1.2K00

React 代码共享最佳实践方式

React官方实现一些公共组件,也用到了高阶组件,比如react-router的withRouter,以及Redux的connect。在这以withRouter为例。...Render Props使用场景 我们项目开发可能需要频繁的用到弹窗,弹窗 UI 可以千变万化,但是功能却是类似的,即打开和关闭。...: this.renderModal }) } } 这样我们就完成了一个具备状态和基础功能的Modal,我们在其他页面使用该Modal,只需要关注特定的业务逻辑即可。...,传入render的值都会不一样,而实际上并没有差别,这样导致性能问题。...哪怕是最为最热门的react hook,虽然每一个hook看起来都是那么的简短和清爽,但是实际业务,通常都是一个业务功能对应多个hook,这就意味着当业务改变,需要去维护多个hook的变更,相对于维护一个

3K20

React 构建可复用的设计系统

开始 一开始你需要一个空的 React 项目。最快捷的方式就是 create-react-app,但是,还是需要设置一下 Sass。 我创建了一个应用框架,你可以 GitHub 克隆它。...网格系统 着手构建任何设计项目首先考虑的是需要理解网格是如何构建的。对于很多应用来说,这很随意。这会导致间距系统非常零散,并且开发者很难确定该使用那个间距。 因此需要确定一个合适的间距。...当我一次阅读 4px - 8px 网格系统就爱上了它。遵守这一规则会简化我们样式的很多问题。 让我们代码先设置一个基本的网格系统。我们从设置布局的 app 组件开始。...通常,我们定义一个基本的全局样式,需要的情况下复写它。 这经常会导致设计不一致。让我们看看如何通过设计库来轻松的解决这个问题。 首先,我们定义一些样式常量和一个 class 容器。... React 16 有详细介绍。 使用 Modal 组件 现在,组件已经定义好了,让我们看看如何在业务场景中使用它。

3.2K30

React 构建可复用的设计系统

开始 一开始你需要一个空的 React 项目。最快捷的方式就是 create-react-app,但是,还是需要设置一下 Sass。 我创建了一个应用框架,你可以 GitHub 克隆它。...网格系统 着手构建任何设计项目首先考虑的是需要理解网格是如何构建的。对于很多应用来说,这很随意。这会导致间距系统非常零散,并且开发者很难确定该使用那个间距。 因此需要确定一个合适的间距。...当我一次阅读 4px - 8px 网格系统就爱上了它。遵守这一规则会简化我们样式的很多问题。 让我们代码先设置一个基本的网格系统。我们从设置布局的 app 组件开始。...通常,我们定义一个基本的全局样式,需要的情况下复写它。 这经常会导致设计不一致。让我们看看如何通过设计库来轻松的解决这个问题。 首先,我们定义一些样式常量和一个 class 容器。... React 16 有详细介绍。 使用 Modal 组件 现在,组件已经定义好了,让我们看看如何在业务场景中使用它。

1.4K20

React-其它内容-Portals 和 React-父子组件通讯-类组件

默认情况下, 所有的组件都是渲染到 root 元素的Portal 提供了一种将组件渲染到其它元素的能力Portals 是根据 ReactDOM 的 createPortal 所得到的,createPortal...接收两个参数:第一个参数: 需要渲染的内容第二个参数: 渲染到什么地方还可以通过 this.props.children 获取到当前组件所有的子元素或者子组件:App.js:import React...={'header'}>我是头部 ) }}export default Header;类组件当中接收其实自动将 props 对象传递给构造函数当中,然后调用 super...() 传递给父构造函数即可,不用再当前类当中定义一个 props 去接收和保存了,以为父类当中已经有了 props 所以我们就无需进行保存了。...~ 关注我不迷路,如果本篇文章对你有所帮助,或者你有什么疑问,欢迎评论区留言,我一般看到都会回复的。

13920

Typescript配合React实践

如果按部就班的写React就体会不到使用ts的乐趣,如果多对代码进行优化,进行重构,在业务实践比较好的一些方案就会体会到ts真正的乐趣,但是ts也在过程给我带来了痛苦,本文的最后会具体展开一下。...但是ts的静态类型检查就帮你解决了这个问题,对于每一个父组件没有传递的值来说,都会提示错误。而且ts的报错是在编译,不是在运行时。...在上一篇文章编写不用redux的React代码说明我当前遇到的业务场景。 最终决定把所有的interface都放在公用的schemas目录然后具体的业务中进行具体引用。...state通过下面的方式设置为只是可读的,这种方式虽然好,但是我的项目中不会出现,这种错误只有React接触的新人或者以前写Vue的人犯的,我的项目中一共两个人,不会出现在这种问题。...如果写的是函数组件, @types/react定义了一个类型 type SFC=StatelessComponent;。

90220

如何在 React 中点击显示或隐藏另一个组件?

React 是一种流行的 JavaScript 库,用于构建动态用户界面。一个 React 应用程序,有时需要一个按钮或链接来触发显示或隐藏一个相关的组件。...使用 React 状态管理控制组件可见性React 的状态是指组件私有的数据,它决定了组件呈现时的外观和行为。当状态更改时,组件重新呈现,以反映这些变化。...当用户单击菜单按钮,菜单应该出现,然后当用户单击菜单外部,菜单应该消失。下面是一个示例,展示如何使用 React 和事件处理函数来实现菜单的显示和隐藏。...当用户单击打开模态框的按钮,模态框应该出现;当用户单击关闭按钮或模态框之外,模态框应该消失。下面是一个示例,展示如何使用 React 和事件处理函数来实现模态对话框的显示和隐藏。...这些示例可以用作参考,帮助你自己的 React 应用程序实现点击显示或隐藏另一个组件的功能。

4.4K10

75.精读《Epitath 源码 - renderProps 新用法》

RenderProps 嵌套问题的解法 renderProps 虽然好用,但当我们想组合使用时,可能遇到层层嵌套的问题: {counter => {...immutable generator 辅助库,每次调用 .next 都会生成一个新的引用,而不是自己发生 mutable 改变: import immutagen from "immutagen";...存在的问题 crimx 讨论中提到,Epitath 方案存在的最大问题是,每次 render 都会生成全新的组件,这对内存是一种挑战。...稍微解释一下,无论是通过 原生的 renderProps 还是 compose,同一个组件实例只生成一次React 内部会持久化这些组件实例。...4 总结 epitath 巧妙的利用了 immutagen 的不可变 generator 的特性来生成组件,并且递归 .next ,将顺序代码解析为嵌套代码,有效解决了 renderProps 嵌套问题

32830

前端常考react面试题(持续更新)_2023-02-26

如果该节点不存在,则该节点及其子节点会被完全删除,不会再进一步比较。 只需遍历一次,就能完成整棵DOM树的比较。 图片 那么问题来了,如果DOM节点出现了跨层级操作,diff咋办呢?...diff的不足与待优化的地方 尽量减少类似将最后一个节点移动到列表首部的操作,当节点数量过大或更新操作过于频繁影响React的渲染性能 react-router4的核心 路由变成了组件 分散到各个页面...一个 遍历其所有的子 元素,并仅渲染与当前地址匹配的第一个元素。...无论你何处渲染一个都会在应用程序的 HTML 渲染锚()。...> // React 当我们想强制导航,可以渲染一个,当一个渲染,它将使用它的

85120
领券