Giter Site home page Giter Site logo

yuttasakcom / use-deep-compare-effect Goto Github PK

View Code? Open in Web Editor NEW

This project forked from kentcdodds/use-deep-compare-effect

0.0 1.0 0.0 47 KB

πŸ‹ It's react's useEffect hook, except using deep comparison on the inputs, not reference equality

Home Page: https://npm.im/use-deep-compare-effect

License: MIT License

JavaScript 100.00%

use-deep-compare-effect's Introduction

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 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}) {
  // some code...

  React.useEffect(
    () => {},
    // because of the way the Query component is used below, `variables` is a
    // new object every render. This is the problem.
    [query, variables],
  )

  return <div>{/* awesome UI here */}</div>
}

function QueryPageThing({username}) {
  const query = `
    query getUserData($username: String!) {
      user(login: $username) {
        name
      }
    }
  `
  const variables = {username}
  // poof! Every render `variables` will be a new object!
  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. 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][good-first-issue] label.

πŸ› Bugs

Please file an issue for bugs, missing documentation, or unexpected behavior.

[See Bugs][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][requests]

Contributors ✨

Thanks goes to these people (emoji key):


Kent C. Dodds

πŸ’» πŸ“– πŸš‡ ⚠️

Edygar de Lima Oliveira

πŸ’» ⚠️

Justin Dorfman

πŸ”

Anton Halim

πŸ“–

MichaΓ«l De Boey

πŸ’»

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

LICENSE

MIT

use-deep-compare-effect's People

Contributors

allcontributors[bot] avatar amiralies avatar andrewmcodes avatar antonhalim avatar edygar avatar jdorfman avatar kentcdodds avatar michaeldeboey avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.