RN中的常用框架基础搭建

底部Tab结构+侧滑菜单结构,可自行选择


1、root.js (src/root.js)

import React from 'react';
import {AppRegistry} from 'react-native';
import {Provider} from 'react-redux';
import configureStore from './store/store';
import {AppNavigator} from './routes/routers';

const store = configureStore();

export default class Root extends React.Component{
  render(){
    return(
        <Provider store={store}>
          <AppNavigator/>
        </Provider>
    )
  }
}
 /**此处appName 自行定义**/
AppRegistry.registerComponent(appName, () => Root);

2、store.js (src/store/store.js)

'use strict';

import { createStore, applyMiddleware } from 'redux';
import { createLogger } from 'redux-logger';
import thunkMiddleware from 'redux-thunk';
import rootReducer from '../reducers/index';
//此处的http文件可自行配置
import http from '../middlewares/http';
import {navMiddleware} from '../routes/routers';


const middelwares = [];

middelwares.push(http);
middelwares.push(thunkMiddleware);
middelwares.push(navMiddleware);

if (process.env.NODE_ENV === 'development') {
  middelwares.push(createLogger());
}

const createStoreWithMiddleware = applyMiddleware(...middelwares)(createStore);

export default function configureStore(initialState) {
  const store = createStoreWithMiddleware(rootReducer,  initialState);
  return store;
}

3、index.js (src/reducers/index.js)

import { combineReducers } from 'redux'
import app from './app';
const AppReducer = combineReducers({
  app,
  //...此处添加需要加入的
});
export default AppReducer

4、app.js (src/reducers/app.js)

import Immutable from 'immutable';

const initState = Immutable.fromJS({

});

export default (state = initState, action) => {
let newState = state;
switch (action.type) {
    default:
        return newState;
}
};


此处创建的是带抽屉Drawer嵌套底部TabBar的框架,可以自行修改框架的形式


5、routers.js (src/routes/routers.js)

import {connect} from 'react-redux';
import {
   createStackNavigator,
} from 'react-navigation';
import {
  reduxifyNavigator,
  createReactNavigationReduxMiddleware,
} from 'react-navigation-redux-helpers';
import SplashScreen from '../splashPage';
import DrawerScreen from './drawerPage';

const navMiddleware = createReactNavigationReduxMiddleware(
  'root',
  state => state.nav
);
const StackNavigatorConfigs = {
  initialRouteName: 'Splash', // 初始化哪个界面为根界面
  mode: 'card', // 跳转方式:默认的card,在iOS上是从右到左跳转,在Android上是从下到上,都是使用原生系统的默认跳转方式。
  headerMode:'screen', // 导航条动画效果:float表示会渐变,类似于iOS的原生效果,screen表示没有渐变。none表示隐藏导航条
  navigationOptions: {
    gesturesEnabled: false, //是否可以使用手势关闭此屏幕。在iOS上默认为true,在Android上为false
  },
};

const StackRouteConfigs = {
  Splash: {
    screen: SplashScreen,
    navigationOptions: {
        header: null
    }
  },
/*此处的DrawerScreen可替换成任意的形式,例如tabBar形式*/
  Main: {
    screen: DrawerScreen,
    navigationOptions: {
        header: null
    }
  },
};

const RootNavigator = createStackNavigator(StackRouteConfigs,        StackNavigatorConfigs);

const AppWithNavigationState = reduxifyNavigator(RootNavigator, 'root');

const mapStateToProps = state => ({
  state: state.nav,
});

const AppNavigator = connect(mapStateToProps)(AppWithNavigationState);

export {RootNavigator, AppNavigator, navMiddleware};

6、tabBar.js (src/routes/tabBar.js)

import React from 'react';
import {
   TouchableOpacity,
    Image,
    View,
    StyleSheet,
    Dimensions,
    Platform,
    Text,  
} from 'react-native';
import {
    createBottomTabNavigator,
} from "react-navigation";
import CenterIcon from '../../assets/imgs/tabBar/center.png';
import SelectCenterIcon from '../containers/center/selectcenter.png';
import HomeScreen from '../containers/home/home';
import CenterScreen from '../containers/center/center';

