can't able to get data before rendering the page using useSelector after dispatch, my screen appears totally blank. I have used react and redux
code:
const UsersProfile = () => {
const { id } = useParams();
const dispatch = useDispatch();
const { loading, data } = useSelector((state) => state.searchedUser);
console.log(data);
useEffect(() => {
dispatch(searchedUser(id));
}, [dispatch, id]);
return (
<>
{loading ? (
<Loading />
) : (
<div
className="flex flex-col h-screen w-full bg-gray-100 overflow-x-hidden overflow-y-auto bg-cover bg-center"
style={{
backgroundImage: `url(/img/bg3.jpg)`,
}}
>
<Navbar />
<div
className=" px-8 w-full flex items-center justify-center backdrop-blur-lg h-full
"
>
<div className="bg-white w-4/5 h-4/5 m-0 py-8 flex flex-col items-center rounded-2xl md:p-8 md:m-8 shadow-md">
<h1 className="text-3xl mt-2 font-bold">{data.name}'s Profile</h1>
<div className=" w-full mt-4 h-full p-10 flex justify-center items-center">
<div className="flex flex-col w-full ">
<div className=" flex flex-col w-full justify-center ">
<h1 className="font-bold text-xl">Name</h1>
<p>{}</p>
</div>
<div className="mt-7 flex flex-col w-full justify-center ">
<h1 className="font-bold text-xl">Username</h1>
<p>{}</p>
</div>
<div className="mt-7 flex flex-col w-full justify-center ">
<h1 className="font-bold text-xl">Email</h1>
<p> {}</p>
</div>
</div>
<div className="flex flex-col w-full items-center h-full">
<div className="w-3/4 h-3/4 flex items-center justify-center">
<img
className="w-3/4 h-52 rounded-full border-4 border-black"
src="https://images3.alphacoders.com/823/thumb-1920-82317.jpg"
alt="#"
/>
</div>
</div>
</div>
</div>
</div>
</div>
)}
</>
);
};
export default UsersProfile;
error:
UsersProfile.js:35 Uncaught TypeError: Cannot read properties of undefined (reading 'name')
at UsersProfile (UsersProfile.js:35:1)
at renderWithHooks (react-dom.development.js:16305:1)
at mountIndeterminateComponent (react-dom.development.js:20074:1)
at beginWork (react-dom.development.js:21587:1)
at HTMLUnknownElement.callCallback (react-dom.development.js:4164:1)
at Object.invokeGuardedCallbackDev (react-dom.development.js:4213:1)
at invokeGuardedCallback (react-dom.development.js:4277:1)
at beginWork$1 (react-dom.development.js:27451:1)
at performUnitOfWork (react-dom.development.js:26557:1)
at workLoopSync (react-dom.development.js:26466:1)
what could be the solution to this problem, I can't identify it. I have just used dispatch under useEffect and then tried to get data using useSelector and using that data on the page. I think there could be some solution before rendering the page
CodePudding user response:
Your loading
and data
might be out of sync during a render. Update your ternary condition to
{loading || !data} ? (