目次
全部使ってみようと思いました
みなさんこんにちは個別指導塾コミット塾長、AWESOME開発担当の船津です。
今回は
 UI作成で大事な要素、タブ、ルーター、ドロワーと全部まとめて使ってみましょう。
今回のリポジトリ
https://github.com/root-two/react-native-drawer
https://github.com/aksonov/react-native-router-flux
https://github.com/skv-headless/react-native-scrollable-tab-view
react-native-scrollable-tab-viewに関しては前回の記事をご覧ください
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
react-nativeでiOSアプリ開発 第14回 scrollable-tab-viewと font-awesomeを使う
今回作ったもの
https://github.com/keisukefunatsu/app-education/tree/master/realmPlayground
こんな感じで動作します

よくあるアプリのページ移動ですね。
で、どんな構成か
Router
- モバイルアプリはページをシーンという形で積み重ねて作ります
 - ページ間の移動は
Actions."KEYNAME"の形で記述します - componentはクラスを指定します
 
export default class App extends Component {
  render() {    
    return (      
    <Router>
      <Scene key="root">        
        <Scene key="start" component={TestDrawer} title="Start" text="page1" initial={true} onRight={() => Actions.todo()}  rightTitle="todo"/>
        <Scene key="todo" component={TodoWithTab} title="Todo" text="page2" hideNavBar={false} />        
        </Scene>
    </Router>
    )
  }
}
Drawer
- contentにはクラスを指定します
 
class TestDrawer extends Component {
  openDrawer = () => {
    this._drawer.open()
  };
  closeDrawer = () => {
    this._drawer.close()
  };
  render() {
    return (
    <Drawer ref={(ref) => this._drawer = ref}
        content={<TestPanel closeDrawer={this.closeDrawer}/>}
        tapToClose={true}        
        >
        <View style={{flex: 1,justifyContent: 'center',}}>        
        <Text style={{textAlign: 'center',marginTop: 30,}}>{this.props.text}</Text>  
        <View style={{alignItems: 'center',}}>
          <TouchableHighlight style={styles.button} onPress={() => { this.openDrawer() }}
            activeOpacity={75 / 100}
            underlayColor={"rgba(47,56,78,1)"}>
            <Text>Open</Text>
          </TouchableHighlight>
        </View>        
      </View>
      </Drawer>
    )
  }
}
Drawer用コンポーネント
- closeDrawerでDrawewerを閉じます
 - Actions.startで戻れるようにもなっています
 
class TestPanel extends Component {
  render(){
    const {closeDrawer} = this.props
    return (
      <View style={styles.container}>
        <Text style={styles.controlText}>Control Panel</Text>
        <Button onPress={Actions.todo}>
          Todo
        </Button>
        <Button onPress={closeDrawer}>
          go back to first page
        </Button>
        <Button onPress={Actions.start}>
          go back to first page(using router)
        </Button>
      </View>
    )
  }
} 
出来上がったコード
import React, { Component } from 'react'
import {
  StyleSheet,
  Text,
  View,
  TextInput,
  TouchableHighlight,
  TouchableOpacity,
} from 'react-native'
import RealmTodo from '../components/realmTodo'
import ScrollableTabView from 'react-native-scrollable-tab-view'
import CustomTabbar from '../components/customTabBar'
import {Actions, Scene, Router} from 'react-native-router-flux'
import Drawer from 'react-native-drawer';
import Button from 'react-native-button';
class TestDrawer extends Component {
  openDrawer = () => {
    this._drawer.open()
  };
  closeDrawer = () => {
    this._drawer.close()
  };
  render() {
    return (
    <Drawer ref={(ref) => this._drawer = ref}
        content={<TestPanel closeDrawer={this.closeDrawer}/>}
        tapToClose={true}        
        >
        <View style={{flex: 1,justifyContent: 'center',}}>        
        <Text style={{textAlign: 'center',marginTop: 30,}}>{this.props.text}</Text>  
        <View style={{alignItems: 'center',}}>
          <TouchableHighlight style={styles.button} onPress={() => { this.openDrawer() }}
            activeOpacity={75 / 100}
            underlayColor={"rgba(47,56,78,1)"}>
            <Text>Open</Text>
          </TouchableHighlight>
        </View>        
      </View>
      </Drawer>
    )
  }
}
class TestPanel extends Component {
  render(){
    const {closeDrawer} = this.props
    return (
      <View style={styles.container}>
        <Text style={styles.controlText}>Control Panel</Text>
        <Button onPress={Actions.todo}>
          Todo
        </Button>
        <Button onPress={closeDrawer}>
          go back to first page
        </Button>
      </View>
    )
  }
} 
class TodoWithTab extends Component {
  render() {
    return (      
      
      <ScrollableTabView style={{marginTop: 40, borderTopWidth: 2, }} tabBarPosition='bottom' initialPage={0} renderTabBar={() => <CustomTabbar tabList={['Active', 'Completed', 'All']}/>}
        >        
        <RealmTodo tabLabel={'navicon'} visibility={'show_active'} />
        <RealmTodo tabLabel='check-square-o' visibility={'show_completed'} />
        <RealmTodo tabLabel="list-alt" visibility={'show_all'} />
      </ScrollableTabView>
      
    )
  }
}
export default class App extends Component {
  render() {    
    return (      
     <Router>
      <Scene key="root">        
        <Scene key="start" component={TestDrawer} title="Start" text="page1" initial={true} onRight={() => Actions.todo()}  rightTitle="todo"/>
        <Scene key="todo" component={TodoWithTab} title="Todo" text="page2" hideNavBar={false} />        
        </Scene>
    </Router>
    )
  }
}
const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
  input: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
  },
  list: {
    flex: 4,
    justifyContent: 'center',
  },
  completed: {
    textDecorationLine: 'line-through',
    textDecorationStyle: 'solid',
  },
  button: {
    width: 100,
   height: 30,
   padding: 10,
   backgroundColor: 'lightgray',
   alignItems: 'center',
   justifyContent: 'center',
   margin: 3
  },
  controlPanel: {
    flex: 1,
    backgroundColor:'transparent',
  },
  controlPanelText: {
    color:'white',
  },
});
動作解説(ややこしいですね)
- drawerでTestPanelを呼び出しています
 - TestPanelでは
Actions.todoを呼び出してシーン間を移動したり、’closeDrawer’でdrawerを閉じます - TodoWithTabの動作は前回の記事を参照してください
 
おわり
どうだったでしょうか?なかなか難しいので、とにかく作って動かしてみてくださいね。
 




