## 内置hooks ### UseState ```typescript const App: FC = () => { const [count, setCount] = useState(0); const [isShow, toggleShow] = useState(true); return ( <>
{count}
{isShow ? I'm show now : null}
> ); }; ```  ### UseEffect 函数体用于注册事件,返回值用于注销事件 #### 没有第二个参数 1. 组件挂载(首次渲染)只执行useEffect函数体 2. 组件更新先执行返回值函数,再执行函数体 3. 组件卸载只执行返回值函数 #### 第二个参数为空数组 1. 组件挂载(首次渲染)只执行函数体 2. 组件更新不执行,直接跳过 3. 组件卸载只执行返回值函数 #### 第二个参数为可变值 1. 组件挂载(可变值初始化后)只执行函数体 2. 只当可变值变化先执行返回值函数,再执行函数体 3. 组件卸载只执行返回值函数  示例: 写一个拖动浏览器实时显示窗口宽度的组件,注意不要忘记把这个组件放入`App`组件中 ```tsx const EffectComponent: FC = () => { const [width, setWidth] = useState(window.innerWidth); const resizeHandle = () => { console.log(window.innerWidth); setWidth(window.innerWidth); }; useEffect(() => { window.addEventListener("resize", resizeHandle); return () => { window.removeEventListener("resize", resizeHandle); }; }, [width]); return ( <>{width}
> ); }; ``` 看一下效果  ### useContext 创建演示组件 ```tsx // components/ContextDemo.tsx ... import { LocalProps, LangType } from "../typing"; const langs: LangType[] = [ { name: "en", label: "english" }, { name: "zh-CN", label: "简体中文" } ]; const localContext = createContext(langs[0]); const LocalContextProvider: FCcurrent lang is{" "} {currentLang.label ? currentLang.label! : currentLang.name}
``` 看一下效果  ### useReducer ```tsx // components/ReducerDemo.tsx ... // 初始化时默认主题名称 const defaultThemeName: string = "dark"; // 主题列表 const themes: ThemeType[] = [ { name: "dark", label: "暗黑" }, { name: "light", label: "明亮" } ]; // 过滤主题列表(删除非默认主题的isDefault属性) const filterThemes = (data: ThemeType[]) => data.map(theme => { if (theme.isDefault !== undefined && !theme.isDefault) { delete theme.isDefault; } return theme; }); // 获取初始化主题列表(设置初始化默认主题为当前默认主题),此函数用于初始化reducer的值 const getInitThemes = (data: ThemeType[]) => { return filterThemes( data.map(theme => { theme.isDefault = theme.name === defaultThemeName; return theme; }) ); }; // 主题操作,为了便于演示这里我们只添加了一个切换默认主题的操作 const ThemeReducer = (state: ThemeType[], action: ThemeActionType) => { switch (action.type) { case "CHANGE_THEME": return filterThemes( state.map(theme => { if (theme.name === action.value.name) { return { ...theme, isDefault: true }; } return { ...theme, isDefault: false }; }) ); default: return filterThemes(state); } }; // 获取默认当前主题 const getDefaultTheme = (data: ThemeType[]) => filterThemes(data).find(theme => theme.isDefault!); // 创建主题列表的全局变量 const themesContext = createContext< [ThemeType[], Dispatch{defaultTheme.name}
> ); }; export default { useTheme, useThemesReducer, getThemeText, ThemeContextProvider, ThemeSelector }; ``` ```tsx // index.tsxcurrent theme is {ReducerDemo.getThemeText(currentTheme)}
``` 