My question is why we use [action.fieldName]: action.payload
?
Why we couldn't use action.fieldName: action.payload
?
import './App.css';
import React,{useReducer} from 'react';
const initialState = {
username: "",
password: "",
isLoggedIn: false,
error: false,
};
function reducer(state, action){
switch(action.type){
case "FIELD_CHANGE":
return {
...state,
[action.fieldName]: action.payload,
}
default:
return state;
}
}
function App() {
const [state, dispatch] = useReducer(reducer, initialState);
const { username, password, isLoggedIn, error } = state;
console.log(state);
return (
<div className="App">
<label htmlFor="username">Username: </label>
<input type="text" name="username" onChange={(e)=> dispatch({type:"FIELD_CHANGE",fieldName:"username",payload:e.target.value})}/>
<label htmlFor="password">Password: </label>
<input type="text" name="password" onChange={(e)=> dispatch({type:"FIELD_CHANGE",fieldName:"password",payload:e.target.value})}/>
<div>
{username}
</div>
</div>
);
}
export default App;
I understand that there will be more than one fieldName but once we specify them individually using ...state
it should automatically add since it will be different input name (username
& password
).