use-transition

use transition hook for React

Usage no npm install needed!

<script type="module">
  import useTransition from 'https://cdn.skypack.dev/use-transition';
</script>

README

use-transition

use transition hook for React

A tiny react custom hook for controlling transition state like react-transition-group.

Installation

yarn add use-transition

Basic Example

import useTransition from 'use-transition';

function App() {
  const [isActive, setIsActive] = React.useState(false);
  const state = useTransition(isActive, 1000);

  return (
    <>
      <button onClick={() => setIsActive(active => !active)}>
        toggle: {String(isActive)}
      </button>
      <h1>{state}</h1>
    </>
  );
}

Edit use-transition basic example

API

useTransition(isActive: boolean, timeout: number, options?: Options): States

The main hook to return the current state of the transition. Takes an isActive indicating the transition state and timeout being the delay in ms. The return value is of type States, which is an enum similar to react-transition-group:

enum States {
  unmounted = 'unmounted',
  entering = 'entering',
  entered = 'entered',
  exiting = 'exiting',
  exited = 'exited',
}

The options takes an object, and has type Options:

type Options = {
  unmountOnExited?: boolean;
};

unmountOnExited: boolean

Whether or not to transition to unmounted immediately after exited. Useful for controlling element which is only appearing when is active. When used together with useTriggerReflow, it can easily apply transition effect to elements appearing only when they were active, more on that later.

STATES: States

The object form of the enum States. Useful for conditionally trigger different transition effect in a more reliable way.

import { STATES } from 'use-transition';

{
  transition: 'opacity 1s ease-out',
  opacity: Number(state === STATES.entering || state === STATES.entered),
}

useTriggerReflow(isActive: boolean, state: STATES, targetRef: RefObject<HTMLElement>)

An useful hook to automatically trigger reflow on targetRef.current when the state is STATES.exited and isActive being false. When you are only mounting the component when it is active, it is a useful hook combined with useTransition to force browser to paint the intermediate style when still in exited state. A common example would be to mount and fade in a component on active.

import useTransition, { STATES, useTriggerReflow } from 'use-transition';

const [isActive, setIsActive] = React.useState(false);
const targetRef = React.useRef();

const state = useTransition(isActive, 1000, { unmountOnExited: true });

useTriggerReflow(isActive, state, targetRef);

return (
  <>
    <button onClick={() => setIsActive(prev => !prev)}>Toggle</button>

    {state !== STATES.unmounted && (
      <div
        ref={targetRef}
        style={{
          transition: 'opacity 1s ease-in-out',
          opacity: Number(
            state === STATES.entering || state === STATES.entered
          ),
        }}
      />
    )}
  </>
);

Author, License

Kai Hao, MIT