create-effect

A small utility to create custom hooks using useEffect

Usage no npm install needed!

<script type="module">
  import createEffect from 'https://cdn.skypack.dev/create-effect';
</script>

README

create-effect

A small utility to create custom hooks with effects without worrying about the current scope.

Install

Through npm npm install create-effect --save

API

const useCustomEffectHook = createEffect(effectDefinition, addDependencies);
  • effectDefinition: A function which matches the definition of the API for which you are creating effect hook for. It should return a function which will be used to cleanup the effect. See example for the useInterval hook

  • addDependencies (Default to true): By default it will figure out dependencies by the arguments you pass on the effectDefinition. If there are no dependencies on the argument, it will use an empty array as dependency causing effect to run only on the first render(mount). With addDependencies as false you can tell the createEffect that this effect has to run after each render.

Creating Effect Hooks

Interval hook (useInterval)

import createEffect from 'create-effect';

const useInterval = createEffect((handler, delay) => {
  const interval = setInterval(handler, delay);

  return () => {
    clearInterval(interval);
  }
});

useInterval example

export default function TestUseInterval() {
  const [delay, setDelay] = useState(1000);

  const [currentTime, updateTime] = useState(new Date().toLocaleTimeString());

  useInterval(() => {
    updateTime(new Date().toLocaleTimeString());
  }, delay);

  return (
    <div>
      {currentTime}{" "}
      <button onClick={() => setDelay(delay + 1000)}>Update Delay</button>
    </div>
  );
}

Timeout hook (useTimeout)

import createEffect from 'create-effect';

const useTimeout = createEffect((handler, delay) => {
  const timeout = setTimeout(handler, delay);

  return () => {
    clearTimeout(timeout);
  }
});

Window event's hook (useWindowEvent)

const useWindowEvent = createEffect((event, handler, captureMode) => {
  window.addEventListener(event, handler, captureMode);

  return () => {
    window.removeEventListener(event, handler, captureMode);
  };
});

useWindowEvent example

function App() {
  const [open, setOpen] = useState(false);

  useWindowEvent("click", handle() => {
    setOpen(!open);
  });

  return (
    <div className="App">
      <h1>Hello World!</h1>
      <h2>{String(open)}</h2>
    </div>
  );
}

Why not just useEffect?

Check this out, https://overreacted.io/making-setinterval-declarative-with-react-hooks/

Like it?

:star: this repo