diff --git a/chapter3/src/app/demo/_components/effect.tsx b/chapter3/src/app/demo/_components/effect.tsx new file mode 100644 index 0000000..7149f9c --- /dev/null +++ b/chapter3/src/app/demo/_components/effect.tsx @@ -0,0 +1,60 @@ +// src/app/demo/_components/effect.tsx +// ... +'use client'; + +import { Button } from 'antd'; +import { type FC, useEffect, useState } from 'react'; + +import $styles from './style.module.css'; + +const EffectDemo: FC = () => { + const [ghost, setGhost] = useState(false); + const [width, setWidth] = useState(0); + const [red, setRed] = useState(false); + + const toggleGhostBtn = () => setGhost(!ghost); + useEffect(() => { + const resizeHandle = () => { + setWidth(window.innerWidth); + console.log('浏览器宽度改变'); + }; + const frameId = requestAnimationFrame(resizeHandle); + window.addEventListener('resize', resizeHandle); + + return () => { + cancelAnimationFrame(frameId); + window.removeEventListener('resize', resizeHandle); + }; + }, []); + + useEffect(() => { + ( + async () => { + await new Promise((resolve) => { + setTimeout(() => { + resolve('done'); + }, 1000); + }); + setRed(ghost); + } + )(); + }, [ghost]); + + useEffect(() => { + console.log('只在第一次或重新渲染时触发'); + }, []); + + return ( +
+

useEffect Demo

+

{ghost ? 'ghost' : '普通'}按钮

+
+ +

宽度为: {width}

+
+
+ ); +}; +export default EffectDemo; diff --git a/chapter3/src/app/demo/page.tsx b/chapter3/src/app/demo/page.tsx index e178c78..863dc6e 100644 --- a/chapter3/src/app/demo/page.tsx +++ b/chapter3/src/app/demo/page.tsx @@ -3,6 +3,8 @@ import { FC } from 'react'; import { Button } from 'antd'; import StateDemo from './_components/state'; +import EffectDemo from './_components/effect'; +import RefDemo from './_components/ref'; import $styles from './page.module.css'; @@ -19,6 +21,12 @@ const DemoPage: FC = () => (
+
+ +
+
+ +