I want to update user data. I successfully get existing user data, but not updated. The above error is displayed. When I remove an equal sign from the line below, the error is removed but the user data is still not updated.
const existingUser = users.userList.filter(f => f.id == id);
import React, { useState } from 'react' import { useSelector, useDispatch } from 'react-redux'; import { useNavigate, useParams } from 'react-router-dom'; import { updateUser } from '../redux/slice/userReducer'; const Update = () => { const { id } = useParams(); //console.log(id) const users = useSelector((state) => state.users); const existingUser = users.userList.filter(f => f.id === id); //console.log(existingUser); const { name, email } = existingUser[0]; const [uname, setName] = useState(name); const [uemail, setEmail] = useState(email); const dispatch = useDispatch(); const navigate = useNavigate(); const handleUpdate = (event) => { event.preventDefault(); dispatch(updateUser({ id: id, name: name, email: email })); navigate('/'); } return ( <div className='d-flex w-100 vh-100 justify-content-center align-items-center'> <div className='w-50 border bg-secondary text-white p-5'> <h3>Update User</h3> <form onSubmit={handleUpdate}> <div> <label htmlFor='name'>Name:</label> <input type='text' name='name' className='form-control' placeholder='enter name' value={uname} onChange={e => setName(e.target.value)} /> </div> <div> <label htmlFor='name'>Email:</label> <input type='email' name='email' className='form-control' placeholder='enter email' value={uemail} onChange={e => setEmail(e.target.value)} /> </div> <br /> <button className='btn btn-info'>Update</button> </form> </div> </div> ) } export default Update
I'm not sure what your data structure is, but from the code provided I can explain and guess what the problem is.
The error you are receiving means that the 0th element of your
existingUser
does not exist. SinceexistingUser
comes from a filter and the filter returns an array, we can assume that the condition within the filter is not satisfied for any element.When you say changing
===
to==
will make it work, we can guess that f.id and id are not the same type. Maybe one is a string and the other an integer.Using == actually solves your original problem. But if you want to use === you can try changing the type of the value. For example, if id is a string and f.id is an integer, you can write the condition like this:
You can find out the difference by doing a Google search.
Your next problem is that after fixing the above error, the data is not updated. This is because of the design pattern you are using in your component. useState only takes an initial value and does not change throughout the component's lifetime unless you update it using
setState
.Since you are using useSelector and dispatch, I assume you are using
redux
. In this case, I don't thinkuseState
is needed. You just use thename
andemail
deconstructed fromexistingUser[0]
and they will be rendered whenever yousend an update
Code>.