为什么我的所有列表项的状态都发生了变化,而不仅仅是一项? React.js、状态、HandleChange、模态

如何解决为什么我的所有列表项的状态都发生了变化,而不仅仅是一项? React.js、状态、HandleChange、模态

当使用我的模态更新用户信息时,当他们点击一个时间段时,信息会更新,但它会用相同的信息更新所有的时间段。我只想在模态表单完成后更改所选时间段的状态。为什么模态形式正在改变所有时隙的状态?

import React,{useState} from 'react'
import './App.css';



import Modal from 'react-modal';

Modal.setAppElement('#root')

function App() {

  //state for modal and user info
  const [modalisOpen,setModalisOpen] = useState(false);
  const [name,setName] = useState("");
  const [phoneNumber,setPhoneNumber ] = useState("")

  // handle submit form for the modal
  const handleSubmit = (e) => {
    e.preventDefault();
    setName(name)
    console.log(name)
    setPhoneNumber(phoneNumber)
    console.log(phoneNumber)
    
}


  
  
  return (
   

<div className="App">
       

      <h2>Hello world</h2>
    
      <Modal isOpen={modalisOpen} onRequestClose={() => setModalisOpen(false)}>
        <form onSubmit={handleSubmit}>
          <input type="text" required="required" name="name" placeholder="enter full name" value={name} onChange={(e)=> setName(e.target.value)}  />
          <input type="number" name="phoneNumber" required="required" maxLength="10" value={phoneNumber} placeholder="enter phone number" onChange={(e)=> setPhoneNumber(e.target.value)} />
          <button type="submit">Confirm</button>
          {/* <button onClick={()=> setModalisOpen(false)}>close</button> */}
        </form>

      </Modal>
      

      {/* slot 1 */}
      <div className="time-slot-list">
        <ul>
          {name ? <li  className="time-slot redBg" onClick={()=> setModalisOpen(true)}>
            9:00am
           
            <p>{name}</p>  
          </li> :  <li className="time-slot" onClick={()=> setModalisOpen(true)}>
            9:00am
           
            </li>
        }
        {/* slot 2 */}
           {name ? <li className="time-slot redBg" onClick={()=> setModalisOpen(true)}>
            10:00am
            
            <p>{name}</p>  
          </li> :  <li className="time-slot" onClick={()=> setModalisOpen(true)}>
            10:00am
            
            </li>
          }
         </ul>
      </div>

    </div>
  );
}






export default App;

解决方法

我建议为槽创建一个 name/phoneNumber 值数组,并使用索引来确定您要为其打开模态。

const [modalIndex,setModalIndex] = useState(null);
const [slots,setSlots] = useState([
  {
    id: 0,name: "",phoneNumber: ""
  },{
    id: 1,phoneNumber: ""
  }
]);

由于您将 valueonChange 属性附加到每个输入,我假设您想要完全控制输入,因此创建一个更改处理程序回调并使用当前选定的索引来匹配正在更新的插槽.

const handleChange = (e) => {
  const { name,value } = e.target;
  setSlots((slots) =>
    slots.map((slot,i) =>
      i === modalIndex
        ? {
            ...slot,[name]: value
          }
        : slot
    )
  );
};

更新模态以使用插槽状态。

<Modal
  isOpen={modalIndex !== null}
  onRequestClose={() => setModalIndex(null)}
>
  <form onSubmit={handleSubmit}>
    <input
      type="text"
      required="required"
      name="name"
      placeholder="enter full name"
      value={slots[modalIndex]?.name}
      onChange={handleChange}
    />
    <input
      type="number"
      name="phoneNumber"
      required="required"
      maxLength="10"
      value={slots[modalIndex]?.phoneNumber}
      placeholder="enter phone number"
      onChange={handleChange}
    />
    <button type="submit">Confirm</button>
  </form>
</Modal>

要打开模态并更新特定插槽,请使用 setModalIndex 状态更新器函数设置特定插槽索引。

<ul>
  {["9:00am","10:00am"].map((time,index) => (
    <li
      key={index}
      className={`time-slot ${slots[index].name ? "redBg" : ""}`}
      onClick={() => setModalIndex(index)}
    >
      {time}
      <p>{slots[index].name}</p>
    </li>
  ))}
</ul>

Edit why-is-the-state-changing-on-all-of-my-list-items-and-not-just-one-react-js-st

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?