npm.io
1.1.0 • Published 3 months ago

react-use-async-loading

Licence
MIT
Version
1.1.0
Deps
0
Size
17 kB
Vulns
0
Weekly
0

react-use-async-loading

A React hook for managing async loading state

NPM JavaScript Style Guide

Install

npm install --save react-use-async-loading

Usage

import { useLoading } from 'react-use-async-loading'
Show a spinner while fetching data
const Page = () => {
  const { loading, run } = useLoading()

  useEffect(() => {
    run(() => fetch('/data.json').then(res => res.json()).then(setData))
  }, [])

  if (loading) return <Spinner />

  return <div>Data was loaded</div>
}
Disable a button while submitting
const Form = () => {
  const { loading, run } = useLoading()

  const onSubmit = (values) => {
    run(() => axios.post('/register', values))
  }

  return <Form disabled={loading} onSubmit={onSubmit} />
}
Handle error state
const Page = () => {
  const { status, error, run } = useLoading()

  useEffect(() => {
    run(() => fetch('/data.json'))
  }, [])

  if (status === 'loading') return <Spinner />
  if (status === 'error') return <Error message={error.message} />
  if (status === 'success') return <div>Done</div>

  return null
}
Cancel previous request automatically

run() accepts a factory function that receives an AbortSignal. If run() is called again before the previous call resolves, the previous request is aborted automatically.

const Search = () => {
  const { loading, run } = useLoading()

  const onSearch = (query) => {
    run((signal) => fetch(`/search?q=${query}`, { signal }))
  }

  return <SearchInput loading={loading} onChange={onSearch} />
}
Reset state
const { status, run, reset } = useLoading()

// Aborts any in-flight request and resets status back to 'idle'
reset()

API

const { status, loading, idle, error, run, reset } = useLoading(defaultLoading?)
Name Type Description
status 'idle' | 'loading' | 'success' | 'error' Unified async state
loading boolean true while run() is pending
idle boolean true before run() has ever been called
error unknown Error from the last failed run(), otherwise null
run(fn) (fn: (signal) => Promise) => Promise Starts async operation. Aborts previous if still pending. Also accepts a plain promise.
reset() () => void Aborts in-flight request, resets all state to initial

License

MIT Max Ivaneychyk

Keywords