【React Native】良さげなコンポーネント紹介

[React Native Advent Calender](http://qiita.com/advent-calendar/2016/react-native)12/24への投稿記事です！

# メリークリスマス:santa_tone2:

色々なコンポーネントがありますが、探すのって大変ですよね・・・・。
それに探しても探し切れなかったりなどなど。なので面白そう、あるいはすごそう、使ってみたことあるなどなどのコンポーネント紹介していきます！

また、こっちの方がよいぞー！これとかどう？などなどあればお教えいただけますと幸いです！


## [react-native-router-flux](https://www.npmjs.com/package/react-native-router-flux)

名の知れたルーティングライブラリ。react-routerライクな書き方で使うことができます。
tabだってアニメーションだってできてしまう万能な子。

Sceneを使ってルーティングを定義します。そして戻るアクションやスワイプバックは自動実装。
tabについても書くだけでタブ遷移の仕組みも実装してくれます。

如何せんドキュメントがよくわからなくてソース見に行くこともしばしば。そしてなんともならないこともあるのもしばしば。
つらみと嬉しみの集合体であることは間違いありませんが簡単実装、良い動きなのは間違いないと思っています。

[React Native Router Fluxを使ってみませんか・・・？](http://qiita.com/YutamaKotaro/items/ab52b6ba664d88a87bd9)

という記事も書きました。

こんな実装になります。

```js

import {Scene, Router} from 'react-native-router-flux';
 
class App extends React.Component {
  render() {
    return <Router>
      <Scene key="root">
        <Scene key="login" component={Login} title="Login"/>
        <Scene key="register" component={Register} title="Register"/>
        <Scene key="home" component={Home}/>
      </Scene>
    </Router>
  }
}
```



## [react-native-vector-icons](https://www.npmjs.com/package/react-native-vector-icons)

いつもお世話になっているライブラリ。アイコンを出すことができる。使うための事前準備がめんどくさいけどあとは素晴らしい。様々なアイコンがあるんだけど気がつくと自分はmaterial-iconばかり使っています。
実際に使われている方も多いのでご存知の方も多いほどよく使われているコンポーネントです。

ちょっと初期設定がめんどくて、React Nativeを触り始めた頃は初めて触るXCodeに発狂しました。


![react-native-vector-icons.png](https://qiita-image-store.s3.amazonaws.com/0/121851/92d7cf71-69ff-e2c3-4123-7c28f14c639f.png)

こんな感じで使います。

```js

<Icon name="ios-person" size={30} color="#4F8EF7" />
```

実際に使われている方は非常に多いのかもです・・・？

## [react-native-animatable](https://www.npmjs.com/package/react-native-animatable)

[react-native meetup#3](https://react-native-meetup.connpass.com/event/40745/)にてshohey1226さんが発表の中でちらっと紹介してくださったライブラリ。アニメーションのタイミングをロジックを合わせるのに苦労されたそうですが、ヌルヌル動きまくることこの上ないほどのすごいライブラリ。個人的にヌルヌルなアニメーションをアプリに採用することで幸福感が得られる気がしている・・・。

やはりアプリがアプリたるためにはヌルヌルな動きはマストですね！

ちなみに次回の[React Native meetup#4](https://react-native-meetup.connpass.com/event/46778/)は1/26開催です！

皆様にお会いできるのを楽しみにまっております！


![reactnativeanimation.gif](https://qiita-image-store.s3.amazonaws.com/0/121851/3b382429-b208-f737-23a2-3f1f345da825.gif)

```js
<Animatable.Text animation="zoomInUp">Zoom me up, Scotty</Animatable.Text>
```

## [react-native-parallax-view](https://github.com/lelandrichardson/react-native-parallax-view)

引っ張ると伸びて上にあげる引っ込むコンポーネントです。ツイッターとかのプロフィールもこんな感じだったような気がする。これをつかうと途端にアプリ感がかなり割り増しされて幸福感もます気がします・・・。
もちろんReact Nativeはこうゆうの使わなくてもCordovaアプリとは違ってアプリ感に満ち溢れています（ネイティブアプリとかわらないので）が、おおおお！アプリだ！という感じがより満ち溢れてきます。

使い方も簡単で個人的には好きなコンポーネントです。
これは本当にオススメです！！が如何せん使いたい場所は限られるかもです・・・。
どかっと画像をトップに表示させるようなシチュエーションはバッチこいかもです。


![parallax.gif](https://qiita-image-store.s3.amazonaws.com/0/121851/a8d5c329-1915-6a52-7625-26c21c97608d.gif)

実装はこんな感じ、

```js
<ParallaxView
    backgroundSource={require('image!backgroundImage')}
    windowHeight={300}
    header={(
        <Text style={styles.header}>
            Header Content
        </Text>
    )}
    scrollableViewStyle={{ backgroundColor: 'red' }}
>
  <View>
    // ... scrollview content
  </View>
</ParallaxView>
```

scrollview contentのところに、画像下部に表示させたいものを入れるといいのかもです。
headerに検索フォームをいれて、scrollview contentのところに検索結果をだす。そんなアプリをつくっている途中だったりします。


## [react-native-scrollable-tab-view](https://github.com/skv-headless/react-native-scrollable-tab-view)

鉄板なスクロールビュー。
これも簡単だけど、幸福感に溢れるコンポーネントです。
とてもつかいやすい・・・。

これの素晴らしいところは、スワイプしてうごくだけでなく、押したら遷移するし、タブエリアも作ってくれる。
使いようによってはカルーセルの代用もできるのでは・・・？



![tabbScroll.gif](https://qiita-image-store.s3.amazonaws.com/0/121851/30d60244-d153-492e-52b8-ae93e5fb0452.gif)

実装はこんな感じになります。

```js
const App = () => (
      <ScrollableTabView>
        <ReactPage tabLabel="React" />
        <FlowPage tabLabel="Flow" />
        <JestPage tabLabel="Jest" />
      </ScrollableTabView>
);
```

ScrollableTabViewの中にコンポーネントを打ち込むだけです。
それなりに色々なpropsを設定できてカスタマイズ性も高いと思います。


## [react-native-carousel](https://github.com/nick/react-native-carousel)

カルーセル系コンポーネント。とても使いやすく、現在位置を示し、押したら進んだり戻ったりするあのポッチを再現。簡単実装良い動きです。
しかし、ポッチは実は文字列で構造的にポッチの上下左右に当たり判定ができてしまうのが欠点。

react nativeに順番がzindex制度でなく、zindexプロパティが実装されれば簡単に、この問題をなんとかできるのですが・・・。

![Qiita_carousel.gif](https://qiita-image-store.s3.amazonaws.com/0/121851/a23c3699-4f17-2aa7-a8b0-5c061e9e6d44.gif)

実装はこんな感じ

```js
const App = () => (
  <Carousel 
    width={width} 
    indicatorColor="#008080" 
    animate={false} 
    indicatorOffset={100}
  >

    <View style={styles.container}>
      <Text>Page 1</Text>
    </View>

    <View style={styles.container2}>
      <Text>Page 2</Text>
    </View>

    <View style={styles.container3}>
      <Text>Page 3</Text>
    </View>

  </Carousel>
);
```

## [react-native-progress](https://github.com/oblador/react-native-progress)

かっこいい。ただそれだけの言葉しかでないほどにカッコいいコンポーネント。
React ART を使っている。ローディング中のぐるぐるにうってつけのコンポーネント。
使い方も簡単で　ART使っているだけあって本当に綺麗に見える。

jQueryのローダー画像みたいなの出より、これのCircle Snail出すとおおおと個人的にはなります。
子供みたいですが、動き目で追っていくだけでも楽しいのでよりまっている時間が辛くなくなるような気がしています。

![64fb1420-8d01-11e5-9ec0-5e175a837c62.gif](https://qiita-image-store.s3.amazonaws.com/0/121851/8832b68b-fdc4-a880-ba57-0cbdcc0b6244.gif)

実装はこんな感じ

```js
import { CircleSnail } from 'react-native-progress'

const Preloader = () =>(
            <CircleSnail
                color="#008080"
                size={90}
                direction="clockwise"
                thickness={4}
            />
);
```

これでグルグルを出すことができます。

## [react-native-gifted-listview](https://www.npmjs.com/package/react-native-gifted-listview)

引っ張ると更新される、リストビューを作ることができます。
ちょっと扱いが難しかったですが、ツイッターとかgmailとかの更新するときのあの動きを実装することができます。

始めたての頃使ったのですが、なかなかに苦戦させられたコンポーネント。

![gifted.gif](https://qiita-image-store.s3.amazonaws.com/0/121851/b5f4866d-1f62-12bb-315f-290680fcfd90.gif)

実装はこんな感じです。

```js
      <View style={styles.container}>
        <View style={styles.navBar} />
        <GiftedListView
          rowView={this._renderRowView}
          onFetch={this._onFetch}
          firstLoader={true} // display a loader for the first fetching
          pagination={true} // enable infinite scrolling using touch to load more
          refreshable={true} // enable pull-to-refresh for iOS and touch-to-refresh for Android
          withSections={false} // enable sections
          customStyles={{
            paginationView: {
              backgroundColor: '#eee',
            },
          }}

          refreshableTintColor="blue"
        />
      </View>
```

## [react-native-modalbox](https://www.npmjs.com/package/react-native-modalbox)

下からぽろんって出てきて、反対方向に動かすと引っ込むコンポーネントです。出しては引っ込め出しては引っ込めを無駄に繰り返してしまいます。僕の好きなコンポーネントです。

フローティングアクションボタンを押した時に出てくる入力フォームなどに使うことができるかと思います。
出てきた方法に押しやると引っ込むという挙動はとても直感的で分かりやすく感じます。


![3XULLt8.gif](https://qiita-image-store.s3.amazonaws.com/0/121851/97a8ef6a-4593-ca19-9699-67ee1d5bf11d.gif)

```js
import Modal from 'react-native-modalbox';

const App = () => (
  <Modal
     style={{height:300 }}
     ref={this.modalRef}
     isOpen={addModal}
     onClosed={closeAddModal}
     >
     <View style={CommonStyle.ModalContainer}>
        ・・・content
     </View>
   </Modal>
);
```


## [react-native-drawer](https://www.npmjs.com/package/react-native-drawer)

かつて、react-native-side-menuをつかって実装したことがありましたが、これは微妙でした。
drawerをつくるならこちらのreact-native-drawerを使うのが良いみたいです。スター数もすごい。

<img src="https://qiita-image-store.s3.amazonaws.com/0/121851/0a8e26ef-a572-3b16-d952-5dac1ee61bab.gif" width="300" />


実装はこんな感じ

```js
import Drawer from 'react-native-drawer'

class Application extends Component {  
  closeControlPanel = () => {
    this._drawer.close()
  };
  openControlPanel = () => {
    this._drawer.open()
  };
  render () {
    return (
      <Drawer
        ref={(ref) => this._drawer = ref}
        content={<ControlPanel />}
        >
        <MainView />
      </Drawer>
    )
  }
})
```

## [react-native-swipeout](https://www.npmjs.com/package/react-native-swipeout)

こちらも大変かっこいいコンポーネントです！
一回試しに使ってみましたがかなり脳汁がでました。

gmailなどにある、「消す」、「アーカイブ」などなどを出しているあの動きのような挙動を取り入れることができるようになります。

![oCQLNFC.gif](https://qiita-image-store.s3.amazonaws.com/0/121851/b9537afd-3968-a785-7879-5d03d41f8671.gif)

実装はこんな感じです。

```js

      <Swipeout
        left={rowData.left}
        right={rowData.right}
        rowID={rowID}
        sectionID={sectionID}
        autoClose={rowData.autoClose}
        backgroundColor={rowData.backgroundColor}
        close={!rowData.active}
        onOpen={(sectionID, rowID) => this._handleSwipeout(sectionID, rowID) }
        scroll={event => this._allowScroll(event)}>
        <View style={styles.li}>
          <Text style={styles.liText}>{rowData.text}</Text>
        </View>
      </Swipeout>
```

rightとなっている箇所に左にスワイプさせたら出てくるものを指定の形式に沿って記載します。

# 終わりに

いかがでしたでしょうか？お読みくださりましたありがとうございました！:blush:

今後も快適なReact Nativeライフを送っていただけますと幸いです！