array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 [React Native]DrawerNavigator 抽屉组件 - 爱码网

1.首先可以参考官方例子:

https://reactnavigation.org/docs/en/drawer-based-navigation.html

这个是最简单的

 

这个是官方GitHub例子:

https://github.com/react-navigation/react-navigation/blob/master/examples/NavigationPlayground/js/Drawer.js

当然这个也是比较简单的,只是通过openDrawer()来启动

 

组件属性总结:

https://blog.csdn.net/u010418640/article/details/80737330

 

2.结合tab bar

如果结合tab bar则变复杂了很多,因为我点击drawer里面的item时要跳转到对应的tab上,就不能简单使用openDrawer()来启动了,而且简单drawer不会遮挡下面的tab bar.

 

好在发现了一个女程序员写的例子,解决了我这个问题:

先给出地址:https://readybytes.in/blog/how-to-integrate-tabs-navigation-drawer-navigation-and-stack-navigation-together-in-react-navigation-v2

gitLab:https://gitlab.com/readybytes/ReactNavigationExampleVersion2

 

3.我的代码分析:

export const DrawerStack = createDrawerNavigator({
    HOME: {
      screen: TabNavigator,
    },
},
{
    initialRouteName: 'HOME',
    contentComponent: DrawerScreen,
    contentOptions: {
      activeTintColor: '#e91e63',
    },
    style:{
        backgroundColor: '#dfe04d',
    },
});

 入口改为DrawerStack,里面装tabNavigation, tabNavigation里面再装StackNavigation

里面用到contentComponent: DrawerScreen,这里导入了DrawerScreen页面组件.也就是这个Drawer里面是一个自定义页面.还有调整背景在DrawerStack里面调,进入到DrawerScreen不能调整.

 

调用:

只需要在栈中的页面调用即可,openDrawer()后会使用DrawerScreen

 

<Button onPress={() => this.props.navigation.openDrawer()} title="Open drawer" />

 

 

我的DrawerScreen:先放效果图:


[React Native]DrawerNavigator 抽屉组件
 

import React, {Component} from 'react';
import {NavigationActions} from 'react-navigation';
import PropTypes from 'prop-types';
import {ScrollView, Text, View, StyleSheet, Image, TouchableOpacity} from 'react-native';
import { DrawerActions } from 'react-navigation';
import styles from '../styles/index';

class DrawerScreen extends Component {
  navigateToScreen = (route) => () => {
    const navigateAction = NavigationActions.navigate({
      routeName: route
    });
    this.props.navigation.dispatch(navigateAction);
    this.props.navigation.dispatch(DrawerActions.closeDrawer())
  }

  _cancleDrawer=function() {
      this.props.navigation.closeDrawer()
  }

  render () {
    return (
      <View style={style.rootContainer}>

        <View style={style.head}>
          <Image source={require('../img/menu_header.png')} style={{resizeMode:'contain'}} />
        </View>

        <View style={style.head_bar}>
        <TouchableOpacity onPress={() =>this._cancleDrawer()}>
          <Image source={require('../img/menu_cancle.png')} />
        </TouchableOpacity>
        <Image source={require('../img/menu_inbox.png')} style={style.inboxStyle}/>
          <Text style={{marginTop:10, fontWeight:'bold'}}>INBOX</Text>
        </View>

        <ScrollView>
          <View>

          <TouchableOpacity onPress={this.navigateToScreen('Home')}>
            <View style={styles.menuItem}>
            <Image source={require('../img/menu_home.png')} style={style.listImage}/>
              <Text  style={style.textStyle}>
                Home
              </Text>
            </View>
            </TouchableOpacity>

          <TouchableOpacity onPress={this.navigateToScreen('Schedule')}>
            <View style={styles.menuItem}>
              <Image source={require('../img/menu_schedule.png')} style={style.listImage}/>
              <Text  style={style.textStyle}>
               SCHEDULE
              </Text>
            </View>
            </TouchableOpacity>

          <TouchableOpacity onPress={this.navigateToScreen('Booking')}>
            <View style={styles.menuItem}>
              <Image source={require('../img/menu_booking.png')} style={style.listImage}/>
              <Text  style={style.textStyle}>
              BOOKING
              </Text>
            </View>
            </TouchableOpacity>

            <TouchableOpacity onPress={this.navigateToScreen('Member')}>
            <View style={styles.menuItem}>
              <Image source={require('../img/menu_member.png')} style={style.listImage}/>
              <Text  style={style.textStyle}>
              MEMBER
              </Text>
            </View>
            </TouchableOpacity>

            <TouchableOpacity onPress={this.navigateToScreen('SettingScreen')}>
            <View style={styles.menuItem}>
              <Image source={require('../img/menu_setting.png')} style={style.listImage}/>
              <Text onPress={this.navigateToScreen('SettingScreen')} style={style.textStyle}>
              SETTING
              </Text>
            </View>
            </TouchableOpacity>
            
          </View>
        </ScrollView>
      </View>
    );
  }
}

DrawerScreen.propTypes = {
  navigation: PropTypes.object
};

const style = StyleSheet.create({
  rootContainer:{
    flex: 1,
    flexDirection: 'column'
  },
  head:{
    marginTop: 30,
    alignItems: 'center',
    justifyContent: 'center'
  },
  head_bar:{
    flexDirection: 'row', 
    height:50
  },
  inboxStyle:{
    marginLeft: 120,
  },
  listStyle:{
    flex: 1,
    marginTop:10
  },
  textStyle:{
    marginTop:10,
    marginLeft: 10,
    fontWeight: 'bold',
    textAlign:'center',
  },
  listImage:{
    marginLeft:50
  }
})

export default DrawerScreen;

 几个要点:

一.核心实现跳转到相应的tab:

navigateToScreen = (route) => () => {
    const navigateAction = NavigationActions.navigate({
      routeName: route
    });
    this.props.navigation.dispatch(navigateAction);
    this.props.navigation.dispatch(DrawerActions.closeDrawer())
  }

 

二.onPress问题:

有两种:

如果没有返回,调用的是类,则要这样:

<TouchableOpacity onPress={this.navigateToScreen('Member')}>

第二种有返回的时候调用,一般调用的是function:

<TouchableOpacity onPress={() =>this._cancleDrawer()}>

 (_fooFunc()表示私有)

类写在() =>中会发现跳转不了.function写在onPress={this._cancleDrawer()}会looping错误或者其他异常.因为onPress在render中会被渲染,onPress={this._cancleDrawer()}这样写会直接执行this的内容.

 

三.style UI:

flexDirection: 'column'

这个可以控制控件排列.

注意同级控件如果有一个加了flex,其他即使没有加flex,也会按照比例排开,所以要注意,不是什么情况都加flex的.

 

可以写一个单独的style,其他页面import进去后,可以直接style.xxx使用,简单直接,也可以复用.

 

相关文章: