@commander-lol/react-hooks

A collection of commonly used utility hooks for React

Usage no npm install needed!

<script type="module">
  import commanderLolReactHooks from 'https://cdn.skypack.dev/@commander-lol/react-hooks';
</script>

README

react-hooks

A collection of commonly used utility hooks for React

NPM JavaScript Style Guide

Install

npm install --save react-hooks

Usage

useAbortableEffect

An enhanced version of React.useEffect that can run an asynchronous effect with an AbortController for cancellation. The controller can be aborted manually, and will be aborted when the dependencies of the effect change or the component unmounts.

import React from 'react'
import { useDisclosure } from '@commander-lol/react-hooks'

export default function AsyncWatcher() {
  const [value, setValue] = React.useState(null)
  const [data, setData] = React.useState(null)

  useAbortableEffect(async ctrl => {
    if (value != null) {
      const result = await fetch(`/my/api/${ value }`, {
        signal: ctrl.signal,
      }) 
      // Alternatively, check if the controller has aborted for non-fetch effects
      if (result.ok) {
        setData(await result.json())
      }
    }
  }, [value])

  return (
    <div>
      <ValueSelector value={value} onChange={setValue} />
      <DataDisplayer value={data} />
    </div>
  )
}

useDisclosure

Encapsulated common 'toggle view' logic used by dialogs, sidebars, etc.

import React from 'react'
import { useDisclosure } from '@commander-lol/react-hooks'

import { Modal } from 'another-library'

export default function SimpleModal({ summary, description }) {
  const state = useDisclosure()
  return (
    <>
      <button onClick={state.onOpen}>{ summary }</button>
      <Modal isOpen={state.isOpen} onClose={state.onClose}>
        <p>{ description }</p>
      </Modal>
    </>
  )
}

License

GPL-3.0+ © Commander-lol