下面的 React 示例,userProfile状态是一个对象:
第一次渲染:状态是{}
第二次渲染:状态是res.data
-> 无限重新渲染
如果userProfile更改为一个字符串,如useState('')与setUserProfile(res.data.bio)
1渲染:状态是''
第二渲染:状态是res.data.bio
第三渲染:状态res.data.bio
- >停止第三后重新呈现
两个问题:
- 为什么 React 会根据
userProfile状态是对象还是字符串而不同地重新渲染? - 什么时候
userProfile是一个字符串,为什么 React 在第三次渲染后停止重新渲染而不是在第二次渲染之后?
应用程序.js
import UserProfile from './UserProfile';
const App = () => {
const login = 'facebook';
return (
<Router>
<Link to={`/user/${login}`}>Fetch Facebook bio from GitHub</Link>
<Route path='/user/:login' component={UserProfile} />
</Router>
);
};
用户配置文件.js
const UserProfile = ({ match }) => {
const [userProfile, setUserProfile] = useState({});
const getUser = async username => {
const url = `https://api.github.com/users/${username}`;
const res = await axios.get(url);
setUserProfile(res.data);
};
getUser(match.params.login);
// intentionally not using useEffect(() => { getUser(match.params.login); }, []);
return (<p>{userProfile.bio}</p>);
};