为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用输入值更新状态

如何使用输入值更新状态

凤凰求蛊 2022-10-13 16:24:36
我正在尝试编写一个使用反应状态来存储联系人信息的联系人管理应用程序。我有两种状态,一种是数据,另一种是 userData。数据应该是在用户输入联系人信息时存储联系人的对象,而 userData 将是所有数据对象的数组。但由于某种原因,我只从对象中获取一个属性,它始终是最后输入的字段。我不知道我做错了什么。请帮忙。我的代码:const [data, setData] = useState({    firstName: "",    lastName: "",    phoneNumber: "",    address: "",    imag: "",  });  // declear a new state varaible to store data  const [userData, setUserData] = useState([""]);  function handleChange(e) {    let name = e.target.name;    let value = e.target.value;    setData({      [name]: value,    });  }  function handleSubmit(e) {    e.preventDefault();    setUserData([...userData, data]);  }  /*le.log(userData);  }, [userData]);*/  console.log(userData);  return (    <>      <form id="form" className="needs-validation" onSubmit={handleSubmit}>        <div>          <input            className="imgFile"            type="text"            placeholder="First name"            value={data.firstName}            name="firstName"            onChange={handleChange}          />          <input            className="imgFile"            type="text"            placeholder="Last name"            value={data.lastName}            name="lastName"            onChange={handleChange}          />          <input            className="imgFile"            type="tel"            placeholder="Phone Number"            value={data.phoneNumber}            name="phoneNumber"            onChange={handleChange}          />          <input            className="imgFile"            type="email"            placeholder="Email"            value={data.email}            name="email"            onChange={handleChange}          />          <input            className="imgFile"            type="text"            placeholder="Address"            value={data.address}            name="address"            onChange={handleChange}          />          <input            type="file"            name="img"            accept="image/*"            value={data.img}            onChange={handleChange}          />}
查看完整描述

3 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

我在这里粘贴了正确的代码,使用扩展运算符在调用 setData 时提供先前数据的副本,这样它的值就不会被覆盖。


const [data, setData] = useState({

    firstName: "",

    lastName: "",

    phoneNumber: "",

    address: "",

    imag: "",

  });

  // declear a new state varaible to store data


  const [userData, setUserData] = useState([""]);


  function handleChange(e) {

    let name = e.target.name;

    let value = e.target.value;

    setData({

      ...data,

      [name]: value,

    });

  }


  function handleSubmit(e) {

    e.preventDefault();

    setUserData([...userData, data]);

  }



  console.log(userData);


  return (

    <>

      <form id="form" className="needs-validation" onSubmit={handleSubmit}>

        <div>

          <input

            className="imgFile"

            type="text"

            placeholder="First name"

            value={data.firstName}

            name="firstName"

            onChange={handleChange}

          />

          <input

            className="imgFile"

            type="text"

            placeholder="Last name"

            value={data.lastName}

            name="lastName"

            onChange={handleChange}

          />

          <input

            className="imgFile"

            type="tel"

            placeholder="Phone Number"

            value={data.phoneNumber}

            name="phoneNumber"

            onChange={handleChange}

          />

          <input

            className="imgFile"

            type="email"

            placeholder="Email"

            value={data.email}

            name="email"

            onChange={handleChange}

          />

          <input

            className="imgFile"

            type="text"

            placeholder="Address"

            value={data.address}

            name="address"

            onChange={handleChange}

          />

          <input

            type="file"

            name="img"

            accept="image/*"

            value={data.img}

            onChange={handleChange}

          />

          <button className="contactButton">Save </button>

        </div>

      </form>

    </>

  );

}



查看完整回答
反对 回复 2022-10-13
?
慕的地10843

TA贡献1785条经验 获得超8个赞

所以你的代码很好,问题是当你使用时setData你会失去一切。在功能组件中你需要传播oldData然后改变你喜欢的东西。


你setData应该在里面看起来像这样handleChange:


setData(oldData => ({

    ...oldData,

    [name]: value,

}));

比在您的提交表单中,您根本不需要userData,因为您可以使用包含data您需要的所有信息的对象。


你可以handleSubmit像这样改变你的:


function handleSubmit(e) {

    e.preventDefault();

    console.log('data',data);

    // do whatever with your "data", the object has all the information inside

}


查看完整回答
反对 回复 2022-10-13
?
萧十郎

TA贡献1815条经验 获得超12个赞

执行此操作时忘记传播 -data:


 setData({

      [name]: value,

    });

应该是这样的:


 setData({

      ...data

      [name]: value,

    });


查看完整回答
反对 回复 2022-10-13
  • 3 回答
  • 0 关注
  • 76 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信