What is use-deep-compare-effect?
The `use-deep-compare-effect` package is a React hook that works similarly to `useEffect`, but it performs a deep comparison of the dependencies to determine if they have changed. This is particularly useful when dealing with complex objects or arrays as dependencies, where shallow comparison would not suffice.
What are use-deep-compare-effect's main functionalities?
Deep Comparison of Dependencies
This feature allows you to use a deep comparison for the dependencies of the effect. In this example, `useDeepCompareEffect` will only re-run the effect if `complexObject` has changed deeply, not just shallowly.
import { useDeepCompareEffect } from 'use-deep-compare-effect';
function MyComponent({ complexObject }) {
useDeepCompareEffect(() => {
// Effect logic here
console.log('complexObject has changed');
}, [complexObject]);
return <div>Check the console for updates</div>;
}
Other packages similar to use-deep-compare-effect
react-use
The `react-use` package is a collection of essential React hooks, including `useDeepCompareEffect`. It offers a wide range of hooks for various use cases, making it a more comprehensive solution compared to `use-deep-compare-effect`, which focuses solely on deep comparison for effects.
use-deep-compare
The `use-deep-compare` package provides a hook for deep comparison of dependencies, similar to `use-deep-compare-effect`. However, it is more focused on providing a utility for deep comparison rather than being a full-fledged effect hook.
use-deep-compare-effect 🐋
It's react's useEffect hook, except using deep comparison on the inputs, not
reference equality



WARNING: Please only use this if you really can't find a way to use
React.useEffect
. There's often a better way to do what you're trying to do
than do a deep comparison.
The problem
React's built-in useEffect
hook has a second argument called the "dependencies
array" and it allows you to optimize when React will call your effect callback.
React will do a comparison between each of the values (via Object.is
) to
determine whether your effect callback should be called.
The problem is that if you need to provide an object for one of those
dependencies and that object is new every render, then even if none of the
properties changed, your effect will get called anyway.
Here's an example situation:
function Query({query, variables}) {
React.useEffect(
() => {},
[query, variables],
)
return <div>{/* awesome UI here */}</div>
}
function QueryPageThing({username}) {
const query = `
query getUserData($username: String!) {
user(login: $username) {
name
}
}
`
const variables = {username}
return <Query query={query} variables={variables} />
}
NOTE: you could also solve this problem if the QueryPageThing
created the
variables object like this:
const variables = React.useMemo(() => ({username}), [username])
. Then you
wouldn't need this package. But sometimes you're writing a custom hook and you
don't have control on what kinds of things people are passing you (or you want
to give them a nice ergonomic API that can handle new objects every render).
If that <Query />
component uses
This solution
This is a drop-in replacement for React.useEffect
for this use-case only.
Note, if you try to use useDeepCompareEffect
with only primitive values, you
will receive an error because you should use React.useEffect
instead.
Table of Contents
Installation
This module is distributed via npm which is bundled with node and
should be installed as one of your project's dependencies
:
npm install --save use-deep-compare-effect
Usage
You use it in place of React.useEffect
.
NOTE: Only use this if your values are objects or arrays that contain objects.
Otherwise you should just use React.useEffect
.
Example:
import React from 'react'
import ReactDOM from 'react-dom'
import useDeepCompareEffect from 'use-deep-compare-effect'
function Query({query, variables}) {
useDeepCompareEffect(
() => {
},
[query, variables],
)
return <div>{/* awesome UI here */}</div>
}
Inspiration
I built this as part of a demonstration in my course on egghead.io:
Simplify React Apps with React Hooks.
It was iterated on in the comments of
this video
and I packaged it up so people wouldn't have to worry about it.
Other Solutions
I'm not aware of any, if you are please make a pull request and add it
here!
Contributors
Thanks goes to these people (emoji key):
This project follows the all-contributors specification.
Contributions of any kind welcome!
LICENSE
MIT