资讯专栏INFORMATION COLUMN

react hooks初体验

anyway / 1584人阅读

摘要:此优化有助于避免在每个渲染上进行昂贵的计算。同样也是一个函数,接受两个参数,第一个参数为函数,第二个参数为要比对的值,返回一个值。同理,第二个参数传入的值没有更新时,不会执行。以上代码的地址为初体验

什么是Hooks?
Hooks是react即将推出的功能,它允许您在不编写类的情况下使用状态和其他React功能。
我的理解就是可以用写无状态组件的方式去编写拥有状态的组件。
遗憾的是,正式版16.7.0出了之后并没有hooks,如果需要体验还需下载next版本,目前是16.7.0-alpha.2

npm i react@next
这次与大家分享四个Hooks,个人觉得这几个应该是之后工作中会经常使用到的。

 1. useState
 2. useEffect
 3. useReducer
 4. useMemo

1.useState
个人感觉这个钩子是重点,使用它即可做到用函数的编写带有状态的组件。

import React,{ useState,useEffect } from "react"
const HookTest = () => {
    const [obj,setValue] = useState({key:"count",value:0});
    const handleChange = () => {
        const value = obj.value+1;
        //改变状态
        setValue(Object.assign(obj,{value}));
    }
    return (
        
{obj.key}:{obj.value}

) }

很明显,重点在于const [obj,setValue] = useState({key:"count",value:0})这一句,useState是个函数,接收一个状默认值,返回一个数组,第一个元素为状态,初始值为传入函数的默认值,第二个元素为方法,可使用此方法改变状态的值。

2.useEffect
这个钩子,官方所说是componentDidMount,componentDidUpdate和componentWillUnmount这三个生命周期的结合,因为组件挂载完成时会执行,更新时会执行,卸载时会执行,接上面的HookTest组件,往里添加

useEffect(()=>{
    console.log("obj->",obj);
    return ()=>{
        console.log("卸载时..");
    }
});

这就是一个基本用法,挂载、更新、卸载都会打印obj对象,return的函数,作为组件更新或者卸载时执行,比如在使用setinterval,可以在return的函数里写clearinterval。
如果只想让它执行一次的话,可以往函数里添加第二个参数。

useEffect(()=>{
    console.log("obj->",obj);
},false);

这样只在挂载完成时执行一次,第二个参数可以为false、[]、{}、""
如果想让他有条件的执行,可以往第二个参数传入具体的参数

useEffect(()=>{
    console.log("obj->",obj);
},{obj.value});

如果obj.value值变化时,就执行,没变化时就不执行,对于性能优化非常友好。

3.useReducer

如果使用过redux的童鞋们不会默认,将需要的状态保存到一个对象中,可供所有的组件使用。
先上代码

import React, { useReducer,useMemo,useEffect,useState } from "react";
//创建reducer,reducer可在外部创建然后再引入
function reducer(state = { count: 0 }, action) {
    switch (action.type) {
        case "reset":
            return { count: 0 };
        case "increment":
            return { count: state.count + 1 };
        case "decrement":
            return { count: state.count <= 0 ? 0 : state.count - 1 };
        default:
            return state;
    }
}
//组件
const useReducerDemo = () => {
    const [state, dispatch] = useReducer(reducer, { count: 0 }, { type: "increment" });
    //异步增加
    const asyncIncrement = () => {
        setTimeout(()=>{
            dispatch({ type: "increment" })
        },2000);
    }
    return (
        

Count: {state.count}

) }

可以看到,和useState很像,也是使用一个数组解构接受返回的值。
先说返回的值:
1.state
自然为reducer的状态
2.dispatch
这个是一个函数,有dispatch就意味着我们可以不用像使用redux时还需要自己下中间件(如redux-thunk)就可以进行异步操作,具体看asyncIncrement函数,参数为一个对象,指定需要执行的action
再说useReducer函数的参数:
第一个参数为你引入的reducer,第二个参数为state的默认值,第三个参数为初始触发的action,就是载入时默认就执行一个action

4.useMemo
useMemo只有当其中一个输入发生变化时,才会重新计算记忆值。此优化有助于避免在每个渲染上进行昂贵的计算。
此钩子也是有助于性能优化,接入上面的useReducerDemo组件,往里添加

const [tips,setTips] = useState(false);
//当为0时提示不能再减了
useEffect(()=>{
    if(!state.count){
        setTips(true);
    }else{
        setTips(false);
    }
});
const memoizedValue = useMemo(() => {
    console.log("useMemo run");
    return tips
}, [tips]);

在return组件元素div里添加

{
    memoizedValue && 

不能为负数哦

}

以上新增的代码时为了实现在reducer里的count小于等于0或从0变更为其他数字时更新true或false,以此达到p元素的显示与否,否则一直为上一次计算得到值,我们使用了console.log("useMemo run");记录它更新的次数,当count从0一直+1,只会打印一次"useMemo run",由此说明,只在0变成1的时候执行了一次,往后memoizedValue的值一直为0变成1时所return的值。
此例子并说明不了什么,不过当有很庞大计算量的时候就能体现出useMemo的作用了。
useMemo同样也是一个函数,接受两个参数,第一个参数为函数,第二个参数为要比对的值,返回一个值。
第二个参数里可以传入多个值,如[a,b,c,...],当传入的这些值有变化时,就会去执行第一个传入的函数,根据业务需求计算后返回最终结果。
同理,第二个参数传入的值没有更新时,不会执行。

结尾
花了一下午的时间体验hook,其他的钩子也使用了个遍,感觉这四个在我看来和在我公司业务里可能会大量的使用到,所以发此文章分享,也为记录,本人新手前端一枚,第一次写文章,有说的不对的地方还请请多多指教。
谢谢大家的阅读。
以上代码的github地址为react-hooks初体验

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/100326.html

相关文章

  • Webhooks体验

    摘要:对于,唯一可以指向的两个行为是增加容器的数量和减少容器的数量。使用在超出范围内对服务进行伸缩是不允许的。没有身份认证或实物需要通过请求发送到。 Rancher 1.4已于上周全面发布!新版本带来了Dashboard和Helm的集成,更细致的网络策略控制,直接构建进平台中的保密管理,当然还有今天要重点介绍的主角,Webhooks! Rancher 1.4版本为webhooks添加了一个新...

    苏丹 评论0 收藏0
  • react-native 体验 - 使用 javascript 来写 iOS app

    摘要:去年年初写了一个扩展十阅后,一直想写个十阅出来,奈何懒癌后期,一直拖到最近才完成原型。这次心血来潮闲的蛋疼,想起去年年初就有所耳闻的,于是就打算用它来耍耍。使用链接库在设备上运行用来断点调试地址学习资源图图图 去年年初写了一个 chrome 扩展「十阅」后,一直想写个十阅 app 出来,奈何懒癌后期,一直拖到最近才完成原型。 其实很早之前就已经写过一个 hybrid app 了,使用了...

    余学文 评论0 收藏0
  • React Hooks+Umi+TypeScript+Dva开发体验

    摘要:为什么选择是开发和维护的一种面向对象的编程语言。一在组件组件复用状态逻辑很难没有提供将可复用性行为附加到组件的途径例如,把组件连接到。如此很容易产生,并且导致逻辑不一致。同时,这也是很多人将与状态管理库结合使用的原因之一。 前端时间,接触了hooks,研究了一段时间后感觉使用起来十分方便,正好公司开了一个新的小项目,正好使用hooks来实践一下。 技术选型 1.为什么选择umi 在之前...

    stonezhu 评论0 收藏0

发表评论

0条评论

anyway

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<