手寫React Redux(Hook實現)

2021-10-04 02:36:30 字數 2679 閱讀 6735

react-redux提供了兩個api

provide主要是將store分發傳遞下去,而我們在元件中需要去消費store時,可以使用connect將狀態和派發函式對映到元件中直接使用。

下面對這兩個api 實現 hook 版本。

const context = react.

createcontext()

export

const

provider=(

)=>

>

<

/context.provider>

)}

實質就是利用了react的context向下傳遞store,渲染包裹的children。

connect是乙個hoc工廠函式,對傳入的元件附加額外的props,再返回。通過兩個對映函式,將store中的狀態和派發動作函式繫結到元件的props。同時訂閱檢視的更新。

可以將功能拆分為:

const context = react.

createcontext()

export

const

connect=(

mapstatetoprops

= state => state,

mapdispatchtoprops =

)=> component => props =>

}// 4. 將action轉換為可執行的函式,其實就是在外麵包一層dispatch

function

bindactioncreators

(creators, dispatch)

for(

let key in creators)

return actionobj

}function

bindactioncreator

(creator, dispatch)

)return

(...args)

=>

dispatch

(creator

(...args))}

// 5. 最後我們還要坐下檢視的更新

useeffect((

)=>)}

)},[moreprops]

)// 1. 接受乙個元件,返回乙個新的元件,同時給該元件傳遞一些新的props

return

/>

}

準備測試環境;

// store還是用之前計數器的栗子

import store from

'./store/myreactreduxstore'

// 這裡引入我們自己寫的zreactredux

import

from

'./zreactredux'

reactdom.

render

(>

>

<

/provider>

, document.

getelementbyid

('root'))

;

import react,

from

'react'

// 這裡換成我們自己寫的zreactredux

import

from

'../zreactredux'

import

from

'../action/counteraction'

class

myreactreduxpage

extends

component

render()

=this

.props

return

(<

/p>

>加<

/button>

>非同步加<

/button>

>減<

/button>

<

/div>);

}}export

default

connect

( state =>()

,)(myreactreduxpage)

;

看過官方原始碼,我們發現其mapdispatchtoprops這個引數做了三種判斷

現在我們來實現一下這個判斷處理,先看下傳入乙個函式是怎麼用的

connect

( state =>()

,// 傳入物件,action函式

// 傳入乙個函式,其實也是返回派發函式的具體實現

dispatch =>()

, asyncadd:

(...args)

=>)}

,1000)}

}))(myreactreduxpage)

;

現在在 getmoreprops 中新增一些引數判斷邏輯

function

getmoreprops()

if(!mapdispatchtoprops)

}elseif(

typeof mapdispatchtoprops ===

'function'

)else

return

}

mysql手寫 mysql手寫

mysql手記 myisam innodb是mysql常用的儲存引擎 myisam不支援事務 也不支援外來鍵,但其訪問速度快,對事務完整性沒有要求。innodb儲存引擎提供了具有提交 回滾和崩潰恢復能力的事務安全。但是比起myisam儲存引擎,innodb寫的處理效率差一些並且會占用更多的 mysq...

前端手寫系列 手寫reduce函式

reduce函式常用於對陣列,reduce函式接受3個引數 被迭代的陣列 用於迭代計算的函式 迭代的初始值 注意點 如果沒有提供初始值時,會預設使用陣列的第乙個元素來作為初始值 function reduce arr,callback,initialval 如果沒有將initialval傳遞給該函式...

手寫數字識別

這幾天在想這做字元識別方面的程式,看了很多 但是發現 上的幾乎用處都不是特別的大,理論一大堆,但是用在程式裡面則很難實現,看到有些 上說用連碼法,但是連碼法對結構的變化太敏感了,但是也從一些 裡獲得了一些靈感,我採用的是網格匹配法,準備工作採集樣本,得到了樣本的網格資訊用於接下來的識別,當然也可 一...