- Objective:
- Breadcrumb:
# 概念阐释
## 语义
这是更新表单常用的一套代码,在表单的`<input>`标签中使用`value`指向初始状态,使用`onChange(handleChange)`指向更新的状态。
## 语法
```jsx
setState(newStateValue)// setState中添加的是目标事件更新的值
```
3 种写法
```jsx
const handleChange = (event) => {
const newEmail = event.target.value;
setEmail(newEmail);
}
const handleChange = (event) => setEmail(event.target.value);
const handleChange = ({target}) => setEmail(target.value);//较常用的写法
```
# 实例
## 例1
```jsx
import React, { useState } from 'react';
export default function EmailTextInput() {
const [email, setEmail] = useState(''); //初始状态设置为空字符串
const handleChange = (event) => {
setEmail(event.target.value);
} //处理变化,更新的值为填写的新值
return (
<input value={email} onChange={handleChange} type="text"/>
<h2>Current User Input: </h2>
<h4>{email}</h4> //会实时显示输入的内容
);
}
```
## 例2
```jsx
import React from 'react';
import React,{useState} from 'react';
// regex to match numbers between 1 and 10 digits long
const validPhoneNumber = /^\d{1,10}$/;
export default function PhoneNumber() {
// declare current state and state setter
const[phone,setPhone] = useState('');
const handleChange = (event)=> {
const newPhone = event.target.value;
const isValid = validPhoneNumber.test(newPhone);
if (isValid) {
// 这一例子中,在更新状态前多了一步测试
setPhone(newPhone);
}
};
return (
<div className='phone'>
<label for='phone-input'>Phone: </label>
<input id='phone-input' value={phone} onChange={handleChange}/>
</div>
);
}
```
## 事件处理更新对象
`event.target.value` 只能传递字符串,因此在传递对象时,需要先将对象处理成字符串。[[React 练习题 切换视频内容]]
## 其他
`value={notes[item.id] || ''}` 的意思是:“将输入框的值设置为 `notes` 对象中以 `item.id` 为键的值。如果该值不存在或是假值,则将输入框的值设置为空字符串。”
# 相关内容
- 当代码的逻辑更加复杂时,最好将逻辑与 JSX 分开写,这样更易于阅读、测试和修改。[[React 组件 拆分(轮播图)]]
- 在React中,`<input>`是受控原素。在 React 文档中提供了[[React 受控和非受控组件]]的更多信息。
# 参考资料
- [Use State Setter Outside of JSX](https://www.codecademy.com/journeys/full-stack-engineer/paths/fscj-22-front-end-development/tracks/fscj-22-react-part-ii/modules/wdcp-22-function-components-and-hooks-a2dba9bf-fc64-4118-8656-dfdc35f9e5cc/lessons/the-state-hook/exercises/use-state-setter-outside-of-jsx)