React Hooks

Hoooks:

. Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。
. 使用 Hook 其中一个目的就是要解决 class 中生命周期函数经常包含不相关的逻辑,但又把相关逻辑分离到了几个不同方法中的问题。

1、useState:

const [count, setCount] = useState(0)

count:变更名
setCount:更新方法:

setCount(count + 1) 
 //或者
setState(item => {
  return {item + 1};
});
惰性初始 state
    const [state, setState] = useState(() => {
        // 组件的初始渲染中起作用,有些需求要在初始时做复杂的计算做为state初始值。
        return count + counts + 10;
    });
问:

React 怎么知道 useState 对应的是哪个组件,因为我们并没有传递 this 给 React。(更新数据时都会调用一次组件,也就是会再执行一次函数组件,那么count值为什么可以保存上次的呢?)

解:

React 保持对当先渲染中的组件的追踪,每个组件内部都有一个「记忆单元格」列表。它们只不过是我们用来存储一些数据的 JavaScript 对象。当你用 useState() 调用一个 Hook 的时候,它会读取当前的单元格(或在首次渲染时将其初始化),然后把【指针】移动到下一个。这就是多个 useState() 调用会得到各自独立的本地 state 的原因。

个人理解:闭包(因为组件都被「记忆单元格」【指针】引入了)。

函数组件也是一个闭包,其中定义的count变量做为闭包私有变量会被useState中强引用,而等到数据更新再次执行函数组件时,会把强引用变量值给到相同变量名。

2、useEffect :

useEffect( () => {} )
说明:

1.useEffect会在第一次渲染及【每次更新】后延迟执行
2.useEffect可当做componentDidMount(挂载完成),componentDidUpdate(更新完成) 和 componentWillUnmount(组件卸载前) 这三个生命周期函数的组合。
3.与 componentDidMount 或 componentDidUpdate 不同,使用 useEffect 调度的 effect 不会阻塞浏览器更新屏幕,这让你的应用看起来响应更快。
4.useEffect的参数为一个函数(异步),React 会保存这个函数(我们将它称之为 “effect”),并且在执行 DOM 更新之后调用它(闭包机制)。
## 需要清除的 effect:componentWillUnmount(组件卸载前)在哪做? ##
为保持代码的紧密性,所以 useEffect 的设计是在同一个地方执行。如果你的 effect 返回一个函数,React 将会在执行清除操作时调用它:

useEffect( () => { return () => {//这里做需要清除的事件} } )
Effect性能优化:

在某些情况下,每次渲染后都执行清理或者执行 effect 可能会导致性能问题。
在 class 组件中

在 class 组件中,我们可以通过在 componentDidUpdate 中添加对 prevProps 或 prevState 的比较逻辑解决:
          componentDidUpdate(prevProps, prevState) {
                if (prevState.count !== this.state.count) {  //如果state中count值有变化,那么就更新document.title
                        document.title = `You clicked ${this.state.count} times`;
                }
            }

在函数组件中

在函数组件中,设置useEffect 的第二个可选参数即可解决:
                useEffect(() => {
                    document.title = `You clicked ${count} times`;
                }, [count]); // 仅在 count 更改时更新document.title
useEffect(()=>{
        console.log('useEffect第二个参数为[]时,当前函数仅在组件挂载和卸载时执行');
        return () => {
            console.log('我要被销毁了');
        }
    },[]) // useEffect第二个参数为[]时,当前函数仅在组件挂载和卸载时执行

3、createContext(挂载) & useContext(解析)

useContext类似props

1、创建一个 React 的 上下文 createContext
const MyContext = React.createContext(defaultValue) //defaultValue 是传入的默认值。
//如果匹配不到最新的 Provider 则会使用默认值,默认值一般只有在对组件进行单元测试(组件并未嵌入到父组件中)的时候,比较有用。

2、父组件引入了实例,并且通过 MyContext.Provider 将子组件包装,并且通过 Provider的value 将父组件方法提供出去。
<MyContext.Provider value={{ setStep }}>
     <子组件 />
</MyContext.Provider>

3、子组件通过useContext解析父组件提供的方法,从而达到子组件中可调用及修改父组件的方法和state。
const { setStep } = useContext(MyContext);

useReducer:

1、useState 的替代方案。
2、useReducer 会比 useState 更适用,例如 state 逻辑较复杂且包含多个子值,或者下一个 state 依赖于之前的 state 等。并且,使用 useReducer 还能给那些会触发深更新的组件做性能优化,因为[你可以向子组件传递 dispatch 而不是回调函数

Hook 规则:

1. 只在最顶层使用 Hook,不要在循环,条件或嵌套函数中调用 Hook
2. 只在 React 的函数组件中调用 Hook,不要在普通的 JavaScript 函数中调用 Hook。
3. Hook 规则插件来强制执行上两条规则:

npm install eslint-plugin-react-hooks --save-dev 

// 你的 ESLint 配置
{
  "plugins": [
    // ...
    "react-hooks"
  ],
  "rules": {
    // ...
    "react-hooks/rules-of-hooks": "error", // 检查 Hook 的规则
    "react-hooks/exhaustive-deps": "warn" // 检查 effect 的依赖
  }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容

  • 使用React Hooks有什么优势? 什么是hookshook 是一些可以让你在函数组件里面钩入react st...
    Lyan_2ab3阅读 350评论 0 1
  • 概念 React Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 s...
    梦想成真213阅读 4,062评论 0 7
  • React-Hooks 1. React-hooks是什么 我们先来看一下官网的解释: Hook 是 React ...
    Linyqs阅读 896评论 0 0
  • 目录 什么是 React Hooks? 为什么要创造 Hooks? Hooks API 一览 Hooks 使用规则...
    一个笑点低的妹纸阅读 1,073评论 0 2
  • 前言 最近的换写React项目了,好久没有写React,还动不动就想class🤣,现在跟上时代,重新学习React...
    alex夏夜阅读 2,080评论 1 3