Skip to content

Instantly share code, notes, and snippets.

@nkint
Last active November 26, 2024 10:49
Show Gist options
  • Select an option

  • Save nkint/6dec465fce63de50b510752c89bfcae0 to your computer and use it in GitHub Desktop.

Select an option

Save nkint/6dec465fce63de50b510752c89bfcae0 to your computer and use it in GitHub Desktop.
useWhyDidYouUpdate.js
/**
* Debug hook showing which props updated between two renders
* @example
*
* const MyComponent = React.memo(props => {
* useWhyDidYouUpdate('MyComponent', props);
* return <div...;
* });
*
* @link https://usehooks.com/useWhyDidYouUpdate/
*/
export function useWhyDidYouUpdate(name, props) {
// Get a mutable ref object where we can store props ...
// ... for comparison next time this hook runs.
const previousProps = useRef() as any;
useEffect(() => {
if (previousProps.current) {
// Get all keys from previous and current props
const allKeys = Object.keys({ ...previousProps.current, ...props });
// Use this object to keep track of changed props
const changesObj = {};
// Iterate through keys
allKeys.forEach((key) => {
// If previous is different from current
if (previousProps.current[key] !== props[key]) {
// Add to changesObj
changesObj[key] = {
from: previousProps.current[key],
to: props[key]
};
}
});
// If changesObj not empty then output to console
if (Object.keys(changesObj).length) {
console.log('[why-did-you-update]', name, changesObj);
}
}
// Finally update previousProps with current props for next hook call
previousProps.current = props;
});
}
@nkint
Copy link
Copy Markdown
Author

nkint commented Nov 26, 2024

not mine, please follow the link in the comment, but I'm tired to search it again and again every time I need it

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment