React Hook带来的好处

天天听别人吹 React hook 好用,函数编程牛逼,最近刚好有时间,就学习了 React hook。简单的入门了下,发现真香!!!

我就不复述官网说的一些好处了,从我做为一个开发者使用来说,我觉得好处如下:

  • 函数编程,相比 class 来说编写更舒服,逻辑复用更方便
  • 包含了很多 hook,写起代码更快了

什么是 Hook

Hook 是一些可以让你在函数组件里“钩入” React state 及生命周期等特性的函数。Hook 不能在 class 组件中使用 —— 这使得你不使用 class 也能使用 React。

State Hook

之前定义state和改变state

this.state = {a: 1}
this.setState({
    a: 2
})

使用 hook

const [a, setA] = useState(1)
setA(2)

优点:更简洁,更语艺话

Effect Hook

你之前可能已经在 React 组件中执行过数据获取、订阅或者手动修改过 DOM。我们统一把这些操作称为“副作用”,或者简称为“作用”。

类比 class,它相当于 componentDidMount + componentDidUpdate + componentWillUnmount ,多个生命周期合并成一个

相比 vue,我觉得类似 watch,他可以根据相应的参数进行监听

好处:

  • 一些操作不需要分布到不同的生命周期了,比如订阅和取消订阅(return () => {取消订阅操作})就可以写在一起了
  • 进行监听更简单

相应代码如下:

import React, { useState, useEffect } from 'react'

export default function UseEffectStudy() {
  const [count , setCount] = useState(0)
  const [count2 , setCount2] = useState(0)

  useEffect(() => {
    console.log(`count: You Click ${count} times`)
  }, [count])

  useEffect(() => {
    console.log(`count2: You Click ${count2} times`)
  }, [count2])

  return (
    <div>
      <p>count1: You Click {count} times</p>
      <p>count2: You Click {count2} times</p>
      <button onClick={() => setCount(count + 1)}>click me</button>
      <button onClick={() => setCount2(count2 + 1)}>click me</button>
    </div>
  )
}

useEffect第二个参数就是需要监听的数组,如果不包含,当其改变的时候,是不会触发回调的

UseMemo

直接说作用,类似 vue 中的 computed,昨天还在跟朋友讨论 react 中如何做一个类似的 computed,没想到 hook 就已经包含了

import React, { useState, useMemo } from "react";

// 当作 vue 的 computed 使用
export default function UseMemoStudy() {
  let [a, setA] = useState(0)
  let [b, setB] = useState(0)
  let [d, setD] = useState(0)

  // 参数,指明 useMemo 根据哪个属性变化
  let ab = useMemo(() => {
    console.log('a或则b改变了')
    return a + b
  }, [a, b])

  return (
    <div>
      <p onClick={() => setA(a++)}>a: {a}</p>
      <p onClick={() => setB(b++)}>b: {b}</p>
      <p>ab: {ab}</p>
      <p onClick={() => setD(d++)}>d: {d}</p>
    </div>
  )
}

上面的代码,当 d 改变的时候,是不会触发 useMemo 的回调的,只有 a 或则 b 的改变才会触发