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 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.
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
. In case of "polymorphic"
values (eg: sometimes object, sometimes a boolean), use
useDeepCompareEffectNoCheck
, but do it at your own risk, as maybe there can
be better approaches to the problem.
NOTE: Be careful when your dependency is an object which contains function.
If that function is defined on the object during a render, then it's changed
and the effect callback will be called every render.
Issue has more context.
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>
}
Other Solutions
use-custom-compare-effect
Issues
Looking to contribute? Look for the Good First Issue
label.
🐛 Bugs
Please file an issue for bugs, missing documentation, or unexpected behavior.
See Bugs
💡 Feature Requests
Please file an issue to suggest new features. Vote on feature requests by adding
a 👍. This helps maintainers prioritize what to work on.
See Feature Requests
Contributors ✨
Thanks goes to these people (emoji key):
This project follows the all-contributors specification.
Contributions of any kind welcome!
LICENSE
MIT