怎么构建自己的钩子的反应

  介绍

这篇文章主要介绍怎么构建自己的钩子反应,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

1。常用的一个钩子

官方中提供了几个内置的钩子,我们简单了解下他们的用法。

1.1 useState:状态钩子

需要更新页面状态的数据,我们可以把他放到useState的钩子里,例如点击按钮一下,数据加1的操作:

const  [,, setCount],=, useState (0);      return  (& lt;比;   ,,,& lt; p>{,计数}& lt;/p>   ,,,& lt; button  onClick =, {   ,,,,,,,(),=祝辞,setCount(时间+ count  1)   ,,,}祝辞,add  1, & lt;/button>   ,,,& lt;/比;   );

在打印稿的体系中,数的类型,默认就是当前初始值的类型,例如上面例子中的变量就是<代码> 数量类型。如果我们想自定义这个变量的类型,可以在useState后面进行定义:

const  [,, setCount],=, useState (null);,//,变量数为数类型或者空类型

同时,使用useState改变状态时,是整个把国家替换掉的,因此,若状态变量是个对象类型的数据,我只想修改其中的某个字段,在之前类组件内调用设置状态时,他内部会自动合并数据。

class  Home  extends  React.Component  {   ,,,state =, {   ,,,,,,,名字:,& # 39;wenzi& # 39;   ,,,,,,,年龄:,20日   ,,,,,,,分数:89   ,,,};      ,,,更新(),{   ,,,,,,,this.setState ({   ,,,,,,,,,,,分数:98   ,,,,,,,});,//,内部自动合并   ,,,}   }

但在函数组件内使用useState时,需要自己先合并数据,然后再调用方法,否则会造成字段的丢失。

const (人,,setPerson],=, useState ({   ,,,的名字:,& # 39;wenzi& # 39;   ,,,年龄:,,   ,,,分数:89   });      setPerson ({   ,,,,的人,   ,,,{   ,,,,,,,分数:98   ,,,}//});还以为,先合并数据,{,名字:& # 39;wenzi& # 39;,,年龄:,20日,得分:,98,}   setPerson ({   ,,,分数:98   });,//,仅传入要修改的字段,后姓名和年龄字段丢失

1.2 useEffect:副作用钩子

useEffect可以看做是componentDidMount, componentDidUpdate和componentWillUnmount这三个函数的组合。

useEffect钩子在组件初始化完毕时,一定会执行一次,在组件重新渲染的过程中,是否还要更新,还要看传入的第2个参数。

<李>

当只有回调函数这一个参数时,组件的每次更新,回调都会执行;

<李>

当有2个参数时,只有第2参数里的数据发生变化时,回调才执行;

<李>

只想在组件初始化完毕时只执行一次,第2个参数可以传入一个空的数组;

我们可以看下这个例子,无论点击添加按钮还是凝固时间按钮,useEffect的回调都会执行:

const  Home =,(),=祝辞,{   ,,,const  [,, setCount],=, useState (0);   ,,,const  [nowtime, setNowtime],=, useState (0);      ,,,useEffect((),=祝辞,{   ,,,,,,,console.log(& # 39;计数# 39;,,数量);   ,,,,,,,console.log (& # 39; nowtime& # 39;,, nowtime);   ,,,});      ,,,return  (,, & lt的在   ,,,,,,,& lt; p>数:,{数},& lt;/p>   ,,,,,,,& lt; p> nowtime:, {nowtime}, & lt;/p>   ,,,,,,,& lt; button  onClick =,{(),=祝辞,setCount(时间+ count  1)}祝辞,add  1, & lt;/button>   ,,,,,,,& lt; button  onClick =,{(),=祝辞,setNowtime (Date.now())},祝辞,set 你time  & lt;/button>   ,,,& lt;/祝辞);   };

若改成下面的这样,回调仅会在数发生变化时才会在控制台输出,仅修改nowtime的值时没有输出:

useEffect((),=祝辞,{   ,,,console.log(& # 39;计数# 39;,,数量);   ,,,console.log (& # 39; nowtime& # 39;,, nowtime);   },,[数]);

useEffect的回调函数还可以返回一个函数,这个函数在影响生命周期结束之前调用。为防止内存泄漏,清除函数会在组件卸载前执行。另外,如果组件多次渲染,则在执行下一个影响之前,上一个效果就已被清除。

基于上面的代码,我们稍微修改一下:

useEffect((),=祝辞,{   ,,,console.log(& # 39;计数# 39;,,数量);   ,,,console.log (& # 39; nowtime& # 39;,, nowtime);      ,,,return (),=祝辞,console.log (& # 39; effect  callback  will  be 清除# 39;);   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

怎么构建自己的钩子的反应