I Love ReactJS

One hooks a day-- useUpdateEffect

Let's start with some nonsense

useUpdateEffect & nbsp; usage is equivalent to & nbsp; useEffect , but ignores execution for the first time, only if it depends on updates.

there are scenarios in which we do not want to perform effect when rendering for the first time, such as when searching, the search method is called only when the keyword changes. This hooks is also used more often in daily work, so it is necessary for us to write its source code, 🤓.

Let's see the effect

for the first time, only useEffect prints count, and only when count changes, useUpdateEffect prints count

Source code implementation

import React, { useEffect, useRef } from 'react';
const useUpdateEffect = (
  effect: React.EffectCallback,
  deps: React.DependencyList,
) => {
  let isFirst = useRef(true);
  useEffect(() => {
    if (isFirst.current) {
      isFirst.current = false;
      return;
    }
    return effect();
  }, [deps]);
};

complete demo source code

import React, { useEffect, useRef } from 'react';
import { Button } from 'antd';

const useUpdateEffect = (
  effect: React.EffectCallback,
  deps: React.DependencyList,
) => {
  let isFirst = useRef(true);
  useEffect(() => {
    if (isFirst.current) {
      isFirst.current = false;
      return;
    }
    return effect();
  }, [deps]);
};

const Demo = () => {
  const [count, setCount] = React.useState(0);

  useEffect(() => {
    console.log('count' of useEffect, count);
  }, [count]);

  useUpdateEffect(() => {
    console.log('count' of useUpdateEffect, count);
  }, [count]);

  return (
    <>
      <div>Count: {count}</div>
      <Button type="primary" onClick={() => setCount(count + 1)}>
Click me + 1
</Button>
    </>
  );
};
export default Demo;

reference

interested friends can look at the source code of react-use and ahooks to learn the elegant code of their predecessors.

Exit mobile version