LearnUseEffect.jsx 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import { useEffect, useState } from 'react';
  2. function LearnUseEffect() {
  3. let timer;
  4. let [count, setCount] = useState(0);
  5. let [time, setTime] = useState(new Date());
  6. //! 第一种方式 直接传入 一个函数:当组件第一次渲染后(或者 组件更新后) 会执行该回调
  7. // componentDidMount componentDidUpdate componentWillUnmount
  8. // useEffect(() => {
  9. // console.log(`output->effect`);
  10. // });
  11. //! 第二种方式: 传入两个参数,第一个为回调函数,第二个 为 空数组
  12. // 只有组件第一次渲染完后执行一次回调,之后不会在执行
  13. // useEffect(() => {
  14. // console.log(`output->只有组件渲染后执行一次`);
  15. // }, []);
  16. //! 第三种:传入两个参数,第一个为回调函数,第二个 为 数组,在数组中指定该副作用依赖的状态
  17. // 当组件第一次渲染后执行一次,之后当依赖的数组中状态发生改变时 才会再执行该回调
  18. // useEffect(() => {
  19. // console.log(`output->只有组件渲染后执行一次`);
  20. // }, [count]);
  21. // 该副作用可以依赖多个状态
  22. //! 第四种: 如果给传入的回调函数 返回一个函数fn,该fn会在组件卸载前执行
  23. useEffect(() => {
  24. timer = setInterval(() => {
  25. console.log(`output->timer`, timer);
  26. setTime(new Date());
  27. }, 1000);
  28. return () => {
  29. // 会在组件卸载前执行
  30. clearInterval(timer); // 是不能清楚
  31. };
  32. }, []);
  33. // useEffect(() => {
  34. // console.log(`output->只有组件渲染后执行一次`);
  35. // }, [count, time]);
  36. return (
  37. <div>
  38. <p>
  39. 学习useEffect:{count}, {time.toLocaleString()}
  40. </p>
  41. <button onClick={() => setCount(10)}>change</button>
  42. <button onClick={() => setTime(new Date())}>change time</button>
  43. </div>
  44. );
  45. }
  46. export default LearnUseEffect;