摘要:高階函數(shù)驗(yàn)證中間件驗(yàn)證驗(yàn)證之所以用三種方式一起是因?yàn)楦唠A函數(shù)在性能調(diào)優(yōu)的時(shí)候并不是特別容易??偨Y(jié)高階函數(shù)適合用在子控件需要確定權(quán)限后渲染中間件適合無(wú)狀態(tài)頁(yè)面中的登錄狀態(tài)判斷驗(yàn)證,使用范圍就比較狹窄了。
最近一直在寫(xiě)一個(gè)React、Redux的前端項(xiàng)目,登錄狀態(tài)驗(yàn)證這一塊還是比較頭疼的。
我的實(shí)踐下有三種方式來(lái)驗(yàn)證用戶登錄狀態(tài),目前我選擇用三種方式一起用在項(xiàng)目里面。
Redux高階函數(shù)驗(yàn)證(High-Order Function)
Actions中間件驗(yàn)證
Component WillMount 驗(yàn)證
之所以用三種方式一起是因?yàn)?strong>Redux高階函數(shù)在性能調(diào)優(yōu)的時(shí)候并不是特別容易。
Redux高階函數(shù)驗(yàn)證//把需要登錄狀態(tài)驗(yàn)證的Component傳入到這個(gè)高階函數(shù)中 export function requireAuthentication(Component) { class AuthenticatedComponent extends Component { constructor(props) { super(props) } //只在首次Mount時(shí)來(lái)驗(yàn)證權(quán)限 componentWillMount() { this.checkAuth(); } checkAuth(){ const {path,isSignIn,dispatch}=this.props; if(!isSignIn){ //沒(méi)有登錄 //記錄當(dāng)前頁(yè)面path //跳轉(zhuǎn)到SignIn Page處理登錄 登錄完成夠會(huì)跳回當(dāng)前頁(yè)面 dispatch(CommonActions.setNextUrl(path)) browserHistory.push("/sign"); } } render() { console.log("auth render") return ({this.props.isSignIn == true ?) } } const mapStateToProps = (state) => ({ path:state.routing.locationBeforeTransitions.pathname, isSignIn:state.common.isSignIn, state:state }) return connect(mapStateToProps)(AuthenticatedComponent); }: null }
你可以把它像這樣用在router中:
{ path:"courseCate",component:requireAuthentication(CourseCate)}
目前存在的一些問(wèn)題:
高階函數(shù)中傳入的最頂層的Component不能再使用connect
過(guò)多的高階函數(shù)生命周期的邏輯難以維護(hù)、性能隱患
Actions中間件驗(yàn)證export function checkAuth(nextUrl,nextFn) { return (dispatch,getState)=>{ //檢測(cè)用戶登錄情況 if(!getState().common.isSignIn){ //沒(méi)有登錄 記錄當(dāng)前path //跳轉(zhuǎn)到sign page 登錄完成后 跳轉(zhuǎn)回來(lái) dispatch(setNextUrl(nextUrl)); pushUrl("/sign");//封裝了 browserHistory.push(url) }else{ //通過(guò)驗(yàn)證后 執(zhí)行下一個(gè)Fn dispatch(nextFn); } } }
你可以像這樣用在你的Actions中
export function fetchFoo(url,conf) { return (dispatch,getState) => { if(shouldFetchFoo(getState())){ dispatch(requestFetchFoo()); return fetch(url,conf) .then(res=>res.json()) .then(json=>{ ... }) } } } export function needFetchFoo(nextUrl,url,conf){ retrun (dispatch)=>{ dispatch(checkAuth(nextUrl,fetchFoo(url,conf))) } }
目前存在的一些問(wèn)題:
雖然可以避免過(guò)多的高階函數(shù)函數(shù)導(dǎo)致頁(yè)面性能下降,但是無(wú)法很好滿足業(yè)務(wù)邏輯
驗(yàn)證如果未通過(guò)直接阻斷當(dāng)前操作
Component WillMount 驗(yàn)證這基本上可以認(rèn)為是Actions中間驗(yàn)證的一種變種
export function checkAuthWithoutNextFn(nextUrl) { return (dispatch,getState)=>{ //check if user sign in if(!getState().common.isSignIn){ //if not set the nexturl //and push url to sign page dispatch(setNextUrl(nextUrl)); pushUrl("/sign"); } } }
你可以像這樣把他用在Component WillMount事件中
componentWillMount(){ const {dispatch} = this.props; dispatch(CommonActions.checkAuthWithoutNextFn("/coursecate")); }
目前存在的一些問(wèn)題:
權(quán)限未得到驗(yàn)證時(shí),不會(huì)阻斷子控件渲染,觸發(fā)子控件生命周期中的事件
舉個(gè)例子:
比如父控件中componetWillDidMount中調(diào)用該方法判斷用戶登錄狀態(tài)
fatherComponet.js
componentWillMount(){ const {dispatch} = this.props; dispatch(CommonActions.checkAuthWithoutNextFn("/coursecate")); }
然而子控件componentWillMount中有一個(gè)fetch是需要權(quán)限驗(yàn)證(此時(shí)父控件中并沒(méi)有阻斷子控件渲染,在父控件正在驗(yàn)證權(quán)限的同時(shí),子控件的fetch執(zhí)行了。高階函數(shù)可以阻斷子控件渲染)的。
雖然渲染順序是fatherComponet->childComponet
但是childComponet里的componentWillMount也是觸發(fā)了(也就是說(shuō),在未驗(yàn)證登錄情況下就觸發(fā)了fetch),可能會(huì)造成一些不必要的請(qǐng)求。
我目前的處理方式:在子控件ComponentWillMount的fetch中加入一個(gè)shouldFetch()進(jìn)行請(qǐng)求前判斷。
1.高階函數(shù)適合用在:子控件需要確定權(quán)限后渲染
2.actions中間件適合:無(wú)狀態(tài)頁(yè)面中的登錄狀態(tài)判斷
3.component驗(yàn)證,使用范圍就比較狹窄了。
大家雨露均沾
以上是我個(gè)人目前的一些小見(jiàn)解,歡迎各位指正和補(bǔ)充哈。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/86374.html
摘要:其實(shí),該復(fù)雜的東西在哪放都復(fù)雜,只不過(guò)現(xiàn)在更清晰一點(diǎn)使用不好的地方就是太繁瑣了,定義各種各種組件。。。。。 之前做了個(gè)好電影搜集的小應(yīng)用,前端采用react,后端采用express+mongodb,最近又將組件間的狀態(tài)管理改成了redux,并加入了redux-saga來(lái)管理異步操作,記錄一些總結(jié) 在線地址 手機(jī)模式 源碼 主要功能 爬取豆瓣電影信息并錄入MongoDB 電影列表展示...
摘要:這里引出了一個(gè)概念,就是數(shù)據(jù)流這個(gè)概念,在項(xiàng)目中我將所有數(shù)據(jù)的操作都成為數(shù)據(jù)的流動(dòng)。 最近重構(gòu)了一個(gè)項(xiàng)目,一個(gè)基于redux模型的react-native項(xiàng)目,目標(biāo)是在混亂的代碼中梳理出一個(gè)清晰的結(jié)構(gòu)來(lái),為了實(shí)現(xiàn)這個(gè)目標(biāo),首先需要對(duì)項(xiàng)目的結(jié)構(gòu)做分層處理,將各個(gè)邏輯分離出來(lái),這里我是基于典型的MVC模型,那么為了將現(xiàn)有代碼重構(gòu)為理想的模型,我需要做以下幾步: 拆分組件 邏輯處理 抽象、...
摘要:之前做的一個(gè)應(yīng)用,最近把首頁(yè)改成了服務(wù)端渲染的形式,過(guò)程還是很周折的,踩到了不少坑,記錄一些重點(diǎn),希望有所幫助前端使用的技術(shù)棧升級(jí)到升級(jí)到服務(wù)項(xiàng)目地址喜歡的給個(gè),感謝。。。。。。。 之前react做的一個(gè)應(yīng)用,最近把首頁(yè)改成了服務(wù)端渲染的形式,過(guò)程還是很周折的,踩到了不少坑,記錄一些重點(diǎn),希望有所幫助 前端使用的技術(shù)棧 react、react-dom 升級(jí)到 v16 react-ro...
摘要:利用中間件實(shí)現(xiàn)異步請(qǐng)求,實(shí)現(xiàn)兩個(gè)用戶角色實(shí)時(shí)通信。目前還未深入了解的一些概念。往后會(huì)寫(xiě)更多的前后臺(tái)聯(lián)通的項(xiàng)目。刪除分組會(huì)連同組內(nèi)的所有圖片一起刪除。算是對(duì)自己上次用寫(xiě)后臺(tái)的一個(gè)強(qiáng)化,項(xiàng)目文章在這里。后來(lái)一直沒(méi)動(dòng),前些日子才把后續(xù)的完善。 歡迎訪問(wèn)我的個(gè)人網(wǎng)站:http://www.neroht.com/? 剛學(xué)vue和react時(shí),利用業(yè)余時(shí)間寫(xiě)的關(guān)于這兩個(gè)框架的訓(xùn)練,都相對(duì)簡(jiǎn)單,有的...
閱讀 3406·2021-11-25 09:43
閱讀 3464·2021-11-19 09:40
閱讀 2464·2021-10-14 09:48
閱讀 1283·2021-09-09 11:39
閱讀 1920·2019-08-30 15:54
閱讀 2821·2019-08-30 15:44
閱讀 1994·2019-08-29 13:12
閱讀 1543·2019-08-29 12:59