React Nativeでcounterアプリを作る

はじめに

Hello Worldまでのコードはいろんな記事でまとめられていますが、その次のステップの教材がなかなかありません。

私もReact Nativeを初めてまだ一週間ですが、なんとなくわかってきた気がするので、Counterアプリを作ってボタンのイベントとUIへの値の反映について解説しようと思いまうす。

元のコード

以下のHello Worldコードを元にCounter機能を追加していきます。

レウアウトの処理などが入るとコードが長くなるので極限まで削ぎ落としています。UIがダサいのは勘弁してください。

import React, { Component } from 'react';
import { Text } from 'react-native';

export default class HelloWorldApp extends Component {
  render() {
    return (
      <Text>Hello world!</Text>
    );
  }
}

ボタンとタップイベント

<Button>の中のonPressにイベントを受け取るメソッドを記述することで、ボタンをタップした際のイベントをキャッチすることができます。

以下のコードを実行しボタンをタップするとconsoleに「タップされました」と出力されます。

import React, { Component } from 'react';
import { Text, Button, View} from 'react-native';

export default class HelloWorldApp extends Component {
  
  onPressButton(){
    console.log('タップされました');
  }

  render() {
    return (
      <View>
        <Text>Hello world!</Text>
        <Button 
          onPress={this.onPressButton}
          title='counter'
        />
      </View>
    );
  }
}

countの定義と値の更新

stateにcountというプロパティを定義します。stateについては私もまだ完璧に理解しているわけではないですが、値がよく変更されるものはstateで管理するのが良いようです。

javaScriptはthisの定義が複雑なので、クラス全体のthisを参照するためにonPressButtonメソッドをバインドしてthisを渡しています。

.bind(this)しないでthis.state.countにアクセスをしようとした場合、thisが指し示すのはonPressButton()なので、参照エラーになってしまいます。注意してください。

import React, { Component } from 'react';
import { Text, Button, View} from 'react-native';


export default class HelloWorldApp extends Component {

  constructor(){
    super()
    this.state = {
      count: 0
    }
  }

  onPressButton(){
   this.state.count += 1 ;
   console.log(this.state.count);
  }

  render() {
    return (
      <View>
        <Text>Hello world!</Text>
        <Button 
          onPress={this.onPressButton.bind(this)}
          title='counter'
        />
      </View>
    );
  }
}

Textにcountの反映

UIに値を設定するにはstateプロパティを{}で囲んでいれてあげればstateの値が設定されます。

値更新の際の反映は、setState()というメソッドが用意されているので、setStateでcountの値を変更するとUIが自動的に更新されます。

import React, { Component } from 'react';
import { Text, Button, View} from 'react-native';

export default class HelloWorldApp extends Component {

  constructor(){
    super()
    this.state = {
      count: 0
    }
  }

  onPressButton(){
    this.setState({count: this.state.count+= 1});
  }

  render() {
    return (
      <View>
        <Text>{this.state.count}</Text>
        <Button 
          onPress={this.onPressButton.bind(this)}
          title='counter'
        />
      </View>
    );
  }
}