摘要:動(dòng)手實(shí)現(xiàn)實(shí)現(xiàn)這個(gè)模塊直接創(chuàng)建的函數(shù)考慮到要暴露出去的三個(gè)函數(shù)我們用函數(shù)內(nèi)部的變量來(lái)存儲(chǔ)我們的數(shù)據(jù)時(shí)候直接返回當(dāng)前的值就可以了同樣用內(nèi)部變量來(lái)存儲(chǔ)訂閱者訂閱者則由函數(shù)添加返回取消訂閱的函數(shù)。則根據(jù)返回新的同時(shí)通知訂閱者執(zhí)行相關(guān)邏輯。
文章地址
實(shí)例回顧假如按鈕和界面不在同一組件, 經(jīng)常用 redux 去實(shí)現(xiàn)上面功能, 可以想象到如下代碼
... const Test = ({ colorTheme, authorName }) =>Hello World - { authorName }const mapStateToProps = state => ({ colorTheme: state.colorTheme, authorName: state.authorName }) ...
用過(guò) mapStateToProps 從頂層拿到屬性然后展示, 在另一個(gè)組建通過(guò) mapDispatchToProps 去觸發(fā) action 改變 state, 那么我們?nèi)绾巫约簩?shí)現(xiàn) redux 的功能呢
redux 屬性分析關(guān)于我們常用到的內(nèi)容, 首先我們要考慮 createStore 方法, 使得可以創(chuàng)建出來(lái)我們后面要用到的 store , 可以接受 action 去處理改變 state, 并且去觸發(fā)其他事件,比如組建渲染。 Provider 組建,可以傳入一個(gè) store 向下分發(fā)我們的 store,使得子組建可以獲取到我們 store 內(nèi)的屬性和方法。一個(gè) connect 方法,使得子組建可以獲取到 store 里面的內(nèi)容, 并根據(jù) state 改變及時(shí)刷新渲染。
動(dòng)手實(shí)現(xiàn) redux 實(shí)現(xiàn) createStoreexport default reducer => { let state = null let listeners = [] const subscribe = listener => { listeners.push(listener) return () => { listeners = listeners.filter(d => d !== listener) } } const getState = () => state const dispatch = action => { state = reducer(state, action) listeners.forEach(listener => listener()) } dispatch() return { getState, dispatch, subscribe } }
這個(gè)模塊直接 export 創(chuàng)建 store 的函數(shù),考慮到要暴露出去的三個(gè)函數(shù), 我們用函數(shù)內(nèi)部的變量 state 來(lái)存儲(chǔ)我們的數(shù)據(jù), getState 時(shí)候直接返回當(dāng)前的值就可以了, 同樣用內(nèi)部變量 listeners 來(lái)存儲(chǔ)訂閱者, 訂閱者則由 dispatch 函數(shù)添加, 返回取消訂閱的函數(shù)。 dispatch 則根據(jù) action 返回新的 state 同時(shí)通知訂閱者執(zhí)行相關(guān)邏輯。最后返回包含這三個(gè)函數(shù)的對(duì)象。改對(duì)象接受 reducer 作為參數(shù), 內(nèi)部執(zhí)行一次 dispatch 則是為了初始化 state
實(shí)現(xiàn) reducerconst initState = { ... } export default (state, action) => { if (!state) return initState switch (action.type) { ... } }
關(guān)于 reducer 則簡(jiǎn)單的實(shí)現(xiàn)了根據(jù)不同的 action, 返回不同的 state, 只是剛開(kāi)始判斷了如果沒(méi)有 state, 即初始化時(shí)候返回設(shè)置好的初始化值。
實(shí)現(xiàn) Providerclass Provider extends Component { getChildContext () { return { store: this.props.store } } ... }
這里必須提一下 react 的 context 這個(gè)屬性, 可以讓我們不通過(guò) props 去獲取到上層組建的屬性, 不過(guò)關(guān)于寫(xiě)法卻有一些特殊的規(guī)定而且在后面的版本可能被移除, 具體信息可以參考Context. 我們用 context 把創(chuàng)建的 store 存入頂層組建中, 這樣就可以在后序組建中去獲取到相關(guān)內(nèi)容了。
實(shí)現(xiàn)connectconst connect = (mapStateToProps, mapDispatchToProps) => (WrappedComponent) => { class InnerComponent extends Component{ constructor (props, context) { super(props) const { getState, dispatch, subscribe } = context.store this.state = { ...props, ...mapStateToProps(getState()), ...mapDispatchToProps(dispatch) } subscribe(() => this._updateStore()) } _updateStore = () => { const { getState, dispatch } = this.context.store const allProps = { ...this.props, ...mapStateToProps(getState()), ...mapDispatchToProps(dispatch) } this.setState({ ...allProps }) } render () { return () } } InnerComponent.contextTypes = { store: PropTypes.object } return InnerComponent }
高階組件這個(gè)概念我們?cè)诠倬W(wǎng)上也可以看的到 Higher-Order Components, 簡(jiǎn)單理解就是傳入一個(gè)組件返回一個(gè)新的組件, 它內(nèi)部做什么事情則有你自己定義, 我們這里實(shí)現(xiàn) connect, 則也算是高階函數(shù)返回一個(gè)高階組件, 接受兩個(gè)函數(shù)作為參數(shù), mapStateToProps 和 mapDispatchToProps 看形參的名字就很熟悉, 我們分別傳入當(dāng)前的 state 和 dispatch 函數(shù), 得到的返回值則通過(guò) props 傳遞給入?yún)⒑瘮?shù), 內(nèi)部函數(shù)則通過(guò) context 獲取到頂部的 store, 同時(shí)用 subscribe
添加訂閱者每次更新 state 時(shí)候則重新渲染當(dāng)前組件。
至此我們的簡(jiǎn)易得邏輯已經(jīng)實(shí)現(xiàn), 代碼github上有【reacts-ggsddu】, 大家可以下載本地運(yùn)行感受一下
參考React.js 小書(shū)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/89365.html
摘要:原文地址的主要集中在函數(shù)返回值中,以下這個(gè)迷你的只簡(jiǎn)單實(shí)現(xiàn)方法,如下測(cè)試代碼運(yùn)行結(jié)果 原文地址:https://github.com/huruji/blog/issues/1 redux的主要API集中在createStore函數(shù)返回值中,以下這個(gè)迷你的redux只簡(jiǎn)單實(shí)現(xiàn)createStore、dispatch、subscribe、getState方法,如下: const creat...
摘要:因?yàn)楣ぷ髦幸恢痹谑褂茫惨恢币詠?lái)想總結(jié)一下自己關(guān)于的一些知識(shí)經(jīng)驗(yàn)。于是把一些想法慢慢整理書(shū)寫(xiě)下來(lái),做成一本開(kāi)源免費(fèi)專業(yè)簡(jiǎn)單的入門(mén)級(jí)別的小書(shū),提供給社區(qū)。本書(shū)的后續(xù)可能會(huì)做成視頻版本,敬請(qǐng)期待。本作品采用署名禁止演繹國(guó)際許可協(xié)議進(jìn)行許可 React.js 小書(shū) 本文作者:胡子大哈本文原文:React.js 小書(shū) 轉(zhuǎn)載請(qǐng)注明出處,保留原文鏈接以及作者信息 在線閱讀:http://huzi...
摘要:作用是給組件增減屬性。如果你的高階組件不需要帶參數(shù),這樣寫(xiě)也是很的。那么需要建立一個(gè)引用可以對(duì)被裝飾的組件做羞羞的事情了,注意在多個(gè)高階組件裝飾同一個(gè)組件的情況下,此法并不奏效。你拿到的是上一個(gè)高階組件的函數(shù)中臨時(shí)生成的組件。 是什么 簡(jiǎn)稱HOC,全稱 High Order Component。作用是給react組件增減props屬性。 怎么用 為什么不先說(shuō)怎么寫(xiě)?恩,因?yàn)槟闫鋵?shí)已經(jīng)用...
摘要:接下來(lái)我們來(lái)看看源碼中的模塊是怎么應(yīng)用中間件的。如何實(shí)現(xiàn)中間件操作的。新的會(huì)從第一個(gè)中間件開(kāi)始觸發(fā),這樣,在我們調(diào)用的時(shí)候,就會(huì)將中間件走一遍了。函數(shù)如果存在多個(gè)中間件,直接使用方法將各個(gè)中間件嵌套起來(lái)。 從redux-thunk引出思考 在使用redux-thunk進(jìn)行異步action書(shū)寫(xiě)的時(shí)候,我經(jīng)常好奇redux到底如何運(yùn)作,讓asyncAction成為可能 為了探究,我們必須看...
摘要:封裝手寫(xiě)的方筆記使用檢測(cè)文件前端掘金副標(biāo)題可以做什么以及使用中會(huì)遇到的坑。目的是幫助人們用純中文指南實(shí)現(xiàn)復(fù)選框中多選功能前端掘金作者緝熙簡(jiǎn)介是推出的一個(gè)天挑戰(zhàn)。 深入理解 JavaScript Errors 和 Stack Traces - 前端 - 掘金譯者注:本文作者是著名 JavaScript BDD 測(cè)試框架 Chai.js 源碼貢獻(xiàn)者之一,Chai.js 中會(huì)遇到很多異常處理...
閱讀 3245·2021-09-22 16:06
閱讀 3236·2021-09-02 15:40
閱讀 632·2019-08-30 15:54
閱讀 1035·2019-08-26 12:22
閱讀 1375·2019-08-26 12:17
閱讀 2742·2019-08-26 12:09
閱讀 502·2019-08-26 10:20
閱讀 783·2019-08-23 16:28