react-navigation 如何判断用户是否登录跳转到登录页的方法

本文介绍了react-navigation 如何判断用户是否登录跳转到登录页的方法,分享给大家,也给自己留个笔记,具体如下:

新建一个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' 

//底部菜单栏设置
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',//设置默认的页面组件
    // initialRouteName:'MeScreen',
    lazy:true,//是否根据需要懒惰呈现标签,而不是提前,意思是在app打开的时候将底部标签栏全部加载,默认false,推荐为true
    // order: ['IndexScreen','FindScreen','ListNewScreen','MeScreen'], //order 来定义tab显示的顺序,数组形式
    animationEnabled: false, // 切换页面时是否有动画效果
    tabBarPosition: 'bottom', // 显示在底端,android 默认是显示在页面顶端的
    swipeEnabled: false, // 是否可以左右滑动切换tab
    // backBehavior: 'none', // 按 back 键是否跳转到第一个Tab(首页), none 为不跳转
    tabBarOptions: {
      activeTintColor: '#2196f3', // 文字和图片选中颜色
      inactiveTintColor: '#999', // 文字和图片未选中颜色
      showIcon: true, // android 默认不显示 icon, 需要设置为 true 才会显示
      indicatorStyle: {
        height: 0 // 如TabBar下面显示有一条线,可以设高度为0后隐藏
      },
      style: {
        backgroundColor: '#fff', // TabBar 背景色
        height: 60
      },
      labelStyle: {
        fontSize: 14, // 文字大小
        marginTop:2
        // lineHeight:44
      },
    }
  }); 

//跳转路由设置
const FirstApp = StackNavigator({
  IndexScreen: {
    screen: MainScreenNavigator,
    // initialRouteName: 'IndexScreen'
  },
  MeScreen: {screen: MeScreen},
  Login:{screen: Login}, 

}, {
  initialRouteName: 'IndexScreen', // 默认显示界面
  navigationOptions: { // 屏幕导航的默认选项, 也可以在组件内用 static navigationOptions 设置(会覆盖此处的设置)
    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默认支持,安卓默认关闭
  },
  mode: 'card', // 页面切换模式, 左右是card(相当于iOS中的push效果), 上下是modal(相当于iOS中的modal效果)
  headerMode: 'screen', // 导航栏的显示模式, screen: 有渐变透明效果, float: 无透明效果, none: 隐藏导航栏
  onTransitionStart: (Start)=>{console.log('导航栏切换开始');}, // 回调
  onTransitionEnd: ()=>{ console.log('导航栏切换结束'); } // 回调
});
//
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({
  // 最大容量,默认值1000条数据循环存储
  size: 1000, 

  // 存储引擎:对于RN使用AsyncStorage,对于web使用window.localStorage
  // 如果不指定则数据只会保存在内存中,重启后即丢失
  storageBackend: AsyncStorage, 

  // 数据过期时间,默认一整天(1000 * 3600 * 24 毫秒),设为null则永不过期
  defaultExpires: 1000 * 3600 * 24, 

  // 读写时在内存中缓存数据。默认启用。
  enableCache: true, 

  // 如果storage中没有相应数据,或数据已过期,
  // 则会调用相应的sync方法,无缝返回最新数据。
  // sync方法的具体说明会在后文提到
  // 你可以在构造函数这里就写好sync的方法
  // 或是写到另一个文件里,这里require引入
  // 或是在任何时候,直接对storage.sync进行赋值修改
  //sync: require('./sync') // 这个sync文件是要你自己写的
}) 

// 最好在全局范围内创建一个(且只有一个)storage实例,方便直接调用 

// 对于web
// window.storage = storage; 

// 对于react native
// global.storage = storage; 

// 这样,在此**之后**的任意位置即可以直接调用storage
// 注意:全局变量一定是先声明,后使用
// 如果你在某处调用storage报错未定义
// 请检查global.storage = storage语句是否确实已经执行过了 

//导出为全局变量
global.storage = storage; 

新建一个全局变量组件Global.js,用户存储用户登录的信息

