react-navigation 如何判斷用戶是否登錄跳轉(zhuǎn)到登錄頁的方法
本文介紹了react-navigation 如何判斷用戶是否登錄跳轉(zhuǎn)到登錄頁的方法,分享給大家,也給自己留個筆記,具體如下:
新建一個index.js
import React, {Component} from 'react';
import {AppRegistry, Text, View, Button,Image,StyleSheet,BackHandler,ToastAndroid} from 'react-native';
import { StackNavigator,TabNavigator,NavigationActions } from 'react-navigation';
//全局存儲
import stroage from './StorageUtil';
import './Global'
import IndexScreen from './Index'
import MeScreen from './Me'
import Login from './Login'
//底部菜單欄設(shè)置
const MainScreenNavigator = TabNavigator({
IndexScreen: {
screen: IndexScreen,
navigationOptions: {
tabBarLabel: '首頁',
headerLeft:null,//去除返回按鈕
tabBarIcon: ({ tintColor }) => (
<Image
source={require('./img/ic_image.png')}
style={[styles.icon, {tintColor: tintColor}]}
/>
),
onNavigationStateChange:(()=> alert("首頁"))
// initialRouteName:'IndexScreen'
},
},
MeScreen: {
screen: MeScreen,
navigationOptions: {
tabBarLabel:'我的',
tabBarIcon: ({ tintColor }) => (
<Image
source={require('./img/ic_me.png')}
style={[styles.icon, {tintColor: tintColor}]}
/>
),
// initialRouteName:'MeScreen'
}
}
},
{
// trueinitialRouteName:'MeScreen',//設(shè)置默認(rèn)的頁面組件
// initialRouteName:'MeScreen',
lazy:true,//是否根據(jù)需要懶惰呈現(xiàn)標(biāo)簽,而不是提前,意思是在app打開的時候?qū)⒌撞繕?biāo)簽欄全部加載,默認(rèn)false,推薦為true
// order: ['IndexScreen','FindScreen','ListNewScreen','MeScreen'], //order 來定義tab顯示的順序,數(shù)組形式
animationEnabled: false, // 切換頁面時是否有動畫效果
tabBarPosition: 'bottom', // 顯示在底端,android 默認(rèn)是顯示在頁面頂端的
swipeEnabled: false, // 是否可以左右滑動切換tab
// backBehavior: 'none', // 按 back 鍵是否跳轉(zhuǎn)到第一個Tab(首頁), none 為不跳轉(zhuǎn)
tabBarOptions: {
activeTintColor: '#2196f3', // 文字和圖片選中顏色
inactiveTintColor: '#999', // 文字和圖片未選中顏色
showIcon: true, // android 默認(rèn)不顯示 icon, 需要設(shè)置為 true 才會顯示
indicatorStyle: {
height: 0 // 如TabBar下面顯示有一條線,可以設(shè)高度為0后隱藏
},
style: {
backgroundColor: '#fff', // TabBar 背景色
height: 60
},
labelStyle: {
fontSize: 14, // 文字大小
marginTop:2
// lineHeight:44
},
}
});
//跳轉(zhuǎn)路由設(shè)置
const FirstApp = StackNavigator({
IndexScreen: {
screen: MainScreenNavigator,
// initialRouteName: 'IndexScreen'
},
MeScreen: {screen: MeScreen},
Login:{screen: Login},
}, {
initialRouteName: 'IndexScreen', // 默認(rèn)顯示界面
navigationOptions: { // 屏幕導(dǎo)航的默認(rèn)選項(xiàng), 也可以在組件內(nèi)用 static navigationOptions 設(shè)置(會覆蓋此處的設(shè)置)
headerStyle:{elevation: 0,shadowOpacity: 0,height:48,backgroundColor:"#2196f3"},
headerTitleStyle:{color:'#fff',fontSize:16}, //alignSelf:'center' 文字居中
headerBackTitleStyle:{color:'#fff',fontSize:12},
// headerTintColor:{},
gesturesEnabled:true,//是否支持滑動返回收拾,iOS默認(rèn)支持,安卓默認(rèn)關(guān)閉
},
mode: 'card', // 頁面切換模式, 左右是card(相當(dāng)于iOS中的push效果), 上下是modal(相當(dāng)于iOS中的modal效果)
headerMode: 'screen', // 導(dǎo)航欄的顯示模式, screen: 有漸變透明效果, float: 無透明效果, none: 隱藏導(dǎo)航欄
onTransitionStart: (Start)=>{console.log('導(dǎo)航欄切換開始');}, // 回調(diào)
onTransitionEnd: ()=>{ console.log('導(dǎo)航欄切換結(jié)束'); } // 回調(diào)
});
//
const defaultGetStateForAction = FirstApp.router.getStateForAction;
FirstApp.router.getStateForAction = (action, state) => {
//頁面是MeScreen并且 global.user.loginState = false || ''(未登錄)
if (action.routeName ==='MeScreen'&& !global.user.loginState) {
this.routes = [
...state.routes,
{key: 'id-'+Date.now(), routeName: 'Login', params: { name: 'name1'}},
];
return {
...state,
routes,
index: this.routes.length - 1,
};
}
return defaultGetStateForAction(action, state);
};
export default class FirstAppDemo extends Component {
render() {
return (
<FirstApp />
);
}
}
AppRegistry.registerComponent('FirstApp', () => FirstAppDemo);
const styles = StyleSheet.create({
icon: {
width: 26,
height: 26,
},
});
新建一個全局存儲StorageUtil.js
import React, {Component} from 'react';
import {AsyncStorage} from 'react-native';
import Storage from 'react-native-storage';
var storage = new Storage({
// 最大容量,默認(rèn)值1000條數(shù)據(jù)循環(huán)存儲
size: 1000,
// 存儲引擎:對于RN使用AsyncStorage,對于web使用window.localStorage
// 如果不指定則數(shù)據(jù)只會保存在內(nèi)存中,重啟后即丟失
storageBackend: AsyncStorage,
// 數(shù)據(jù)過期時間,默認(rèn)一整天(1000 * 3600 * 24 毫秒),設(shè)為null則永不過期
defaultExpires: 1000 * 3600 * 24,
// 讀寫時在內(nèi)存中緩存數(shù)據(jù)。默認(rèn)啟用。
enableCache: true,
// 如果storage中沒有相應(yīng)數(shù)據(jù),或數(shù)據(jù)已過期,
// 則會調(diào)用相應(yīng)的sync方法,無縫返回最新數(shù)據(jù)。
// sync方法的具體說明會在后文提到
// 你可以在構(gòu)造函數(shù)這里就寫好sync的方法
// 或是寫到另一個文件里,這里require引入
// 或是在任何時候,直接對storage.sync進(jìn)行賦值修改
//sync: require('./sync') // 這個sync文件是要你自己寫的
})
// 最好在全局范圍內(nèi)創(chuàng)建一個(且只有一個)storage實(shí)例,方便直接調(diào)用
// 對于web
// window.storage = storage;
// 對于react native
// global.storage = storage;
// 這樣,在此**之后**的任意位置即可以直接調(diào)用storage
// 注意:全局變量一定是先聲明,后使用
// 如果你在某處調(diào)用storage報錯未定義
// 請檢查global.storage = storage語句是否確實(shí)已經(jīng)執(zhí)行過了
//導(dǎo)出為全局變量
global.storage = storage;
新建一個全局變量組件Global.js,用戶存儲用戶登錄的信息
//用戶登錄數(shù)據(jù)
global.user = {
loginState:'',//登錄狀態(tài)
userData:'',//用戶數(shù)據(jù)
};
//刷新的時候重新獲得用戶數(shù)據(jù)
storage.load({
key: 'loginState',
}).then(ret => {
global.user.loginState = true;
global.user.userData = ret;
}).catch(err => {
global.user.loginState = false;
global.user.userData = '';
})
登錄組件 Login.js
_login() {//登錄函數(shù)
// debugger;
ToastUtil.show("登錄成功");
// 使用key來保存數(shù)據(jù)。這些數(shù)據(jù)一般是全局獨(dú)有的,常常需要調(diào)用的。
// 除非你手動移除,這些數(shù)據(jù)會被永久保存,而且默認(rèn)不會過期。
storage.save({
key: 'loginState', // 注意:請不要在key中使用_下劃線符號!
data: {
userid: '1001',
userName:'userName',
token: 'token'
},
// 如果不指定過期時間,則會使用defaultExpires參數(shù)
// 如果設(shè)為null,則永不過期
// 8個小時后過期
expires: 1000 * 3600 * 8
});
global.user.loginState = true;//設(shè)置登錄狀態(tài)
global.user.userData = { userid: '1001', userName:'userName', token: 'token'};//保存用戶數(shù)據(jù)
setTimeout(()=>{
this.props.navigation.navigate('UserScreen')//跳轉(zhuǎn)到用戶頁面
},2000)
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
react antd-mobile ActionSheet+tag實(shí)現(xiàn)多選方式
這篇文章主要介紹了react antd-mobile ActionSheet+tag實(shí)現(xiàn)多選方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10
解決React報錯No duplicate props allowed
這篇文章主要為大家介紹了React報錯No duplicate props allowed解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
React Native基礎(chǔ)入門之初步使用Flexbox布局
React中引入了flexbox概念,flexbox是屬于web前端領(lǐng)域CSS的一種布局方案,下面這篇文章主要給大家介紹了關(guān)于React Native基礎(chǔ)入門之初步使用Flexbox布局的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-07-07
基于Cloud?Studio構(gòu)建React完成點(diǎn)餐H5頁面(騰訊云?Cloud?Studio?實(shí)戰(zhàn)訓(xùn)練營)
最近也是有機(jī)會參與到了騰訊云舉辦的騰訊云Cloud Studio實(shí)戰(zhàn)訓(xùn)練營,借此了解了騰訊云Cloud?Studio產(chǎn)品,下面就來使用騰訊云Cloud?Studio做一個實(shí)戰(zhàn)案例來深入了解該產(chǎn)品的優(yōu)越性吧,感興趣的朋友跟隨小編一起看看吧2023-08-08
React-Hooks之useImperativeHandler使用介紹
這篇文章主要為大家介紹了React-Hooks之useImperativeHandler使用介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
React?Native實(shí)現(xiàn)Toast輕提示和loading效果
這篇文章主要介紹了React Native實(shí)現(xiàn)Toast輕提示和loading效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-09-09
react使用節(jié)流函數(shù)防止重復(fù)點(diǎn)擊問題
這篇文章主要介紹了react使用節(jié)流函數(shù)防止重復(fù)點(diǎn)擊問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06
React文件名和目錄規(guī)范最佳實(shí)踐記錄(總結(jié)篇)
React在使用時非常靈活,如果沒有一個規(guī)范約束項(xiàng)目,在開發(fā)過程中會非?;靵y,本文將介紹幾個優(yōu)秀的規(guī)范,介紹文件名和目錄前,需要先簡述一下幾種通用的類型,用來區(qū)分文件的功能,感興趣的朋友一起看看吧2022-05-05

