亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用輸入值更新狀態

如何使用輸入值更新狀態

鳳凰求蠱 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條經驗 獲得超8個贊

我在這里粘貼了正確的代碼,使用擴展運算符在調用 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條經驗 獲得超13個贊

執行此操作時忘記傳播 -data:


 setData({

      [name]: value,

    });

應該是這樣的:


 setData({

      ...data

      [name]: value,

    });


查看完整回答
反對 回復 2022-10-13
  • 3 回答
  • 0 關注
  • 113 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號