TestUseEffect.jsx 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import { useEffect, useState } from 'react';
  2. function MsgItem({ text, title }) {
  3. // 3 组件卸载前执行
  4. useEffect(() => {
  5. //
  6. return () => {
  7. // 这里返回的回调 会在组件卸载前执行
  8. // 可以在这里清除一些『垃圾』
  9. console.log('MsgItem卸载了');
  10. };
  11. }, []);
  12. return (
  13. <div>
  14. <h3>{title}</h3>
  15. <p>{text}</p>
  16. </div>
  17. );
  18. }
  19. export default function TestUseEffect({ name }) {
  20. let [msg, setMsg] = useState('啥也没有');
  21. // 1 每一次组件渲染 都有执行一些代码
  22. useEffect(() => {
  23. // 编写那些副作用代码
  24. // console.log('==组件渲染==');
  25. });
  26. // 2 模拟 componentDidMount
  27. useEffect(() => {
  28. console.log('===组件渲染后===');
  29. }, []);
  30. // 4 监听state或者props变化,执行setup(组件首次渲染 也会执行setup)
  31. useEffect(() => {
  32. console.log('msg变化了');
  33. }, [msg, name]);
  34. return (
  35. <div>
  36. <h3>useEffect</h3>
  37. <div>{msg && <MsgItem text={msg} title={'注意'} />}</div>
  38. <p>
  39. {msg}: {name}
  40. </p>
  41. <p>
  42. <button
  43. onClick={() => {
  44. setMsg(Math.random() + '');
  45. }}
  46. >
  47. change
  48. </button>
  49. </p>
  50. </div>
  51. );
  52. }