[英]TypeError: Cannot read property 'name"' of undefined in react when passing object in useState
My issue is from route getting the response in json format.我的问题来自以 json 格式获得响应的路线。 And when consoling it gives the data as well but when i passing in setProfileData(data) then updated state gives undefined.
并且在安慰时它也给出了数据,但是当我传入 setProfileData(data) 然后更新的 state 给出未定义的。
But when i gives like setProfileData(data.user.name) then its gives that specific value.但是当我像 setProfileData(data.user.name) 这样给出时,它会给出那个特定的值。
Here my server route这是我的服务器路由
router.get('/user/:id',async(req,res)=>{
try {
const user = await User.findOne({_id:req.params.id}).select('-password')
const post = await Post.find({postedBy:req.params.id}).populate('postedBy', '_id name')
return res.json({user,post})
} catch (error) {
return res.json(error)
}
})
Here is my Component UserProfile这是我的组件用户配置文件
import React,{useContext,useEffect,useState} from 'react';
import {useHistory,useParams} from 'react-router-dom'
import {UserContext} from '../../App'
const UserProfile = ()=>{
const [newProfile,setProfileData] = useState(null)
const {state,dispatch} = useContext(UserContext)
const {userId} = useParams()
console.log(userId)
useEffect(()=>{
fetch(`/user/${userId}`,{
headers:{
'Authorization': 'Bearer '+localStorage.getItem('jwt')
}
}).then((res)=>{
return res.json()
}).then((data)=>{
console.log(data)
setProfileData(data)
})
},[])
return (
<div style={{width:'555px',margin:"0px auto"}}>
<div style={{display:"flex",justifyContent:"space-around",margin:'18px 0px',borderBottom:"1px solid grey"}}>
<div><img style={{width:"160px",height:"160px",borderRadius:"80px"}}
src="https://images.unsplash.com/photo-1550927407-50e2bd128b81?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=500&q=60" alt="Profile Pic"/>
</div>
<div>
<h4>{newProfile.user.name}</h4>
<div style={{display:"flex",justifyContent:"space-around",width:"108%"}}>
<h5>40 Posts</h5>
<h5>40 Followers</h5>
<h5>40 Followings</h5>
</div>
</div>
</div>
<div className="gallery">
{
// userProfile.map((item)=>{
// return (
// <img key={item._id} className="item" src={item.file} alt={item.title}/>
// )
// })
}
</div>
</div>
);
}
export default UserProfile;
{newProfile.user.name} giving type undefined {newProfile.user.name} 给出类型未定义
newProfile
is null when the component start working.当组件开始工作时,
newProfile
为 null。 You must check before accessing it in the render method:您必须在 render 方法中访问它之前进行检查:
{newProfile != null ?
<div>
<h4>{newProfile.user.name}</h4>
<div style={{ display: "flex", justifyContent: "space-around", width: "108%" }}>
<h5>40 Posts</h5>
<h5>40 Followers</h5>
<h5>40 Followings</h5>
</div>
</div>
: 'loading'}
or use the default value in the useState
hook或使用
useState
挂钩中的默认值
Full version:完整版本:
import React, { useContext, useEffect, useState } from 'react';
import { useHistory, useParams } from 'react-router-dom'
import { UserContext } from '../../App'
import { Divider } from 'material-ui';
const UserProfile = () => {
const [newProfile, setProfileData] = useState(null)
const { state, dispatch } = useContext(UserContext)
const { userId } = useParams()
console.log(userId)
useEffect(() => {
fetch(`/user/${userId}`, {
headers: {
'Authorization': 'Bearer ' + localStorage.getItem('jwt')
}
}).then((res) => {
return res.json()
}).then((data) => {
console.log(data)
setProfileData(data)
})
}, [])
return (
<div style={{ width: '555px', margin: "0px auto" }}>
<div style={{ display: "flex", justifyContent: "space-around", margin: '18px 0px', borderBottom: "1px solid grey" }}>
<div><img style={{ width: "160px", height: "160px", borderRadius: "80px" }}
src="https://images.unsplash.com/photo-1550927407-50e2bd128b81?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=500&q=60" alt="Profile Pic" />
</div>
<div>
{newProfile != null ?
<div>
<h4>{newProfile.user.name}</h4>
<div style={{ display: "flex", justifyContent: "space-around", width: "108%" }}>
<h5>40 Posts</h5>
<h5>40 Followers</h5>
<h5>40 Followings</h5>
</div>
</div>
: 'loading'}
</div>
</div>
<div className="gallery">
</div>
</div>
);
}
export default UserProfile;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.