当前位置: 首页 > 知识库问答 >
问题:

模态只显示React中映射数组的最后一个元素

顾淳
2023-03-14

现在,如果用户点击按钮,我正在尝试呈现元素各自的内容。现在,由于它为每个元素创建了一个模态,我一按下按钮,它就会打开所有的模态,显示最后一个。

我看了以前有关这方面的问题,如果能提供一些帮助,我将非常感激。

例如,一旦我按下该项目卡的按钮以查看关于该项目的更多信息,它将只显示要映射的数组的最后一个元素的信息。

const [modalIsOpen, setModalIsOpen] = useState(false)
 return (
   <>
  <Grid container
    direction="row"
    className="Project--Items" 
    xs={9} >
    {projects.map((project) => (
      <div key={project.id}className="Project--Card">
        <img src={project.image} className="Item--Main--Image"/>
        <div className="Card--Text">
          <p>{project.name}</p>
          <p>{project.description}</p>
        </div>
        <button onClick={() => setModalIsOpen(true)}>Open Modal</button>
        <Modal isOpen={modalIsOpen} onRequestClose={()=> setModalIsOpen(false)}>
          <h2>{project.name}</h2>
          <p>{project.description}</p>
          <div>
            <button onClick={() => setModalIsOpen(false)}>Close Modal</button>
          </div>
        </Modal>

      </div>
      
    ))}
  </Grid>

  </>
);
}

共有2个答案

阎功
2023-03-14

这里的结构有点不稳定。您应该有一个隐藏的Modale在您的所有内容之上,并简单地传递一些信息给它。它将避免在DOM上呈现无数的情态。

比如:

null

function Modale ({isOpen, onClose, project}){
return isOpen && (
      <>
          <h2>{project.name}</h2>
          <p>{project.description}</p>
          <div>
            <button onClick={onClose}>Close Modal</button>
          </div>
        </>
}

function List (){
const [modalIsOpen, setModalIsOpen] = useState(false)
const [focusProject, setFocusProject] = useState(null)

const onOpenModale = (project) => {
  setModalIsOpen(true)
  setFocusProject(project)
}

const onCloseModale = () => {
  setModalIsOpen(false)
  setFocusProject(null)
}

 return (
   <>
   <Modale isOpen={modalIsOpen} onClose={onCloseModale} project={focusProject}/>
     <Grid container direction="row" className="Project--Items" xs={9} >
        {projects.map((project) => (
          <div key={project.id} className="Project--Card">
            <img src={project.image} className="Item--Main--Image"/>
            <div className="Card--Text">
            <p>{project.name}</p>
            <p>{project.description}</p>
            </div>
          <button onClick={()=> onOpenModale(project)}>Open Modal</button>
         </div>
       ))}
     </Grid>
  </>
);
}
盖雪峰
2023-03-14
const [modalIsOpen, setModalIsOpen] = useState(false)
const [selectedProject, setSelectedProject] = useState(null);

const expandModal = (project) => {
    setSelectedProject(project);
    setModalIsOpen(true);
}

const closeModal = () => {
    setSelectedProject(null);
    setModalIsOpen(true);
}

 return (
  <Grid container
    direction="row"
    className="Project--Items" 
    xs={9} >
    {projects.map((project) => (
      <div key={project.id}className="Project--Card">
        <img src={project.image} className="Item--Main--Image"/>
        <div className="Card--Text">
          <p>{project.name}</p>
          <p>{project.description}</p>
        </div>
        <button onClick={() => expandModal(project)}>OpenModal</button>
      </div>
    ))}
    <Modal isOpen={modalIsOpen} onRequestClose={closeModal}>
      <h2>{selectedProject && selectedProject.name}</h2>
        <p>{selectedProject && selectedProject.description}</p>
        <div>
          <button onClick={closeModal}>Close Modal</button>
        </div>
    </Modal>
  </Grid>
);
}
 类似资料:
  • 本文向大家介绍JavaScript数组中的第一个元素和最后一个元素?,包括了JavaScript数组中的第一个元素和最后一个元素?的使用技巧和注意事项,需要的朋友参考一下 数组是一组元素。每个元素都有其自己的 索引值。我们可以使用这些索引访问任何元素。但是,对于最后一个元素,直到知道数组中存在的元素数量,我们才知道索引。在这种情况下,我们必须使用逻辑。让我们简要地讨论这些细节。 访问第一个元素 因

  • 嘿,我想计算项目价格的总和,但它只显示最后一个项目的价格:这里是我的代码与react-monge-form: 这是我在reducer.js中的减少函数: 我在安装react currency时出错,我--强迫它。这是错误:npm i react货币格式 npm通知npm通知npm通知新的npm次要版本可用!7.3.0 - NPM ERR!此运行的完整日志可以在npm ERR中找到!C:\用户\程序

  • 返回一个数组中除了最后一个元素以外的所有元素。 使用 arr.slice(0,-1) 返回排除了最后一个元素的数组。 const initial = arr => arr.slice(0, -1); initial([1, 2, 3]); // [1,2]

  • 问题内容: 是否可以将NumPy数组映射到位? 如果是,怎么办? 给定-2D数组-这是目前为我完成窍门的一些代码: 但是它是如此丑陋,以至于我怀疑在NumPy内的某个地方一定有一个函数可以对以下内容执行相同的操作: 但是如果存在上述类似内容,我将无法找到它。 问题答案: 只有在空间有限的情况下,才值得尝试就地执行此操作。如果是这样,可以通过遍历数组的展平视图来稍微加快代码的速度。由于在可能的情况下

  • 使用提供的函数将每个元素映射到一个值后,然后返回数组的最小值。 使用 Array.map() 将每个元素映射到由fn,然后用 Math.min() 返回的值来获取最小值。 const minBy = (arr, fn) => Math.min(...arr.map(typeof fn === 'function' ? fn : val => val[fn])); minBy([{ n: 4 },

  • 使用提供的函数将每个元素映射到一个值后,然后返回数组的最大值。 使用 Array.map() 将每个元素映射到由fn,然后用 Math.max() 返回的值来获取最大值。 const maxBy = (arr, fn) => Math.max(...arr.map(typeof fn === 'function' ? fn : val => val[fn])); maxBy([{ n: 4 },