直接上代码吧,类似于之前class组件this.setState的第二个callback参数
import React, { useState, useEffect } from 'react';
import fetchData from 'services';
function useList() {
const [params, setParams] = useState({});
const [data, setData] = useState({});
const getData = () => {
fetchData(params).then(res => {
setData(res);
});
};
useEffect(() => {
getData();
}, []);
return {
params,
setParams,
data,
setData,
getData,
};
}
function Foo() {
const { setParams, getData } = useList();
const handleClick = () => {
setParams({ mockData: 2333333 });
// 如何让getData里params是最新的???
getData();
};
return (
<button onClick={handleClick}>click me</button>
);
}
简单啊。
改为:
或者:
其实这里使用
hook
的姿势不对啊,如果getData
依赖于params
,同时期望每次params
改变时,都调用getData
,那么getData
应当使用React.useEffect
封装并声明params
为deps
。如果
getData
依赖于params
,但是期望每次params
改变时,getData
的调用时机取决于调用者,那么这种情况下,setParams
的调用不应当暴露给调用者。为什么呢?因为依赖params
状态的是getData
,它必然会获取到有效的、最新的params
,所以这种情况下,应当将params
作为参数传递给getData
,并让其负责params
状态的持久化工作。如果
getData
依赖于params
,但又期望通过外部来设置params
,然后getData
获取最新值,那需要借助React.useRef
来保证params
不被闭包锁定。最后更新一波,可以看 dan 的这个文章,making-setinterval-declarative-with-react-hooks,关于 react 新的编程模型,基本说的很清楚了。