const {width,height} = Dimensions.get('window');

const styles = StyleSheet.create({
    pressedIcon: {
        fontFamily: 'iconfont',
        fontSize: 20,
        color: '#17A9DF',
        marginTop: 10,
    },
    renderIcon: {
        fontFamily: 'iconfont',
        fontSize: 20,
        color: '#B4B4B4',
        marginTop: 10,
    }
});

export default Tab = createBottomTabNavigator({
    Home: {
        screen: HomeScreen,
        navigationOptions: {
            tabBarPosition: 'bottom',
            tabBarLabel: 'Home',
            showLabel: false,
            tabBarIcon: ({tintColor, focused}) => (
                focused ? <Text style={styles.pressedIcon}>&#xe664;</Text> : <Text style={styles.renderIcon}>&#xe663;</Text>
            ),
        }
    },
    /**此处的Home和Center两个Tab 是不同形式的,一个文本形式,一个图片形式 **/
    Center: {
        screen: CenterScreen,
        navigationOptions: {
            //此处tabBarVisible表示是否显示当前的tab选项
            tabBarVisible: false,
            tabBarPosition: 'bottom',
            tabBarLabel: 'Center',
            showLabel: false,
            tabBarIcon: ({tintColor, focused}) => (
                 focused ? <Image source={SelectCenterIcon} style={{marginBottom:25}}/> :<Image source={CenterIcon} style={{marginBottom:25}}/>
            ),
        }
    },
}, {
    animationEnabled: true,
    swipeEnabled: false,
    //是否可以滑动切换
    swipeEnabled: false,
    //切换是否有动画
    animationEnabled: true,
    //进入App的首页面
    initialRouteName: 'Home',
    //对于导航的设置
    tabBarOptions: {
        activeTintColor: '#17A9DF',
        inactiveTintColor: '#B4B4B4',
        //android特有下划线的颜色1
        indicatorStyle: {height: 0},
        //文字的样式
        labelStyle: {
            fontSize: 10,
            paddingBottom: 10
        },
        //对于导航的stytles
        style :{
            borderTopColor: 'rgba(0,0,0,0.2)',
            borderTopWidth: 1,
            backgroundColor: '#ffffff',
        }
    }
});

7、drawer.js (src/routes/drawer.js)

import React from 'react';
import {
    StyleSheet,
    Dimensions,
    Platform,
    Text,
    TouchableOpacity,
    Image,
    View
} from 'react-native';
import {
    createDrawerNavigator,
} from "react-navigation";

import ControlPane from '../containers/controlPane/controlPane';
import TabBar from './tabBar';

const {width,height} = Dimensions.get('window');

export default Drawer = createDrawerNavigator({
    TabBar: {
        screen: TabBar,
        navigationOptions: {
            header: null
        }
    },
},
{
    //drawerPosition 可控制该抽屉是否弹出的方向
    drawerPosition:'left',
    drawerWidth: width * 0.8,
    //drawerLockMode 可控制该抽屉是否锁定
    drawerLockMode:'locked-closed',
    useNativeAnimations:true,
    //contentComponent 放置弹出的抽屉内容
    contentComponent: props => {
        return <ControlPane {...props}/>;
    }
})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容

  • 本文将开始详细分析如何搭建一个React应用架构。 一. 前言 现在已经有很多脚手架工具,如create-reac...
    字节跳动技术团队阅读 4,314评论 1 23
  • 人生是一个动荡不安的过程。我们只是浮沉其中,打捞那些闪亮的瞬间而已。
    勇敢面对007阅读 257评论 1 1
  • 最近健身有点糊弄自己的感觉,心不在焉,而且每次都感觉很累,只有大目标想练一身肌肉,没有小目标。因为有可亮化的小目标...
    张霄_8127阅读 211评论 0 0
  • 你跟我说 最浪漫的事儿 是每一天说一万次 我爱你 不管真心 假意 你开心就好 送一把刀给你 刻骨的刀尖 铭心的刀刃...
    微言春秋阅读 249评论 0 1