React Native 开发豆瓣评分(二)路由配置

news/2025/2/23 20:39:51

路由管理使用官方推荐的 React Navigation;

配置环境

  1. 安装相关依赖

    yarn add react-navigation react-native-gesture-handler
  2. Link 原生依赖

    react-native link react-native-gesture-handler
  3. 修改 MainActivity.java

    package com.reactnativedouban;
    
    import com.facebook.react.ReactActivity;
    + import com.facebook.react.ReactActivityDelegate;
    + import com.facebook.react.ReactRootView;
    + import com.swmansion.gesturehandler.react.RNGestureHandlerEnabledRootView;
    
    public class MainActivity extends ReactActivity {
    
    @Override
    protected String getMainComponentName() {
        return "ReactNativeDouban";
    }
    
    +  @Override
    +  protected ReactActivityDelegate createReactActivityDelegate() {
    +    return new ReactActivityDelegate(this, getMainComponentName()) {
    +      @Override
    +      protected ReactRootView createRootView() {
    +        return new RNGestureHandlerEnabledRootView(MainActivity.this);
    +      }
    +    };
    +  }
    }

编辑路由相关页面

测试环境是否搭建成功

将如下 js 代码替换到 App.js 中,点击 Home Click Me 进行了页面跳转即表示环境搭建成功。

import React from "react";
import { View, Text } from "react-native";
import { createStackNavigator, createAppContainer } from "react-navigation";
class Home extends React.Component {
  render() {
    return (
      <View style={{ flex: 1, alignItems: "center", justifyContent: "center" }}>
        <Text onPress={() => this.props.navigation.push('Detail')}>Home Click Me</Text>
      </View>
    );
  }
}
class Detail extends React.Component {
  render() {
    return (
      <View style={{ flex: 1, alignItems: "center", justifyContent: "center" }}>
        <Text>Detail Screen</Text>
      </View>
    );
  }
}
const AppNavigator = createStackNavigator({Home,Detail});
export default createAppContainer(AppNavigator);

创建页面、配置路由

暂时创建主要的几个页面,后续有需求在进行创建,开发目录如下:

...
├─src                  主要开发目录
│ ├─router.js          管理路由
│ ├─App.js             入口页
│ └─pages              页面目录,暂时页面较少,不必对页面进行分类管理
│    ├─index.js        首页
│    ├─list.js         列表页
│    ├─detail.js       详情页
│    ├─center.js       个人中心
│    ├─rank.js         排行榜页面
│    └─rankDetail.js   排行榜详情页面
├─index.js
...

编辑 App.js

import React, { Component } from 'react';
import Router from './router';

export default class App extends Component {
  render() {
    return (
      <Router />
    );
  }
};

编辑 router.js

  1. 基本的结构如下:

    import { createBottomTabNavigator, createAppContainer, createStackNavigator } from 'react-navigation';
    import React from 'react';
    
    import Index from './pages/index';
    import Rank from './pages/rank';
    import Center from './pages/center';
    import List from './pages/list';
    import Detail from './pages/detail';
    import RankDetail from './pages/rankDetail';
    
    const components = {
        List,
        Detail,
        RankDetail
    }
    
    const tabBarConfig = {
        tabBarOptions: {
            activeTintColor: '#fd0',
            inactiveTintColor: '#666',
            style: {
                backgroundColor: '#fafafa',
            }
        }
    }
    
    const TabNavigator = createBottomTabNavigator({
        Index: {
            screen: Index,
            navigationOptions: {
                title: '首页'
            }
        },
        Rank: {
            screen: Rank,
            navigationOptions: {
                title: '榜单'
            }
        },
        Center: {
            screen: Center,
            navigationOptions: {
                title: '我的'
            }
        },
    }, tabBarConfig);
    
    const AppNavigator = createStackNavigator({
        Tab: TabNavigator,
        ...components
    });
    
    export default createAppContainer(AppNavigator);
  2. 页面内容如下:

    import React from "react";
    import { View, Text } from "react-native";
    
    export default class Home extends React.Component {
    render() {
        return (
        <View style={{ flex: 1, alignItems: "center", justifyContent: "center" }}>
            <Text onPress={() => this.props.navigation.push('Detail')}>Home Click Me</Text>
        </View>
        );
    }
    }

    1312841-20190627182945201-339709028.png

  3. 此时页面路由跳转是上下切换跳转,希望换成左右切换,修改createStackNavigator配置,如下,这样默认就是左右跳转,使用 this.props.navigation.push('Detail', { transition: 'bottom' }) 这样的带 transition 参数为 bottom 的跳转则为上下切换动画。

    const AppNavigator = createStackNavigator({
        Tab: TabNavigator,
        ...components
    }, {
        transitionConfig: () => ({
            screenInterpolator: sceneProps => {
                const { layout, position, scene } = sceneProps;
                const { index, route } = scene;
                const { initWidth, initHeight } = layout;
    
                const params = route.params || {};
                const transition = params.transition || 'left';
                let transform = {};
    
                if (transition === 'bottom') {
                    transform.translateY = position.interpolate({
                        inputRange: [index - 1, index, index + 1],
                        outputRange: [initHeight, 0, 0]
                    });
                } else {
                    transform.translateX = position.interpolate({
                        inputRange: [index - 1, index, index + 1],
                        outputRange: [initWidth, 0, 0]
                    });
                }
                const opacity = position.interpolate({
                    inputRange: [index - 1, index - 0.99, index],
                    outputRange: [0, 1, 1],
                });
    
                return { opacity, transform: [transform] };
            }
        })
    });
  4. 添加 Tabbar 图片,修改 tabBarConfig 配置:

    const imgs = [
        require('./assets/index.png'),
        require('./assets/index-full.png'),
        require('./assets/rank.png'),
        require('./assets/rank-full.png'),
        require('./assets/center.png'),
        require('./assets/center-full.png')
    ];
    
    const tabName = ['Index', 'Rank', 'Center'];
    
    const tabBarConfig = {
        defaultNavigationOptions: ({ navigation }) => ({
            tabBarIcon: ({ focused }) => {
                const { routeName } = navigation.state;
                let imgIndex = focused ? tabName.indexOf(routeName) * 2 + 1 : tabName.indexOf(routeName) * 2;
                return <Image source={imgs[imgIndex]} style={{ width: 25, height: 25 }} />;
            }
        }),
        tabBarOptions: {
            activeTintColor: '#00b600',
            inactiveTintColor: '#666',
            labelStyle: {
                fontSize: 15
            },
            style: {
                backgroundColor: '#fafafa',
            }
        }
    }

