ローディング中

react-nativeでiOSアプリ開発 第15回 react-native drawerもscrollable-tab-viewもreact-native-router-fluxも使いたかった

目次

全部使ってみようと思いました

みなさんこんにちは個別指導塾コミット塾長、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

こんな感じで動作します

 

moving

よくあるアプリのページ移動ですね。

で、どんな構成か

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の動作は前回の記事を参照してください

おわり

どうだったでしょうか?なかなか難しいので、とにかく作って動かしてみてくださいね。

ホームページ・デザイン制作のご相談・ご依頼は

079-451-5881

68ED4C65-BA1E-46D0-A7AC-B9869923C696 Created with sketchtool. A07C553F-CF16-4B7D-94FE-D36AE0A6297D Created with sketchtool. 37B7D8F4-7A18-4725-9EC6-595ABDF69D64 Created with sketchtool. 95DFB680-1EDF-4199-BC4A-BB6752EBA23C Created with sketchtool. 02DDF754-E1DB-4EF2-B6BB-C884722938C4 Created with sketchtool. NEW! 1A95E369-6469-4C46-B38F-F83410B928B0 Created with sketchtool. Group 5Group 2Group 4Group 3E4FC8CF2-721D-4699-8162-18E886C432C1 Created with sketchtool.