熟悉react的朋友都知道,我们使用class组件更新状态时,setState会支持两个参数,一个是更新后的state或者回调式更新的state,另一个参数是更新后的回调函数,如下面的用法:
this.setState({num: 1}, () => {
console.log('updated')
})
import { useEffect, useRef, useState } from 'react';
const useXState = (initState) => {
const [state, setState] = useState(initState);
let isUpdate = useRef();
const setXState = (state, cb) => {
setState(prev => {
isUpdate.current = cb;
return typeof state === 'function' ? state(prev) : state;
})
}
useEffect(() => {
if(isUpdate.current) {
isUpdate.current();
}
})
return [state, setXState];
}
export default useXState
笔者利用useRef的特性来作为标识区分是挂载还是更新,当执行setXstate时,会传入和setState一模一样的参数,并且将回调赋值给useRef的current属性,这样在更新完成时,我们手动调用current即可实现更新后的回调这一功能,是不是很巧妙呢?
作者:徐小夕
链接:https://www.imooc.com/article/301277
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作