效果如下:

1312841-20190628161027075-345409150.gif

至此,路由算是完成了,下节介绍项目中如何引入 redux。

转载于:https://www.cnblogs.com/hl1223/p/11098846.html


http://www.niftyadmin.cn/n/711804.html

相关文章

SublimeText2 快捷键一览

ctrlshiftw&#xff1a; 关闭Sublime&#xff0c;关闭所有打开文件ctrln&#xff1a; 新建文件ctrls&#xff1a; 保存ctrlshifts&#xff1a; 另存为ctrlf4&#xff1a; 关闭文件ctrlw&#xff1a; 关闭f11&#xff1a; 切换全屏状态backspace&#xff1a; 删除左侧shiftbacks…

SSM再见——另一个小项目来结束它!!!

文章目录&#xff1a; 1.开篇 2.项目的总体步骤 2.1 先给出数据库中省份表和城市表的SQL源码 2.2 IDEA中使用Maven创建一个web项目 2.3 添加pom依赖 2.4 创建项目中需要用到的几类包&#xff08;entity、dao、service、controller、vo&#xff09; 2.5 各种配置文件…

王恩东院士:“计算+”是数据社会化的关键

“融合是未来趋势&#xff0c;融合的结果是‘一切皆计算’。未来&#xff0c;整个ICT产业就是构建在计算之上的。”Inspur World 2016技术与应用大会于10月26日在上海举行&#xff0c;大会的主题是迈向数据社会化(Only Data)。认为当前我们正在迈向数据社会化&#xff0c;浪潮集…

linux中去掉敲命令时 发出烦人的“铛铛铛“的声音

在linux下可能tab命令键应该是大家平时工作中用的最多一个按键了。在使用ls&#xff0c;cd等命令时使用tab可以帮我们减少很多键盘输入&#xff0c;比如我们要进入一个很长目录名的目录下&#xff0c;可能只需要敲入前几个字符&#xff0c;然后使用tab&#xff0c;这时整个目录…

SpringBoot——入门案例之“Hello SpringBoot“

文章目录&#xff1a; 1.初识SpringBoot 1.1 SpringBoot的特性 1.2 SpringBoot四大核心 2.第一个SpringBoot项目 2.1 创建一个Module &#xff0c;选择类型为 Spring Initializr 快速构建 2.2 项目结构 2.3 pom.xml文件中的内容 2.4 SpringBoot项目启动入口类 2.5…

Oracle通过数据泵网络导入另一个数据库,不生成DMP文件

本文是记录一次Oracle数据导入的经历&#xff0c;方便以后复习。因项目需要将服务器A上的数据库&#xff08;用户名&#xff1a;USER1&#xff09;导入到服务器B上的数据库&#xff08;用户名&#xff1a;USER1&#xff09;&#xff0c;不想采用普通的EMP /IMP方式&#xff0c;…

《大数据原理:复杂信息的准备、共享和分析》一一2.9 数据清洗

2.9 数据清洗数据清洗有时候被看作去标识化的同义词&#xff0c;事实上&#xff0c;应该理解为一个起于去标识化过程结束时的过程。数据清洗会将那些数据记录里不希望保留的信息移除&#xff0c;包括个人信息和其他与数据记录含义不直接相关的信息。例如&#xff0c;在医院记录…

log4j java配置_基于java配置log4j日志详解

1.Log4j1.1了解Log4jLog4j是Apache的一个开源项目&#xff0c;通过使用log4j&#xff0c;我们可以控制日志信息输送的目的地可以是控制台、文件、GUI组件&#xff0c;我们也可以控制每一条日志的输出格式&#xff0c;通过定义每一条日志信息的级别&#xff0c;我们能够更加细致…