ReactHook快速上車

2022-06-25 06:48:08 字數 3589 閱讀 5486

react16.8開始內建了10個hook,核心是2個:

usestate

有狀態元件寫法:

class example extends react.component ;

}render() times

this.setstate()}>

click me);}

}

無狀態元件寫法:

const example = props =>  = props;

return (

you clicked times

click me

)}

hooks是有狀態的函式:

import  from 'react';

const example = () => times

setcount(count + 1)}>

click me

)}

注意,usestate生成的setter在更新state的時候不會合併:

const [data, setdata] = usestate();   // name沒有被使用,應該分開宣告

useeffect(() => ->

setdata()

})

在我們的純函式元件裡,每個usestate都會生產一對state和statesetter,我們無需考慮更多的狀態樹的設計和元件的劃分設計,邏輯**可以直接從根元件寫起。

我們應用的發展途徑大致分為以下3個階段,基於hook開發過程將更有彈性:

中期gank:當元件的狀態逐漸變得多起來時,我們可以很輕鬆地將狀態的更新交給reducer來管理

後期團戰:不光狀態多了,狀態的邏輯也越來越複雜的時候,我們可以幾乎0成本的將繁雜的狀態邏輯**抽離成自定義hook解決問題

不同於真正的redux,在實際應用中,hook帶來了一種更加靈活和純粹的模式。現在我們可以用10行**實現乙個全域性的redux,也可以用2行**隨時隨地實現乙個區域性的redux:

10行**實現乙個全域性的redux:

import react from 'react';

const store = react.createcontext(null);

export const initialstate = ;

export function reducer(state, action) ;

default: throw new error('unexpected action');

}}export default store;

provider根元件掛上:

import react,  from 'react';

import store, from './store';

const [state, dispatch] = usereducer(reducer, initialstate);

return (

)}

子元件呼叫:

import react,  from 'react';

import store from './store';

function child() = usecontext(store);

}

隨時隨地的乙個區域性redux:

import react,  from 'react';

const initialstate = ;

function reducer(state, action) ;

default: throw new error('unexpected action');

}}function component()

當我們想在兩個函式之間共享邏輯時,我們會把它提取到第三個函式中。而元件和 hook 都是函式,所以也同樣適用這種方式。不同的是,hook 是有狀態的函式,它能實現以往純函式所不能做到的更高階別的復用——狀態邏輯的復用。

component寫法:

constructor(props) ;

} componentdidmount() );

});service.getinitialname().then(data => );

});} componentwillunmount() );

} addcount = () => );

};handlenamechange = name => );

};render() = this.state;

return (

you clicked times

click me

);}}

hook寫法:

function usecount(initialvalue) );

return () => );

};}, );

function addcount()

return ;

}function usename(initialvalue) );

}, );

function handlenamechange(value)

return ;

} const = usecount(0);

const = usename();

return (

you clicked times

click me

);};

如上,使用component的寫法裡,count和name,還有與之相關的一票兒邏輯,散落在元件的生命週期和方法裡。雖然我們可以將元件的state和變更action抽成公共的,但涉及到***的action,到最終還是繞不開元件的生命週期。但乙個元件的生命週期只有一套,不可避免的會出現一些完全不相干的邏輯寫在一起。如此一來,便無法實現完全的狀態邏輯復用。

我們再看看使用hook的寫法,我們將count相關的邏輯和name相關的邏輯通過自定義hook,封裝在獨立且封閉的邏輯單元裡。以往class元件的生命週期在這裡不復存在。生命週期是和ui強耦合的乙個概念,雖然易於理解,但它天然距離資料很遙遠。而hook以一種類似rxjs模式的資料流訂閱實現了元件的***封裝,這樣的好處就是我們只需要關心資料。所以hook所帶來的,絕不僅僅只是簡化了state的定義與包裝。

自定義hook實現了狀態邏輯與ui分離,通過合理抽象自定義hook,能夠實現非常高階別的業務邏輯抽象復用

let hooks, i;

function usestate()

// 第一次渲染

hooks.push(...);

}// 準備渲染

i = -1;

hooks = fiber.hooks || ;

// 呼叫元件

component();

// 快取 hooks 的狀態

fiber.hooks = hooks;

本文由部落格一文多發平台 openwrite 發布!

React Hook基本使用

簡單說一下為什麼我會了解到hook api吧。之前寫react只會用class元件的方法,但是新專案使用到了hook,然後被迫學習這個api。為什麼要使用hook?根據官方文件介紹 hook是react16.8的新增特性。它可以讓你在不編寫class的情況下使用state以及其他的react特性。e...

EventBus上車指南

eventbus是針對安卓優化的 發布 訂閱事件匯流排 主要功能是替代intent,handler,broadcast在fragment,activity,service,執行緒之間傳遞訊息.優點是開銷小,更優雅。以及將傳送者和接收者解耦。1.同一元件內傳送和接收事件 activity中 2.事件傳...

React Hook 的簡單使用

1 什麼是react hook 2 為什麼要使用hook 3 使用usestate建立乙個點贊的小功能import react,from react const likebutton react.fc 點讚 button export default likebutton4 usereffect 的...