21
loading...
This website collects cookies to deliver better user experience
useReducer()
hook. Examples are using react-bootstrap
but you don't need to be using it in your own project for this to work.const initState = {
firstName: "",
lastName: "",
street: "",
aptSuite: "",
city: "",
stateName: "",
zipcode: "",
date: "",
title: "",
status: "fillingOutForm",
};
<Form.Label htmlFor="user-first-name">First name</Form.Label>
<Form.Control
type="text"
name="FIRSTNAME" // Used for the action type
id="user-first-name"
value={formState.firstName} // formState from useReducer
required
onChange={(e) => {
const name = e.target.name;
const value = e.target.value;
dispatch({type: "CHANGE_" + name, payload: value });
}}
/>
switch (type) {
case CHANGE_FIRSTNAME:
// Return modified state.
case CHANGE_LASTNAME:
// Return modified state.
case CHANGE_STREET:
// Return modified state.
default:
return state;
}
onChange
handler...// For example, the DOM input attribute name is 'firstName'
onChange={(e) => {
const field = e.target.name;
const value = e.target.value;
dispatch({
type: "CHANGE_INPUT",
payload: {
value,
field,
},
});
}}
function formReducer(state, action) {
const { type, payload } = action;
switch (type) {
case "CHANGE_INPUT":
return { ...state, [payload.field]: payload.value };
default:
return state;
}
}
const initState = {
firstName: "Whatever was type in by user",
// Rest of state properties...
}
return { ...state, [payload.field]: payload.value };
onChange()
handler to its own function. It might even be more descriptive to change the name to something like updateStateWithInputValue
.const changeDOMInput = (e) => {
const field = e.target.name;
const value = e.target.value;
dispatch({
type: "CHANGE_INPUT",
payload: {
value,
field,
},
});
};
onChange={(e) => {
changeDOMInput(e);
}}