为何React useEffect中fetch的then直接传入setUser而非调用它?
为什么在then中直接传入setUser而非调用它?
首先先纠正你代码里的一个小错误:第一行的useEffect应该是useState,正确的初始化写法是:
const [user, setUser] = useState({});
接下来解释核心问题:
then方法需要接收一个函数作为参数fetch返回的Promise对象的then方法,会在请求成功完成后,自动调用你传入的回调函数,并把Promise resolve的结果(也就是resp.json()返回的用户数据)作为参数传给这个回调。直接传
setUser是传递函数引用setUser本身就是一个接收新状态值的函数,它的参数正好就是我们从接口拿到的用户数据。直接把setUser传给then,相当于告诉Promise:等你拿到数据后,就用这个数据去调用setUser。这完全等价于写:.then(value => setUser(value))是一种简洁的写法。
如果写成
setUser(value)会立即执行
要是你写.then(setUser(value)),JavaScript会先执行setUser(value)这个表达式——但此时value根本不存在(还没从接口拿到数据),而且setUser会被立刻调用,而不是等请求完成后调用。更关键的是,setUser的返回值是undefined,这就导致then接收的是undefined而非一个函数,会引发错误或者完全不执行状态更新逻辑。
简单来说,then需要的是一个“待执行的函数”,而不是“函数执行后的结果”,直接传setUser就是给它一个符合要求的函数引用,而调用setUser(value)则是提前执行了函数,传递了无效的结果。
内容的提问来源于stack exchange,提问作者falah mahmood
相关产品推荐
相关产品推荐

