react hook入门

一、react hook介绍

Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。目的是解决React的状态逻辑复用问题,因为React Hooks只共享数据处理逻辑,并不会共享数据本身。

在React应用开发中,状态管理是组件开发必不可少的内容。以前,为了对状态进行管理,最通常的做法是使用类组件或者直接使用redux等状态管理框架。现在,开发者可以直接使用React Hooks提供的State Hook来处理状态。

众所周知,React提供了两种创建组件的方式,即函数组件和类组件。函数组件是一个普通的JavaScript函数,接受props对象并返回React元素,函数组件更符合React数据驱动视图的开发思想。不过,函数组件缺乏类组件诸如状态、生命周期等种种特性,而Hooks的出现就是让函数式组件拥有类组件的特性。

为了让函数组件拥有类组件的诸如状态、生命周期等特性,React 提供了3个核心的api,即state hook 、Effect hook以及自定义 hook。

二、react hook的使用方法

import React, { useState } form 'react';

function Example() {

    // useState 方法返回一个数组。第一个值是当前的 state,第二个值是更新 state 的函数,相当于类组件的setState。

    const [count, setCount] = useState(0);

    return (

        <div>

            <p>You clicked {count} times</p>

            <button onClick={() => setCount(count + 1)}>点我加1</button>

        </div>

  );

}

如上示例,这个函数组件有自己的状态,并且还可以更新自己的状态。useState用于创建一个新的状态,参数为一个固定的值(初始值,作为useState的参数来将其初始化为 0)或者一个有返回值的方法。执行后的结果为一个数组,分别为生成的状态count以及改变该状态的方法setCount,通过解构赋值的方法拿到对应的值与方法。

函数组件中如果存在多个状态,既可以通过一个useState声明对象类型的状态,也可以通过useState多次声明状态。

const [count, setCount] = useState({

  count1: 0,

  count2: 0

});

或者

const [count1, setCount1] = useState(0);

const [count2, setCount2] = useState(0);

三、Effect hook 的使用方法

Effect Hook 可以在函数组件中执行副作用操作,主要用于以下两种情况:

1.函数式组件中不存在传统类组件生命周期的概念,如果我们需要在一些特定的生命周期或者值变化后做一些操作的话,必须借助useEffect的一些特性去实现。

2.useState产生的 changeState 方法并没有提供类似于setState的第二个参数一样的功能,因此如果需要在 State 改变后执行一些方法,必须通过useEffect实现。

该钩子接受两个参数,第一个参数为副作用需要执行的回调,生成的回调方法内可以返回一个函数(将在组件卸载时运行);第二个为该副作用监听的状态数组,当对应状态发生变动时会执行副作用,如果第二个参数为空,那么在每一个 State 变化时都会执行该副作用。

const [count, changeCount] = useState(0);

// 将在count变化时打印最新的count数据

useEffect(()=> {

  message.info(`count发生变动,最新值为${count}`);

}, [count])

在上面的例子中,我们实现了利用useState实现了setState后执行某个方法,那如果想要实现componentDidMount和componentWillUnmout生命周期的功能呢?

首先所有的副作用在组件挂载完成后会执行一次 ,如果副作用存在返回函数,那么返回的函数将在卸载时运行。我们要做的就是让与该副作用相关联的状态为空数组,不管其他状态如何变动,该副作用都不会再次执行,于是就实现了componentDidMount和componentWillUnmout。

functionChild({ visible }){

  useEffect(()=> {

    message.info('我只在页面挂载时打印');

    return ()=> {

      message.info('我只在页面卸载时打印');

    };

  }, []);

  return visible ? 'true' : 'false';

}

在上面示例中,我们实现了componentDidMount和componentWillUnmout,那么如何实现componentDidUpdate呢?其实,只要第二个参数为空(注意不是上面示例中的空数据,而是不传第二个参数),那么在每一个 State 变化时都会执行该副作用了。

useEffect(()=> {

 ……

})

四、如何自定义Hook

众所周知,要在类组件之间共享一些状态逻辑是非常麻烦的,常规做法是通过高阶组件或函数的属性来解决。不过,新版的React允许开发者创建自定义Hook来封装共享状态逻辑,且不需要向组件树中增加新的组件。

所谓的自定义Hook,其实就是指函数名以use开头并调用其他Hook的函数,自定义Hook的每个状态都是完全独立的。

export const useAxios = (url, dependencies) => {

    const [isLoading, setIsLoading] = useState(false);

    const [response, setResponse] = useState(null);

    useEffect(() => {

        setIsLoading(true);

        axios.get(url).then((res) => {

            setIsLoading(false);

            setResponse(res);

        }).catch((err) => {

            setIsLoading(false);

        });

    }, dependencies);

    return [isLoading, response, error];

};

使用自定义方法:

function Example() {

  let url = 'http://www.baidu.com/api/xxx';

  const [isLoading, response, error] = useAxios(url, []);

  ...

}

export default Example;

五、使用Hooks的注意事项:

1.不要在循环、条件或嵌套函数中使用Hook,并且只能在React函数的顶层使用Hook。因为React需要利用调用顺序来正确更新相应的状态,以及调用相应的生命周期函数函数。一旦在循环或条件分支语句中调用Hook,就容易导致调用顺序的不一致性,从而产生难以预料到的后果。

2.只能在React函数式组件或自定义Hook中使用Hook。


参考链接:https://segmentfault.com/a/1190000019438921

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

推荐阅读更多精彩内容