//用户登录数据
global.user = {
  loginState:'',//登录状态
  userData:'',//用户数据
};
//刷新的时候重新获得用户数据
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() {//登录函数
    // debugger;
    ToastUtil.show("登录成功");
    // 使用key来保存数据。这些数据一般是全局独有的,常常需要调用的。
    // 除非你手动移除,这些数据会被永久保存,而且默认不会过期。
    storage.save({
      key: 'loginState', // 注意:请不要在key中使用_下划线符号!
      data: {
        userid: '1001',
        userName:'userName',
        token: 'token'
      }, 

      // 如果不指定过期时间,则会使用defaultExpires参数
      // 如果设为null,则永不过期
      // 8个小时后过期
      expires: 1000 * 3600 * 8
    });
    global.user.loginState = true;//设置登录状态
    global.user.userData = { userid: '1001', userName:'userName', token: 'token'};//保存用户数据 

    setTimeout(()=>{
      this.props.navigation.navigate('UserScreen')//跳转到用户页面
    },2000) 

  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • react-native使用react-navigation进行页面跳转导航的示例

    首先要确认已经配置好react-native的环境. # 创建一个native应用,SimpleApp,然后进入项目目录 react-native init SimpleApp cd SimpleApp # 通过npm安装最新版本的react-navigation npm install --save react-navigation # 运行程序 react-native run-android 引入Stack Navigator 对于我们的应用程序,我们想要使用堆栈式导航器,因为我们想要一个

  • React Native学习教程之自定义NavigationBar详解

    前言 在刚开始学习React Native的时候,版本还是0.20,问题一大堆,Navigation这个问题更是很多,首先,是NavigationBar的问题,NavigationIOS有NavigationBar,Navigation却需要自定义一个,最后,我想了想,还是自定义一个view,岂不更好,现在新公司不用RN,我正好有点时间,就把自定义的NavigationBar分享给大家.好了少废话,上代码: 示例代码 // NavigationBar 导航条的自定义封装 // create by

  • React Native中导航组件react-navigation跨tab路由处理详解

    前言 大家应该都有所体会,我们在一般应用都有跨tab跳转的需求, 这就需要特别处理下路由,所以 下面是使用react-navigation作为路由组件的一种方式. 具体情境是: app分三大模块Home主页, Bill账单和Me我的, 对应三个tab. 现在需求是 Home push HomeTwo, HomeTwo push BillTwo, BillTwo 返回到 Bill账单首页. 方法如下: 首先选择路由结构, 选择使用最外层是StackNavigator, 然后包含3个TabNavig

  • react-navigation 如何判断用户是否登录跳转到登录页的方法

    本文介绍了react-navigation 如何判断用户是否登录跳转到登录页的方法,分享给大家,也给自己留个笔记,具体如下: 新建一个index.js import React, {Component} from 'react'; import {AppRegistry, Text, View, Button,Image,StyleSheet,BackHandler,ToastAndroid} from 'react-native'; import { StackNavigator,TabNav

  • Vue-router路由判断页面未登录跳转到登录页面的实例

    如下所示: router.beforeEach((to, from, next) => { if (to.matched.some(record => record.meta.requireAuth)){ // 判断该路由是否需要登录权限 if (token) { // 判断当前的token是否存在 next(); } else { next({ path: '/login', query: {redirect: to.fullPath} // 将跳转的路由path作为参数,登录成功后跳转到该

  • vue实现未登录跳转到登录页面的方法

    环境:vue 2.9.3; webpack;vue-router 目的:实现未登录跳转 例子:直接在url地址栏输入...../home,但是这个页面要求需要登陆之后才能进入,判断的值就通过登陆之后给本地缓存存入的token判断,如果没有就跳转到登录页面,有的话就打开. 图示: 1.直接在url地址栏输入http://127.0.0.1:9000/#/home,但是页面会直接跳转到登录页,而且会带上参数. --------------------------------------------分

  • Vue实现未登录跳转到登录页的示例代码

    1.登录页登录成功时将服务端返回的标识存放起来 2.在router中给不需要登录的页面设置 meta : { auth : false },如首页 3.使用路由前置守卫beforEach,由于给路由设置了meta : { auth : false },如果是符合该属性时则不需要跳转登录页 4.接下来根据token是否存入到localstorage来进行判断或者cookie是否存入客户端做判断,这里在vuex中做处理 如果token和cookie不存在时则需要跳转到登录页 5.在axios中响应拦

  • PHP判断IP并转跳到相应城市分站的方法

    本文实例讲述了PHP判断IP并转跳到相应城市分站的方法.分享给大家供大家参考.具体实现方法如下: <?php class QQWry{ var $StartIP=0; var $EndIP=0; var $Country=''; var $Local=''; var $CountryFlag=0; // 标识 Country位置 // 0x01,随后3字节为Country偏移,没有Local // 0x02,随后3字节为Country偏移,接着是Local // 其他,Country,Local

  • React Navigation 使用中遇到的问题小结

    在React Native的开发中,使用到react navigation框架时遇到了不少问题.主要是安卓和iOS中相对不协调的地方,特此记录 一.Navigation Bar 使用navigationbar的时候遇到如下的问题 1.navigation bar的底部有一条黑线 本意做一个bar的颜色和页面颜色一致的页面.只有顶部有两个其他按钮的时候.发现bar的底部有一条黑线.导致bar不能很好的匹配想要的页面效果.在header中设置一下代码中后可去除 static navigationOp

  • Laravel 5.4重新登录实现跳转到登录前页面的原理和方法

    前言 本文主要给大家介绍的是关于Laravel5.4重新登录跳转到登录前页面的相关内容,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍: 一.应用场景: 用户登陆后存在过期时间,超时用户需重新登录.例:当用户在/user/2 页面,登陆过期后跳转到登陆页面,登陆后用户还应在/user/2而不是home/index. 二.实现原理 在判断用户过期后,存储用户当前的url地址到session中,下次登陆后跳转到此url地址. 三.laravel中的具体实现 路由中间件(判断登陆状态) 这

  • Vue利用路由钩子token过期后跳转到登录页的实例

    在Vue2.0中的路由钩子主要是用来拦截导航,让它完成跳转或前取消,可以理解为路由守卫. 分为全局导航钩子,单个路由独享的钩子,组件内钩子. 三种 类型的钩子只是用的地方不一样,都接受一个函数作为参数,函数传入三个参数,分别为to,from,next. 其中next有三个方法 (1)next(); //默认路由 (2)next(false); //阻止路由跳转 (3)next({path:'/'}); //阻止默认路由,跳转到指定路径 这里我使用了组件内钩子进行判断token过期后跳转到登录页,

  • vue路由跳转时判断用户是否登录功能的实现

    通过判断该用户是否登录过,如果没有登录则跳转到login登录路由,如果登录则正常跳转. 一丶首先在用户登录前后分别给出一个状态来标识此用户是否登录(建议用vuex): 简单用vuex表示一下,不会可以自己去官网多看看: import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex); var state = { isLogin:0, //初始时候给一个 isLogin=0 表示用户未登录 }; const mutations = { cha

  • PHP判断用户是否已经登录(跳转到不同页面或者执行不同动作)

    1. 2. <if condition="$GLOBALS['userinfo']['user_id'] gt 0"> <span class="help_wz"><a href="{$Think.config.VIP_URL}/Member/user_pwd/" style="color:#404958;">找回登录密码</a></span> <else/&g

随机推荐