摘要:年前公司由一個(gè)項(xiàng)目是使用來(lái)開(kāi)發(fā)的所以遇到了一些問(wèn)題比較影響開(kāi)發(fā)進(jìn)程的就是路由問(wèn)題了實(shí)際上就是這個(gè)組件比較難懂這里給大家講解一下希望大家少踩點(diǎn)坑另外本篇文章使用的是環(huán)境主要講解的還是如何使用記錄中路由的狀態(tài)但是會(huì)穿插一些小內(nèi)容這里雖然講到的是
年前公司由一個(gè)項(xiàng)目是使用 ReactNative 來(lái)開(kāi)發(fā)的所以遇到了一些問(wèn)題,比較影響開(kāi)發(fā)進(jìn)程的就是路由問(wèn)題了,實(shí)際上就是 ReactNavigation 這個(gè)組件比較難懂,這里給大家講解一下,希望大家少踩點(diǎn)坑.另外本篇文章使用的是 TypeScript環(huán)境
主要講解的還是 如何使用Mobx記錄ReactNative中路由的狀態(tài) 但是會(huì)穿插一些小內(nèi)容,這里雖然講到的是 Mobx , 如果你使用的是 redux 的話(huà)也不用灰心,原理都是一樣的,只要能看懂這篇文章,那我相信對(duì)于 ReactNavigation 有了更深的了解
ReactNavigation的官網(wǎng)上面有redux的教程API介紹
在開(kāi)發(fā)之前我先向大家介紹一下需要使用到的API
NavigationActions
getStateForAction
addNavigationHelpers
NavigationActions里面存在了很多方法,在這里我先講 NavigationActions.init(), 實(shí)際上是用來(lái)獲取 初始狀態(tài) 的路由信息,當(dāng)然你也可以不使用這個(gè)API,來(lái)自己手動(dòng)寫(xiě)出初始的路由狀態(tài),但是我不太推薦這個(gè)方法,第一個(gè)是路由擴(kuò)展的時(shí)候你又要去重新改,第二個(gè)是ReactNavigation這個(gè)庫(kù)的改動(dòng)很頻繁,說(shuō)不定哪一天就變了個(gè)格式,到時(shí)候你又要重寫(xiě)
getStateForAction(action, state) 提供一個(gè) action 和 上一次的路由狀態(tài) 從而獲取最新的路由狀態(tài)
addNavigationHelpers(navigation) 是記錄路由狀態(tài)的核心方法,如何理解呢?我們看到他的參數(shù)是 navigation 這是一個(gè)對(duì)象,我們這里只講其中的兩個(gè)值 state 和 dispatch,這里的 dispatch 和 redux的dispatch 的概念是相似的,在 ReactNavigation 里面每次路由的改變,他都會(huì)在里面觸發(fā) dispatch 并且傳遞一個(gè) action,有了action之后可以通過(guò)getStateForAction來(lái)獲取當(dāng)前路由的state.state則是保證當(dāng)前建立的路由信息和Mobx保存的路由信息的一致性
實(shí)現(xiàn)代碼import * as React from "react"; import * as stores from "@stores"; import Router from "./router";// 自己定義的路由結(jié)構(gòu) import { Provider } from "mobx-react/native"; import { addNavigationHelpers } from "react-navigation"; import { observer } from "mobx-react"; import { useStrict } from "mobx"; useStrict(true); console.disableYellowBox = true; interface Props {} interface State {} @observer export default class App extends React.Component{ constructor(props, context) { super(props, context); } render() { let { nav } = stores; return ( ); } }
// store import { observable, action, computed } from "mobx"; import { NavigationActions, NavigationState } from "react-navigation"; import RootRouter from "@router/index"; // 自己定義的路由結(jié)構(gòu) export class NavStore { @observable.ref navigatorState: NavigationState; constructor() { this.navigatorState = RootRouter.router.getStateForAction( NavigationActions.init(), null ); } // 提供一個(gè)獲取當(dāng)前路由層級(jí)的功能 private getRouterName(state) { let childRouters = state.routes; if (childRouters && childRouters.length > 0) { let curRouterName = childRouters[state.index].routeName; let nextRouterName = this.getRouterName(childRouters[state.index]); let result = nextRouterName ? "-" + nextRouterName : ""; return curRouterName + result; } return ""; } @computed get routerName() { return this.getRouterName(this.navigatorState); } @action dispatch(action) { const previousNavState = this.navigatorState; return (this.navigatorState = RootRouter.router.getStateForAction( action, previousNavState )); } } export default new NavStore();
大家對(duì) Mobx 不熟悉的話(huà)其實(shí)看我前面API的介紹就好了,核心就是addNavigationHelpers 提供了覆蓋 dispatch 和 同步state 的功能,只要理解了這個(gè),無(wú)論你使用 redux 還是 Mobx 都不是問(wèn)題
另外一些小問(wèn)題在開(kāi)發(fā) ReactNative 的時(shí)候可能在某個(gè)頁(yè)面需要跳轉(zhuǎn),這個(gè)時(shí)候你不得不把 navigation 從頭傳到底,這種體驗(yàn)很糟糕我更推薦使用一些 API 去 快速跳轉(zhuǎn) 或者 傳遞參數(shù)
import { NavigationActions } from "react-navigation"; // 使用我上面定義的dispatch // 簡(jiǎn)單跳轉(zhuǎn) dispatch( NavigationActions.navigate({ routeName: "Search" }) ); // 帶參數(shù)跳轉(zhuǎn) dispatch( NavigationActions.navigate({ routeName: "Search" , params : { name : "Jason "} }) ) // 多級(jí)跳轉(zhuǎn) dispatch( NavigationActions.navigate({ routeName: "Search", action : NavigationActions.navigate({ routeName: "User" }) }) );
這篇文章是年前的 ReactNavigation 文檔,剛剛上去又看了一下發(fā)現(xiàn)有些改動(dòng),我研究下有沒(méi)有需要改動(dòng)的地方,不過(guò)大致看了下,應(yīng)該沒(méi)啥變化
參考資料:
React Navigation 官方文檔
React Navigation with MobX (Paul Xue)【內(nèi)含Github地址】
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/92981.html
摘要:前端每周清單半年盤(pán)點(diǎn)之與篇前端每周清單專(zhuān)注前端領(lǐng)域內(nèi)容,以對(duì)外文資料的搜集為主,幫助開(kāi)發(fā)者了解一周前端熱點(diǎn)分為新聞熱點(diǎn)開(kāi)發(fā)教程工程實(shí)踐深度閱讀開(kāi)源項(xiàng)目巔峰人生等欄目。與求同存異近日,宣布將的構(gòu)建工具由遷移到,引發(fā)了很多開(kāi)發(fā)者的討論。 前端每周清單半年盤(pán)點(diǎn)之 React 與 ReactNative 篇 前端每周清單專(zhuān)注前端領(lǐng)域內(nèi)容,以對(duì)外文資料的搜集為主,幫助開(kāi)發(fā)者了解一周前端熱點(diǎn);分為...
摘要:希望大家在這浮夸的前端圈里,保持冷靜,堅(jiān)持每天花分鐘來(lái)學(xué)習(xí)與思考。 今天的React題沒(méi)有太多的故事…… 半個(gè)月前出了248個(gè)Vue的知識(shí)點(diǎn),受到很多朋友的關(guān)注,都強(qiáng)烈要求再出多些React相前的面試題,受到大家的邀請(qǐng),我又找了20多個(gè)React的使用者,他們給出了328道React的面試題,由我整理好發(fā)給大家,同時(shí)發(fā)布在了前端面試每日3+1的React專(zhuān)題,希望對(duì)大家有所幫助,同時(shí)大...
摘要:通過(guò)可以讓識(shí)別列表長(zhǎng)度變化自動(dòng)更新列表,利用維護(hù)項(xiàng)數(shù)據(jù)可以使每個(gè)項(xiàng)保持響應(yīng)式卻互不影響,對(duì)長(zhǎng)列表優(yōu)化效果很明顯。最好的方式是將數(shù)據(jù)統(tǒng)一放在中,子組件通過(guò)方式獲取數(shù)據(jù)。 MobX 是一款十分優(yōu)秀的狀態(tài)管理庫(kù),不但書(shū)寫(xiě)簡(jiǎn)潔還非常高效。當(dāng)然這是我在使用之后才體會(huì)到的,當(dāng)初試水上車(chē)的主要原因是響應(yīng)式,考慮到可能會(huì)更符合 Vue 過(guò)來(lái)的思考方式。然而其實(shí)兩者除了響應(yīng)式以外并沒(méi)有什么相似之處。 在...
摘要:在這里可以處理一些傳過(guò)來(lái)的參數(shù),然后我們將參數(shù)放入類(lèi)中實(shí)例化。因?yàn)殡m然是一個(gè),但是實(shí)例化的時(shí)候是兩個(gè)不同的,所以第一個(gè)頁(yè)面的數(shù)據(jù)變化了也不會(huì)影響到這里。說(shuō)明 目前增加了路由跳轉(zhuǎn),可以帶參數(shù)跳轉(zhuǎn)頁(yè)面。下拉可以自定義刷新樣式,IOS點(diǎn)擊Status Bar回到頂部,目前已經(jīng)測(cè)試過(guò)。狀態(tài)管理器使用Mobx,我自己覺(jué)得對(duì)于Redux使用起來(lái)會(huì)復(fù)雜一點(diǎn),下面是提供的預(yù)覽GIF圖,卡頓現(xiàn)象是因?yàn)槠聊讳浿?..
摘要:它是由一個(gè)非常聰明的人開(kāi)發(fā)的,用來(lái)緩解在單頁(yè)面應(yīng)用中管理狀態(tài)的問(wèn)題。的問(wèn)題沒(méi)有一種適合所有場(chǎng)景的完美工具。為設(shè)計(jì)的是世界的另一個(gè)新增內(nèi)容,但目前僅適用于。這將導(dǎo)致最后期限延長(zhǎng),并且留下更多需要我們維護(hù)的代碼。 原文:The Problems with Redux: Can React, MobX, and Realm save us? 作者:Erich Reich 首先,我不討厭 ...
閱讀 1222·2021-11-22 13:54
閱讀 2462·2021-09-22 15:36
閱讀 2766·2019-08-30 15:54
閱讀 834·2019-08-30 15:53
閱讀 3195·2019-08-30 15:53
閱讀 541·2019-08-29 15:21
閱讀 2897·2019-08-28 18:28
閱讀 3045·2019-08-26 13:37