监听深度依赖的值变化
import { isEqual } from 'lodash';
function useDeepCompareEffect(fn, deps){
const comparisons = useRef(0);
const prevDeps = useRef(deps);
if(!isEqual(prevDeps.current, deps)){
comparisons.current++;
}
prevDeps.current = deps;
return useEffect(fn, [comparisons.current]);
}
自动取消api请求
export function useFetch = (config, deps) => {
const abortController = new AbortController()
const [loading, setLoading] = useState(false)
const [result, setResult] = useState()
useEffect(() => {
setLoading(true)
fetch({
...config,
signal: abortController.signal
})
.then((res) => setResult(res))
.finally(() => setLoading(false))
}, deps)
useEffect(() => {
return () => abortController.abort()
}, [])
return { result, loading }
}
setState过后立即获取新值
export const useRefState = <T>(
initialValue: T
): [React.MutableRefObject<T>, React.Dispatch<React.SetStateAction<T>>, T] => {
const [state, setState] = useState<T>(initialValue);
const refState = useRef(state);
useEffect(() => {
refState.current = state;
}, [state]);
return [refState, setState, state];
}
定时器
export const useTimeout = useCallback((callback: any, timeout: number = 3000) => {
let callbackRef = useRef<any>();
useEffect(() => {
callbackRef.current = callback;
});
useEffect(() => {
let id = setTimeout(() => callbackRef.current && callbackRef.current(), timeout);
return () => clearTimeout(id);
}, [timeout])
}, [])
当自己尝试写过几个自定义的hook之后,想必都能感受到hook给开发者带来的便利,这种感觉就像写了一个逻辑层面的jsx一样,脏活累活都包装了起来,外部只需要优雅的调用,不用过多关心细节,你卯足了劲撸代码就完事儿?
参考资料:
- www.lodashjs.com/docs/lodash…
- developer.mozilla.org/en-US/docs/…
- developer.mozilla.org/en-US/docs/…
- react.docschina.org/docs/hooks-…
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!