Have ideas to improve npm?Join in the discussion! »

    use-deep-compare-effect
    TypeScript icon, indicating that this package has built-in type declarations

    1.6.1 • Public • Published

    use-deep-compare-effect 🐋

    It's React's useEffect hook, except using deep comparison on the inputs, not reference equality


    Build Status Code Coverage version downloads MIT License All Contributors PRs Welcome Code of Conduct

    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.

    Example:

    import React from 'react'
    import ReactDOM from 'react-dom'
    import useDeepCompareEffect from 'use-deep-compare-effect'
    
    function Query({query, variables}) {
      // some code...
    
      useDeepCompareEffect(
        () => {
          // make an HTTP request or whatever with the query and variables
          // optionally return a cleanup function if necessary
        },
        // query is a string, but variables is an object. With the way Query is used
        // in the example above, `variables` will be a new object every render.
        // useDeepCompareEffect will do a deep comparison and your callback is only
        // run when the variables object actually has changes.
        [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):


    Kent C. Dodds

    💻 📖 🚇 ⚠️

    Edygar de Lima Oliveira

    💻 ⚠️

    Justin Dorfman

    🔍

    Anton Halim

    📖

    Michaël De Boey

    💻

    Tobias Büschel

    📖

    Peter Hozák

    👀

    Ricardo Busquet

    👀

    Dave Johansen

    🐛

    Sam Knutson

    📖

    Albert Lucianto

    🐛 💻 ⚠️

    This project follows the all-contributors specification. Contributions of any kind welcome!

    LICENSE

    MIT

    Keywords

    none

    Install

    npm i use-deep-compare-effect

    DownloadsWeekly Downloads

    132,831

    Version

    1.6.1

    License

    MIT

    Unpacked Size

    39.7 kB

    Total Files

    15

    Last publish

    Collaborators

    • avatar