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