成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

react hooks初體驗

anyway / 1611人閱讀

摘要:此優(yōu)化有助于避免在每個渲染上進(jìn)行昂貴的計算。同樣也是一個函數(shù),接受兩個參數(shù),第一個參數(shù)為函數(shù),第二個參數(shù)為要比對的值,返回一個值。同理,第二個參數(shù)傳入的值沒有更新時,不會執(zhí)行。以上代碼的地址為初體驗

什么是Hooks?
Hooks是react即將推出的功能,它允許您在不編寫類的情況下使用狀態(tài)和其他React功能。
我的理解就是可以用寫無狀態(tài)組件的方式去編寫擁有狀態(tài)的組件。
遺憾的是,正式版16.7.0出了之后并沒有hooks,如果需要體驗還需下載next版本,目前是16.7.0-alpha.2

npm i react@next
這次與大家分享四個Hooks,個人覺得這幾個應(yīng)該是之后工作中會經(jīng)常使用到的。

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

1.useState
個人感覺這個鉤子是重點,使用它即可做到用函數(shù)的編寫帶有狀態(tài)的組件。

import React,{ useState,useEffect } from "react"
const HookTest = () => {
    const [obj,setValue] = useState({key:"count",value:0});
    const handleChange = () => {
        const value = obj.value+1;
        //改變狀態(tài)
        setValue(Object.assign(obj,{value}));
    }
    return (
        
{obj.key}:{obj.value}

) }

很明顯,重點在于const [obj,setValue] = useState({key:"count",value:0})這一句,useState是個函數(shù),接收一個狀默認(rèn)值,返回一個數(shù)組,第一個元素為狀態(tài),初始值為傳入函數(shù)的默認(rèn)值,第二個元素為方法,可使用此方法改變狀態(tài)的值。

2.useEffect
這個鉤子,官方所說是componentDidMount,componentDidUpdate和componentWillUnmount這三個生命周期的結(jié)合,因為組件掛載完成時會執(zhí)行,更新時會執(zhí)行,卸載時會執(zhí)行,接上面的HookTest組件,往里添加

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

這就是一個基本用法,掛載、更新、卸載都會打印obj對象,return的函數(shù),作為組件更新或者卸載時執(zhí)行,比如在使用setinterval,可以在return的函數(shù)里寫clearinterval。
如果只想讓它執(zhí)行一次的話,可以往函數(shù)里添加第二個參數(shù)。

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

這樣只在掛載完成時執(zhí)行一次,第二個參數(shù)可以為false、[]、{}、""
如果想讓他有條件的執(zhí)行,可以往第二個參數(shù)傳入具體的參數(shù)

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

如果obj.value值變化時,就執(zhí)行,沒變化時就不執(zhí)行,對于性能優(yōu)化非常友好。

3.useReducer

如果使用過redux的童鞋們不會默認(rèn),將需要的狀態(tài)保存到一個對象中,可供所有的組件使用。
先上代碼

import React, { useReducer,useMemo,useEffect,useState } from "react";
//創(chuàng)建reducer,reducer可在外部創(chuàng)建然后再引入
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很像,也是使用一個數(shù)組解構(gòu)接受返回的值。
先說返回的值:
1.state
自然為reducer的狀態(tài)
2.dispatch
這個是一個函數(shù),有dispatch就意味著我們可以不用像使用redux時還需要自己下中間件(如redux-thunk)就可以進(jìn)行異步操作,具體看asyncIncrement函數(shù),參數(shù)為一個對象,指定需要執(zhí)行的action
再說useReducer函數(shù)的參數(shù):
第一個參數(shù)為你引入的reducer,第二個參數(shù)為state的默認(rèn)值,第三個參數(shù)為初始觸發(fā)的action,就是載入時默認(rèn)就執(zhí)行一個action

4.useMemo
useMemo只有當(dāng)其中一個輸入發(fā)生變化時,才會重新計算記憶值。此優(yōu)化有助于避免在每個渲染上進(jìn)行昂貴的計算。
此鉤子也是有助于性能優(yōu)化,接入上面的useReducerDemo組件,往里添加

