# 🏅Day22 - React 基礎練習 (7) - useState 進階練習
繼續昨天的 useState 練習,今天要練習的是物件資料,這樣的用法很常被用在 input 練習上,先來看個範例。
舉例來說:
```jsx=
const [userData, setUserData] = React.useState({
account: '',
password: '',
})
```
---
那在 input 上就會這樣綁定資料。
```jsx=
<input name="account" value={userData.account} onChange={handleChange} />
```
- name 為設定和 userData 資料內定義相同的物件 key 值。
- value 為動態綁定 userData 的 account 值。
- onChange 事件動態綁定 handleChange 函式。
---
因為表單中會有多個 input,所以我們可以透過函式取得 event 參數來統一更新資料的行為,例如:
```jsx=
const handleChange = (e) => {
const { name, value } = e.target;
setUserData((state) => ({...state, [name]:value}))
}
```
因為使用 `setUserData` 會直接更新 `userData` 資料,所以運用在多個 input 的整合來說,我們需要保持其他資料的內容,只更新我們要更新的對象。
因此透過函式參數的 `state` 先將原始資料取出,再透過物件展開 `...state` 將物件中的原始資料加入,最後的 `[name]:value` 則更新對應的 key 和值。
回到 input 元素來看,就是更新 `userData` 中的 `account`,而 value 是 `e.target.value` 也就是輸入的值。
文件參考:
[<input>](https://react.dev/reference/react-dom/components/input)
補充:
[`<select>`](https://react.dev/reference/react-dom/components/select)
[`<textarea>`](https://react.dev/reference/react-dom/components/textarea)
## 題目
請複製 (右下角 fork)這個[範例](https://codepen.io/yen-kg/pen/eYqjRZY?editors=1011),並撰寫內容,完成帳號密碼的表單製作,並在點選送出按鈕後,可以在 console 看到輸入的值。
<!-- 解答:
```
練習一:
<div>
<label htmlFor="account">帳號</label>
<input id="account" name="account" value={userData.account} onChange={handleChange} />
</div>
<div>
<label htmlFor="password">密碼</label>
<input id="password" name="password" value={userData.password} onChange={handleChange} />
</div>
const [userData, setUserData] = React.useState({
account: '',
password: '',
});
const handleChange = (e) => {
const { name, value } = e.target;
setUserData((state) => ({...state, [name]:value}))
}
練習二:
<div>
<select value={selectedOption} onChange={handleSelectChange}>
<option value="">請選擇</option>
<option value="option1">選項 1</option>
<option value="option2">選項 2</option>
<option value="option3">選項 3</option>
</select>
你選擇了: <strong>{selectedOption}</strong>
</div>
const [selectedOption, setSelectedOption] = React.useState("");
const handleSelectChange = (event) => {
setSelectedOption(event.target.value);
};
```
-->
| yaaaa | codepen |
| ----------- | ---------------------------------------------------------------------------- |
| Miikaa | [codepen](https://codepen.io/Miikaa/pen/xbOOxEe) |
| 老屠 | [codepen](https://codepen.io/fsgfxvlb-the-selector/pen/ZYOpdgM?editors=1011) |
| Jin | [codepen](https://codepen.io/Jin-L/pen/VYjmvEZ) |
| Zem | [codepen](https://codepen.io/dgldwqlg-the-vuer/pen/dPXOYEy) |
| Chia | [Codepen](https://codepen.io/Chia-the-encoder/pen/VYjmvxo) |
| 地瓜 | [codepen](https://codepen.io/ChippyYU/pen/JoKbGKP?editors=1111) |
| cks40660 | [codepen](https://codepen.io/CKS40660/pen/MYebKrL) |
| Nooooora | [CodePen](https://codepen.io/Nora-Ch/pen/EayNPGj?editors=1011) |
| Marco | [CodePen](https://codepen.io/MarcoChiu/pen/yyJVeRr) |
| Eric | [Codepen](https://codepen.io/wc-su/pen/LEZbGMR) |
| Melanie | [Codepen](https://codepen.io/pnrcspte-the-animator/pen/VYjmeBP) |
| RUDY | [Codepen](https://codepen.io/Rudy-crw/pen/raLWLWp?editors=0011) |
| 社子畢卡索 | [Codepen](https://codepen.io/pen?template=JoKbKMe) |
| Tetsu | [Codepen](https://codepen.io/ttgchang/pen/PwzbNLv) |
| Eileen | [Codepen](https://codepen.io/Eileen-io/pen/MYebjyq) |
| 小懿 | [Codepen](https://codepen.io/YT-the-vuer/pen/LEZbxma?editors=0010) |
| 平平 | [Codepen](https://codepen.io/ypinpin/pen/myEOWXm) |
| 7lun | [Codepen](https://codepen.io/mfyvqhsn-the-bold/pen/GgqNWqN) |
| cindy | [Codepen](https://codepen.io/a50134/pen/myEOmVx?editors=0011) |
| 登登登 | [Codepen](https://codepen.io/Duncanin/pen/ogLYWpp?editors=0011) |
| FangFang | [Codepen](https://codepen.io/Fang-the-selector/pen/Wbxoprd?editors=1011) |
| kashiwatei | [Codepen](https://codepen.io/kashiwatei/pen/vEKymWj?editors=1011) |
| Percy | [Codepen](https://codepen.io/Percy-Ku/pen/Eaygrpv?editors=1111) |
| 7Red | [Codepen](https://codepen.io/cch2655/pen/wBWoerG) |
| 星雪糖 | [Codepen](https://codepen.io/vfpofbgm-the-scripter/pen/qENqjpL?editors=0011) |
| andy | [Codepen](https://codepen.io/ewnblckz-the-styleful/pen/azZBwzq?editors=0011) |
| Jenna | [Codepen](https://codepen.io/abiscc14/pen/vEKyZQY) |
| Leonard | [Codepen](https://codepen.io/hyyfjqra-the-sans/pen/ZYOBJBm?editors=0011) |
| wind | [Codepen](https://codepen.io/wind7y/pen/JoKbOaw) |
| KOMATSU PEI | [Codepen](https://codepen.io/Komatsu2021/pen/KwMNdeX?editors=1011) |
| 叮咚 | [Codepen](https://codepen.io/pinchieh-lin/pen/QwEGBZv?editors=1011) |
| Rogan | [Codepen](https://codepen.io/RoganHsu/pen/XJKNxxp?editors=1011) |
| Wafa | [Codepen](https://codepen.io/dqricwgo-the-reactor/pen/MYebxBO?editors=1011) |
| JiaMori | [Codepen](https://codepen.io/jiamori/pen/xbOqLwa) |
| 舜仁 | [Codepen](https://codepen.io/shunjen/pen/VYjWOLJ) |
| ZoeKang | [Codepen](https://codepen.io/byehywmx-the-animator/pen/ByzdKgw) |
| 小趴 | [Codepen](https://codepen.io/papa2415/pen/zxBdKZw) |
| tanuki | [Codepen](https://codepen.io/tanuki320/pen/GgqvMBq?editors=0011) |
| TWLeoC | [Codepan](https://codepen.io/TWLeoC/pen/jErLveW?editors=1011) |
| Wen | [Codepen](https://codepen.io/hsiao-kevin/pen/LEZeWxN) |
| 伊迪 | [Codepen](https://codepen.io/sorryFish/pen/JoKLONL) |