ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## State Hook ~~~ import React, { useState } from 'react'; function Example() { // 声明一个叫 “count” 的 state 变量和一个让你更新它的函数 默认是0 const [count, setCount] = useState(0); return ( <div> <p>You clicked {count} times</p> <button onClick={() => setCount(count + 1)}> Click me </button> </div> ); } ~~~ **`useState`需要哪些参数?** `useState()`方法里面唯一的参数就是初始 state。 **`useState`方法的返回值是什么?** 返回值为:当前 state 以及更新 state 的函数。这就是我们写`const [count, setCount] = useState()`的原因。 ### 读取 State Hook 里 直接使用 变量名 count 就可以获取 state的值(class 中需要使用 this.state.count) ~~~ <p>You clicked {count} times</p> ~~~ ### 更新 State Hook 里,直接调用`setCount` 赋值 (class 里 `this.setState()`来更新`count`值) ~~~ <button onClick={() => setCount(count + 1)}> Click me </button> ~~~ ## Effect Hook 在 React 组件中执行过数据获取、订阅或者手动修改过 DOM。我们统一把这些操作称为“副作用”,或者简称为“作用”。 `useEffect`就是一个 Effect Hook,给函数组件增加了操作副作用的能力。它跟 class 组件中的`componentDidMount`、`componentDidUpdate`和`componentWillUnmount`具有相同的用途,只不过被合并成了一个 API。 ~~~ import React, { useState, useEffect } from 'react'; function Example() { const [count, setCount] = useState(0); // useEffect 相当于 componentDidMount 和 componentDidUpdate: // 组件加载以后执行 useEffect(() => { // 使用浏览器的 API 更新页面标题 document.title = `You clicked ${count} times`; }); // 这个是空数组, 只会在组件加载进入 DOM 后执行一次 useEffect(() => { // 使用浏览器的 API 更新页面标题 document.title = `You clicked ${count} times`; }, []); // 这个在每次count 变量改变都会触发, 相当于vue 里的 watch 了 count变量 useEffect(() => { // 使用浏览器的 API 更新页面标题 document.title = `You clicked ${count} times`; }, [count]); return ( <div> <p>You clicked {count} times</p> <button onClick={() => setCount(count + 1)}> Click me </button> </div> ); } ~~~ 当你调用`useEffect`时,就是在告诉 React 在完成对 DOM 的更改后运行你的“副作用”函数。由于副作用函数是在组件内声明的,所以它们可以访问到组件的 props 和 state。默认情况下,React 会在每次渲染后调用副作用函数 ——**包括**第一次渲染的时候。 跟`useState`一样,你可以在组件中多次使用`useEffect` ### 返回值 **effect可以返回一个函数** 这是 effect 可选的清除机制, 每个 effect 都可以返回一个清除函数。React 会在**组件卸载**的时候执行清除操作。这就是为什么 React*会*在执行当前 effect 之前对上一个 effect 进行清除。 ## useMemo ``` const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]); ``` 接收俩个参数, 第一个参数是一个函数, 返回值用于产生保存值, 第二个是一个数组, 是 依赖项, 类似 useEffect 第二个参数 返回一个[memoized](https://en.wikipedia.org/wiki/Memoization)值。 把“创建”函数和依赖项数组作为参数传入`useMemo`,它仅会在某个依赖项改变时才重新计算 memoized 值。这种优化有助于避免在每次渲染时都进行高开销的计算。 记住,传入`useMemo`的函数会在渲染期间执行。请不要在这个函数内部执行与渲染无关的操作,**诸如副作用这类的操作属于`useEffect`的适用范畴,而不是`useMemo`。** 如果没有提供依赖项数组,`useMemo`在每次渲染时都会计算新的值。 **你可以把`useMemo`作为性能优化的手段,但不要把它当成语义上的保证。**将来,React 可能会选择“遗忘”以前的一些 memoized 值,并在下次渲染时重新计算它们,比如为离屏组件释放内存。 [官方hook api](https://zh-hans.reactjs.org/docs/hooks-reference.html)