on react docs forms section there is the following example using class components:
JavaScript
x
46
46
1
class Reservation extends React.Component {
2
constructor(props) {
3
super(props);
4
this.state = {
5
isGoing: true,
6
numberOfGuests: 2
7
};
8
9
this.handleInputChange = this.handleInputChange.bind(this);
10
}
11
12
handleInputChange(event) {
13
const target = event.target;
14
const value = target.type === 'checkbox' ? target.checked : target.value;
15
const name = target.name;
16
17
this.setState({
18
[name]: value
19
});
20
}
21
22
render() {
23
return (
24
<form>
25
<label>
26
Is going:
27
<input
28
name="isGoing"
29
type="checkbox"
30
checked={this.state.isGoing}
31
onChange={this.handleInputChange} />
32
</label>
33
<br />
34
<label>
35
Number of guests:
36
<input
37
name="numberOfGuests"
38
type="number"
39
value={this.state.numberOfGuests}
40
onChange={this.handleInputChange} />
41
</label>
42
</form>
43
);
44
}
45
}
46
Considering Hooks can only be called either in a React function component or a custom React Hook function is there a way of doing it using hooks instead?
Advertisement
Answer
example
JavaScript
1
12
12
1
const MyComponent = () => {
2
const [inputs,setInputs] = useState({});
3
4
return (
5
<>
6
<input key="field1" name="field1" onChange={({target}) => setInputs(state => ({state,field1:target.value}))} value={inputs.field1}/>
7
<input key="field2" name="field2" onChange={({target}) => setInputs(state => ({state,field2:target.value}))} value={inputs.field2}/>
8
</>
9
)
10
11
}
12
you can pass in initial values like this:
JavaScript
1
5
1
const MyComponent = (initialValues = {}) => {
2
const [inputs,setInputs] = useState(initialValues);
3
4
}
5
EDIT: A nice short onChange
according to @hamidreza‘s comment
JavaScript
1
16
16
1
const MyComponent = (initialValues = {}) => {
2
const [inputs,setInputs] = useState(initialValues);
3
const onChangeHandler = useCallback(
4
({target:{name,value}}) => setInputs(state => ({ state, [name]:value }), [])
5
);
6
7
return (
8
<>
9
<input key="field1" name="field1" onChange={onChangeHandler} value={inputs.field1}/>
10
<input key="field2" name="field2" onChange={onChangeHandler} value={inputs.field2}/>
11
</>
12
)
13
14
15
}
16
etc, etc, etc