zoukankan      html  css  js  c++  java
  • [React] useAsync

    const defaultInitialState = {status: 'idle', data: null, error: null}
    export function useAsync(initialState) {
      const initialStateRef = React.useRef({
        ...defaultInitialState,
        ...initialState,
      })
      const [{status, data, error}, setState] = React.useReducer(
        (s, a) => ({...s, ...a}),
        initialStateRef.current,
      )
    
      const safeSetState = useSafeDispatch(setState)
    
      const run = React.useCallback(
        promise => {
          if (!promise || !promise.then) {
            throw new Error(
              `The argument passed to useAsync().run must be a promise. Maybe a function that's passed isn't returning anything?`,
            )
          }
          safeSetState({status: 'pending'})
          return promise.then(
            data => {
              safeSetState({data, status: 'resolved'})
              return data
            },
            error => {
              safeSetState({status: 'rejected', error})
              return error
            },
          )
        },
        [safeSetState],
      )
    
      const setData = React.useCallback(data => safeSetState({data}), [
        safeSetState,
      ])
      const setError = React.useCallback(error => safeSetState({error}), [
        safeSetState,
      ])
      const reset = React.useCallback(() => safeSetState(initialStateRef.current), [
        safeSetState,
      ])
    
      return {
        // using the same names that react-query uses for convenience
        isIdle: status === 'idle',
        isLoading: status === 'pending',
        isError: status === 'rejected',
        isSuccess: status === 'resolved',
    
        setData,
        setError,
        error,
        status,
        data,
        run,
        reset,
      }
    }

    Using:

      const {data: items, run} = useAsync({data: [], status: 'pending'})
      React.useEffect(() => {
        run(getItems(inputValue))
      }, [inputValue, run])
  • 相关阅读:
    C++指针
    C++ 结构体和枚举
    提供openssl -aes-256-cbc兼容加密/解密的简单python函数
    最新安全学习视频
    C++复合类型(结构体)
    C艹复合类型(字符串)
    C++复合类型(数组)
    python 搜索引擎Whoosh中文文档和代码 以及jieba的使用
    JSP基础之 C标签中的 varStatues属性
    JSP进阶 之 SimpleTagSupport 开发自定义标签
  • 原文地址:https://www.cnblogs.com/Answer1215/p/13861838.html
Copyright © 2011-2022 走看看