react hooks


什么是React Hooks

React Hooks是React 16.7.0-alpha版本推出的新特性,是继 render-propshigher-order components之后的第三种状态共享方案,不会产生JSX嵌套地狱问题。这个状态指的是状态逻辑,所以称为状态逻辑复用会更恰当,因为只共享数据处理逻辑,不会共享数据本身。

特点

1、多个状态不会产生嵌套,写法还是平铺的(renderProps 可以通过 compose 解决,可不但使用略为繁琐,而且因为强制封装一个新对象而增加了实体数量)。
2、Hooks 可以引用其他 Hooks。
3、更容易将组件的 UI 与状态分离。

Hook 函数必须以 “use” 命名开头,因为这样才方便 eslint 做检查,防止用 condition 判断包裹 useHook 语句。

useState

useState的用法是,需要传入一个状态的默认值,然后函数执行之后会返回两个值,一个是状态值,一个是操作状态值的方法,例如这样:

useState
useState

但是需要注意useState不能使用在条件判断中,因为useState是顺序执行的关系
错误用法
错误用法

useEffect

useEffect用于处理组件中的effect,可以把useEffect Hook视作componentDidMount、componentDidUpdate和componentWillUnmount的组合体。

有的时候,我们希望在React更新DOM之后进行一些额外的操作。网络请求、手动更改DOM以及日志记录都是不需要清理的副作用的常见场景。因为运行之后,可以立即被销毁掉。

useEffect在组件mount时执行,也会在组件更新时执行。因为每次请求数据之后会更新本地的状态,然后组件会更新,useEffect也会再次执行,所以很容易出现无限循环的情况。而我们只想在组件mount时请求数据。

useEffect有两个参数,第一个参数是执行的function,第二个参数是依赖条件,当依赖变动就执行code,如果是空数组则组件更新之后不会再次执行,而只会在mount之后执行一次。

useEffect
useEffect

useMemo

useMemo主要是用来解决渲染时候的性能问题,在使用Function Component的时候,我们无法使用Class Component的shouldCompnentUpdate这个生命周期,也就是说无法通过组件更新前的条件判断是否需要更新,也不区分mount和update两个状态,也就是每次调用都会执行内部的所有逻辑,会带来非常大的性能损耗。比如父组件的状态更新,子组件的代码都会重新执行一遍, useMemo可以实现和useEffect一样的根据条件判断是否重新执行

useMemo 父子组件传值更新
useMemo 父子组件传值更新

useReducer && useContext

useReducer

可以提供类似Redux的功能,引入useReducer后,useReducer接受一个reducer函数作为参数,reducer和redux的reducer一样接受两个参数一个是state另一个是action。然后返回一个状态count和 dispath,count是返回状态中的值,而dispatch是一个可以发布事件来更新state的。

useReducer
useReducer

useContext

Context API是在应用程序中深入传递数据的方法,而无需手动一个一个在多个父子孙之间传递prop。它还可以是Redux这样的工具的一个很好的替代。

useContext
useContext

useContext可以实现全局状态,状态全局化并且可以统一管理 (redux的一部分)
useReducer可以实现复杂逻辑部分,action相当于Redux中的reducer
我们可以使用createContext、useContext和useReducer来实现一个redux,demo在我的github上[https://github.com/HHardyy/react-hooks-demo],src目录下的testReduce就是完整demo

useRef

玩过react的人都知道ref,它可以用来获取组件实例对象或者是dom对象,而useRef可以用来保存dom,保存事件程序,存储以前的值

useRef
useRef

自定义hooks

自定义Hooks可以让你把组件逻辑抽到可复用的方法里。

useSelf
useSelf

连续几晚4点睡觉。。。有点晕,先写这么点,后面有时间再细化,用应该是够用了。

本章demo地址https://github.com/HHardyy/react-hooks-demo