🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
* 跳出class的组织方式,函数式组件更好复用 * 有了钩子,你可以在组件中按照代码块的相关性组织副作用,而不是基于生命周期方法强制进行切分,相关联的逻辑也不会被强行拆分开 * 不要在循环、条件、或者嵌套函数中调用hooks,并且最好在函数顶层使用。确保 * 不要在常规的函数中调用hooks,应该在react函数组件中调用 * 如果想要加条件,可以将if条件放到hook内部 ### useState ``` import { useState, useEffect } from 'react'; function Example() { const [count, setCount] = useState(0); useEffect(() => { document.title = `You clicked ${count} times`; return () => { document.title = `default title`; } }, [count]); return ( <div> <p>You clicked {count} times</p> <button onClick={() => setCount(count + 1)}> Click me </button> </div> ); } ``` * 接受一个初始值,返回一个数组包含2个元素,一个是当前的状态,一个是设置状态的函数。初始值只有第一次有用 * hooks只能在函数最顶层使用,必须use开头,可声明多个 ### useEffect * 用来替代class用法中的声明周期,更好的组织和复用代码。React将运行useEffect的时机放到了浏览器绘制之后 * 第一次render完成后会调用一次,类似componentDidMount。并且每次render后都会再调用一次,类似componentDidUpdate * 接受一个函数作为参数,调用完成之后会将其销毁(如果有销毁函数的话),每次调用内部都会新传递一个函数,包含了最新的状态值,避免存储了错误的状态 * 可以return一个函数出去,这个函数会在组件unmount的时候调用(如上),类似componentWillUnmount可以用于清除一些状态,每次render之后调用effect,然后执行完成之后调用return的销毁函数 * useEffect接受第二个参数,是一个数组的形式。它会去判断传进来的这个参数,之前的值和现在的值有没有什么变化,如果没有变化,将不会去重新应用和销毁。如果传递的数组有多个项目,当中只要有一个不同的,那么都会重新应用。(类似于componentDidUpdate的优化) * 你也可以传递一个空数组,这样你的效果只会运行及清理一次 ### useContext ### useReducer ### useCallback ``` const memoizedCallback = useCallback( () => { doSomething(a, b); }, [a, b], ); ``` 只要有一个方式变化,都会调用回调 ### useMemo ``` const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]); ``` 传递一个计算函数,和一个数组,当数组中的值发生变化时,会调用这个计算函数 ### useRef ### 参考文档 https://zhuanlan.zhihu.com/p/50597236