React Hooks

React Hooks它可以让我们不编写class的情况下使用state以及其他的React特性;

useState的使用

  • useState来自react,需要从react中导入,它是一个hook;
    \triangleright 参数:初始化值,如果不设置,默认为undefined;
    \triangleright 返回值:数组,包含两个元素;
    元素一:当前状态的值;元素二:设置状态值的函数;
import  {useState}  from  'react';
export  default  function  ReactHook()  {
      const  [count,setCount]  =  useState(0);
      return (
        <div>
            <h2>当前计数:{count}</h2>
            <button onClick={e => setCount(count+1)}>+1</button>
        </div>
    )
}

Hook就是JavaScript函数,这个函数可以帮助你钩入 (hook into) React State以及生命周期等特性

  • Hook指的类似于useState、useEffect这样的函数
  • Hooks是对这类函数的统称
  • 使用它们会有两个额外的规则:
    \triangleright 只能在函数最外层调用Hook。不要在循环 、条件判断或者子函数中调用。
    \triangleright 只能在React的函数组件中调用Hook。不要在其他JavaScript函数中调用。

Effect Hook的使用

  • Effect Hook可以让你来完成一些类似于class中生命周期的功能;
  • 事实上,类似于网络请求、手动更新DOM、一些事件的监听,都是React更新DOM的一些副作用;
  • 所以对于完成这些功能的Hook被称之为Effect Hook;

useEffect的作用:

  • 通过useEffect的Hook,可以告诉React需要在渲染后执行某些操作;
  • useEffect要求我们传入一个回调函数,在React执行完更新DOM操作之后,就会回调这个函数;
  • 默认情况下,无论是第一次渲染之后,还是每次更新之后,都会执行这个回调函数;

useEffect传入的回调函数A本身可以有一个返回值,这个返回值是另外一个回调函数B:

type  EffectCallback  = () => (void | (() => void | undefined));

那么,为啥要在effect中返回一个函数呢?

  • 这是effect可选的清除机制。每个effect都可以返回一个清除函数。
  • 如此可以将添加和移除订阅的逻辑放在一起。
  • 它们都属于effect的一部分。

React何时清除effect?

  • React会在组件更新和卸载的时候执行清除操作;
  • 正如前面学到的,effect在每次渲染的时候都会执行;
  • useEffect实际上有两个参数:
    \triangleright参数一:执行的回调函数;
    \triangleright参数二:该useEffect在哪些state发生变化时,才重新执行;

若一个函数我们不希望依赖任何的内容时,可以传递一个空数组[]作为第二个参数作为优化。

  • 那么这里的两个回调函数分别对应是componentDidMount和componentWillUnmount生命周期函数

useContext的使用

src/App.js文件

import React, { createContext, PureComponent } from 'react';
import ContextHook from './04_useContext的使用/01_useContext使用';

export const UserContext = createContext();
export const ThemeContext = createContext();

export default class App extends PureComponent {
    render() {
        return (
          <div>
              <UserContext.Provider value={{name:"boge",age:18}}>
                 < ThemeContext.Provider value={{fontSize:"30px",color:"red"}}>
                    <ContextHook />
                 </ThemeContext.Provider>
              </UserContext.Provider>
          </div>
        )
    }
}

src/04_useContext的使用/01_useContext使用.js文件

import React,{useContext} from 'react'

import {UserContext,ThemeContext} from '../App'

export default function ContextHook() {
    const user = useContext(UserContext);
    const theme = useContext(ThemeContext);

    console.log(user,theme);  //打印出UserContext和ThemeContext的value值
    return (
        <div>
            ContextHook
        </div>
    )
}

useContext(UserContext)相当于class组件中的staticcontextType = UserContext或者<UserContext.Consumer>
useContext(UserContext)只是让你能够读取context的值以及订阅context的变化。你仍然需要在上层组件树使用<UserContext.Provider>来为下层组件提供context。

自定义Hook

自定义Hook是一个函数,其名称必须以“use”开头,函数内部可以调用其他的Hook。

代码案例:自定义Hook练习-Context共享
src/hooks/user-hooks.js

import { useContext } from "react";
import { TokenContext, UserContext } from "../App";

function useUserContext(){
    const user = useContext(UserContext);
    const token = useContext(TokenContext);

    return [user,token];
}

export default useUserContext;

src/11_自定义Hook/02_自定义Hook练习-Context共享.js

import React from 'react'
import useUserContext from '../hooks/user-hook'

export default function CustomContextShareHook() {
    const [user, token] = useUserContext();
    
    console.log(user, token)
    return (
        <div>
            <h2>CustomContextShareHook</h2>
        </div>
    )
}

src/App.js

import React, { createContext, PureComponent } from 'react';

export const UserContext = createContext();
export const TokenContext = createContext();

export default class App extends PureComponent {
    render() {
        return (
            <div>
                < UserContext.Provider value={{name:"boge",age:18}}>
                    <TokenContext.Provider value={"sadsad"}>
                        <CustomContextShareHook />
                    </TokenContext.Provider>
                </UserContext.Provider>
            </div>
        )
    }
}


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

推荐阅读更多精彩内容

  • Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他...
    mora__阅读 581评论 0 0
  • 概念 React Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 s...
    梦想成真213阅读 4,062评论 0 7
  • 排版有点乱,好像不支持字体自定义颜色,你可以去看我的博客 动机 Hook 解决了我们五年来编写和维护成千上万的组件...
    阿畅_阅读 366评论 0 1
  • 前言 本文全面介绍了React Hooks的所有API概念、用法、丰富的demo以及部分底层原理。 实际上,Rea...
    南宫__阅读 3,566评论 0 6
  • 什么是hooks? hooks 是 react 在16.8版本开始引入的一个新功能,它扩展了函数组件的功能,使得函...
    JoeRay61阅读 555评论 0 0