const [tips,setTips] = useState(false);
//當(dāng)為0時提示不能再減了
useEffect(()=>{
    if(!state.count){
        setTips(true);
    }else{
        setTips(false);
    }
});
const memoizedValue = useMemo(() => {
    console.log("useMemo run");
    return tips
}, [tips]);

在return組件元素div里添加

{
    memoizedValue && 

不能為負(fù)數(shù)哦

}

以上新增的代碼時為了實現(xiàn)在reducer里的count小于等于0或從0變更為其他數(shù)字時更新true或false,以此達(dá)到p元素的顯示與否,否則一直為上一次計算得到值,我們使用了console.log("useMemo run");記錄它更新的次數(shù),當(dāng)count從0一直+1,只會打印一次"useMemo run",由此說明,只在0變成1的時候執(zhí)行了一次,往后memoizedValue的值一直為0變成1時所return的值。
此例子并說明不了什么,不過當(dāng)有很龐大計算量的時候就能體現(xiàn)出useMemo的作用了。
useMemo同樣也是一個函數(shù),接受兩個參數(shù),第一個參數(shù)為函數(shù),第二個參數(shù)為要比對的值,返回一個值。
第二個參數(shù)里可以傳入多個值,如[a,b,c,...],當(dāng)傳入的這些值有變化時,就會去執(zhí)行第一個傳入的函數(shù),根據(jù)業(yè)務(wù)需求計算后返回最終結(jié)果。
同理,第二個參數(shù)傳入的值沒有更新時,不會執(zhí)行。

結(jié)尾
花了一下午的時間體驗hook,其他的鉤子也使用了個遍,感覺這四個在我看來和在我公司業(yè)務(wù)里可能會大量的使用到,所以發(fā)此文章分享,也為記錄,本人新手前端一枚,第一次寫文章,有說的不對的地方還請請多多指教。
謝謝大家的閱讀。
以上代碼的github地址為react-hooks初體驗

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/100326.html

相關(guān)文章

  • Webhooks體驗

    摘要:對于,唯一可以指向的兩個行為是增加容器的數(shù)量和減少容器的數(shù)量。使用在超出范圍內(nèi)對服務(wù)進(jìn)行伸縮是不允許的。沒有身份認(rèn)證或?qū)嵨镄枰ㄟ^請求發(fā)送到。 Rancher 1.4已于上周全面發(fā)布!新版本帶來了Dashboard和Helm的集成,更細(xì)致的網(wǎng)絡(luò)策略控制,直接構(gòu)建進(jìn)平臺中的保密管理,當(dāng)然還有今天要重點介紹的主角,Webhooks! Rancher 1.4版本為webhooks添加了一個新...

    蘇丹 評論0 收藏0
  • react-native 體驗 - 使用 javascript 來寫 iOS app

    摘要:去年年初寫了一個擴(kuò)展十閱后,一直想寫個十閱出來,奈何懶癌后期,一直拖到最近才完成原型。這次心血來潮閑的蛋疼,想起去年年初就有所耳聞的,于是就打算用它來耍耍。使用鏈接庫在設(shè)備上運行用來斷點調(diào)試地址學(xué)習(xí)資源圖圖圖 去年年初寫了一個 chrome 擴(kuò)展「十閱」后,一直想寫個十閱 app 出來,奈何懶癌后期,一直拖到最近才完成原型。 其實很早之前就已經(jīng)寫過一個 hybrid app 了,使用了...

    余學(xué)文 評論0 收藏0
  • React Hooks+Umi+TypeScript+Dva開發(fā)體驗

    摘要:為什么選擇是開發(fā)和維護(hù)的一種面向?qū)ο蟮木幊陶Z言。一在組件組件復(fù)用狀態(tài)邏輯很難沒有提供將可復(fù)用性行為附加到組件的途徑例如,把組件連接到。如此很容易產(chǎn)生,并且導(dǎo)致邏輯不一致。同時,這也是很多人將與狀態(tài)管理庫結(jié)合使用的原因之一。 前端時間,接觸了hooks,研究了一段時間后感覺使用起來十分方便,正好公司開了一個新的小項目,正好使用hooks來實踐一下。 技術(shù)選型 1.為什么選擇umi 在之前...

    stonezhu 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<