サンプルコードをいろいろ試してみたんだけど、さっぱり理解できないので、本家のチュートリアルをやりました。
ところどころ Qiita みながら。
基礎
React と React Native の違い
構成要素
React | Webコンポーネント |
React Native | Nativeコンポーネント |
React Native は ES2015(import, from, class, and extends)をサポートしてる
JSX
<View><Text>Hello world!</Text></View>
- JavaScriptにXMLを埋め込む構文
- 多くのフレームワークはマークアップ言語の中にコードを埋め込むけど、Reactはマークアップ言語をコード内に書く
- HTMLに似てるけど<div>とかを使用するのではなくReact Nativeコンポーネントを使用する
- <Text>は、テキストを表示するための組み込みコンポーネント。<span>みたいな感じ。
- <View>は、<div>みたいな感じ
Components(コンポーネント)
コンポーネント、HelloWorldAppを定義
export default class HelloWorldApp extends Component { render() { return ( <View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}> <Text>Hello, world!</Text> </View> ); } }
- React Nativeアプリを作るときは、たくさんコンポーネントを作ることになる
- 画面に表示されるものは、すべて何かしらのコンポーネント
- コンポーネントに必須なものは、JSXを返すレンダリング機能
コンポーネントを制御するデータタイプには、propsとstate ってのがある。
props
- 親から渡されるイミュータブルなデータ
- コンポーネント内で値を書き換えることはない
- xxx='hoge'のようにタグ属性として使う
- 変数を使うときは{}でくくる。<Text>Hello {this.props.name},</Text>
画像を表示するコンポーネント
import React, {Component} from 'react'; import { AppRegistry, Image } from 'react-native'; export default class App extends Component { render() { let pic = { uri: 'https://upload.wikimedia.org/wikipedia/commons/d/de/Bananavarieties.jpg' }; return ( <Image source={pic} style={{width: 193, height: 110}}/> ); } } AppRegistry.registerComponent('HelloWorldApp', () => App);
- 画像を表示するコンポーネントを作るときは、sourceというpropを使用する
- {pic}は、変数picをJSXに埋め込んでいる
- propsは別のコンポーネントに値やコールバック関数を渡すことができる
親コンポーネントから子コンポーネントに渡すとき
<Child props={value}/>
子コンポーネント(Child)では、渡された値(value)をpropsという名前で扱う
イベントを親に伝える場合はpropsでハンドラを渡す
コンポーネント側
onPressイベントで、親から貰ったprops.onClickが呼ばれる
<Button onPress={this.props.onClick} />
使い方
_onClick(){ console.log('Clicked!!!'); } <MyButton onClick={this._onClick} />
state
- コンポーネント内で保持している状態を管理するオブジェクト
- 他のコンポーネントとはやりとりしない
- 値を書き換えるときは setState()メソッドを使う
- 値が変更されると(setState()すると)、勝手にrenderが走りコンポーネントが再描画される
コンストラクタで初期値を設定し
constructor(props) { super(props); this.state={ x: 0, }; }
setStateで更新
this.setState({x: 1});
構文
コンポーネントの宣言
export default class App extends Component<{}> {
export default
他のモジュールからインポートできるようになる。
extends Component
必須。Reactのコンポーネントを宣言
<{}>
flowの書式
renderメソッド
render() { return ( // <View>,<Text> React Nativeの書式 // Reactだと<div>とか<span> <View style={styles.container}> <Text style={styles.welcome}> Welcome to React Native! </Text> <Text style={styles.instructions}> To get started, edit App.js </Text> <Text style={styles.instructions}> {instructions} </Text> </View> ); }
render内でreturnしたものが、画面に表示される。
<View>とか<Text>
React Nativeの書式。Reactだと<div>とか<span>とか使う。
View
- divな感覚で使用する
- 中に文字はかけない
Text
- spanな感覚で使用する
- 文字を描画する場合はTextで囲う
StyleSheet
const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: '#F5FCFF', }, welcome: { fontSize: 20, textAlign: 'center', margin: 10, }, instructions: { textAlign: 'center', color: '#333333', marginBottom: 5, }, });
CSS in JS で定義する
CSSをJavaScriptのオブジェクトとして定義する
CSS in JS のルール
- background-colorみたいにハイフンがあるのはbackgroundColorって感じでキャメルケースで定義する
- 数字以外のプロパティは文字列で定義する。ふつうのcssだとredとかが使えるけど、CSS in JS では 'red' って書く
- セレクタはない(p とか .class とか)
- style属性にスタイルを適用する
最初のうちはcreateメソッドだけを覚えておく
https://qiita.com/YutamaKotaro/items/d0cd253c998f9b28dd55
<View style={styles.container}> → containerっていうスタイルを styleっていう変数に定義
<Text style={styles.welcome}> → welcomeっていうスタイルを styleっていう変数に定義
<Text style={styles.instructions}> → instructionsっていうスタイルを styleっていう変数に定義
container: { flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: '#F5FCFF', },
flex
- flex: 1 で画面全体表示
- flexプロパティは画面上に対する要素のflexDirection方向の大きさの比率
- position:'fixed'がない
const style = StyleSheet.create({ container:{ marginTop:20, flex:1, //flexDirection:'column' ##defaultValue } });
↑要素がないときは目一杯広がるが、要素が増えると均等割になる
こんな感じ↓
コンポーネント
export default class App extends Component<{}> { // renderメソッド // ここでreturnしたものが画面に表示される render() { return ( // <View>,<Text> React Nativeの書式 // Reactだと<div>とか<span> <View style={styles.container}> <View style={styles.header}> <Text style={styles.title}>たいとる</Text> </View> <View> <Text style={styles.mainContents}>めいんこんてんつ</Text> </View> </View> ); } }
スタイル
const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: 'skyblue', }, header: { //fontSize: 20, //textAlign: 'center', //margin: 10, flex: 0.5, backgroundColor: 'pink' }, title: { marginTop: 100, textAlign: 'center', fontSize: 40, }, mainContents: { marginTop: 100, textAlign: 'center', fontSize: 20, } });
↓これは flexと同じ
justifyContent: 'center', alignItems: 'center',
flex: 1, flexDirection: 'row'
const styles = StyleSheet.create({ container: { flex: 1, flexDirection: 'row', backgroundColor: 'skyblue', },
これは
こうなる
コンポーネント内のユーザ定義関数
- 関数内のthisはグローバルオブジェクトを指す
- そのため、そのままthis.props.hogeを参照してもundefinedになる
- なのでメンバ関数の
bind(this)
を呼んでComponent自身がthisになるように指定する - それかアロー関数にしておいて、参照元がthisとなるように仕向けてもOK
ライフサイクル
render()
- 描画する要素を返す
- ここで setState() しちゃダメ
マウントのときに呼ばれる
コンポーネントマウント時に一度だけ実行される
constractor(props)
- super(props) を必ず呼ぶこと
- state の初期化をする
componentWillMount()
このメソッドはReactバージョン17で削除されるみたい(Nativeも?)
- render() 直前の処理
- ここでthis.setState()を行うと、render() は更新されたstateを参照する。
componentDidMount()
- render() 後に呼ばれる
- DOMが存在するので、DOMが触れる
- this.setState() できる
更新のときに呼ばれる
componentWillReceiveProps(object nextProps)
このメソッドはReactバージョン17で削除されるみたい(Nativeも?)
- 新しい props を受け取ると実行する
- props で state を変更するには this.setState() する
- 更新時ライフサイクル内で this.setState できるのはここのみ
- この関数内で this.setState が、さらに render() を実行することはない
componentWillUpdate(object nextProps, object nextState)
このメソッドはReactバージョン17で削除されるみたい(Nativeも?)
- render() 前に呼ばれる
- this.setState() はやっちゃダメ
- componentWillUpdate() と render() の間のタイミグで this.props, this.state で参照できる値を更新することができる
shouldComponentUpdate(object nextProps, object nextState)
- パフォーマンスチューニングのときに使う
- returnはbool
- falseを返したら、以降のcomponentWillUpdate()、render()、componentDidMount()がスキップされる
- ここで this.setState() すると無限ループに入るので、使ってはいけない
componentDidUpdate(object prevProps, object prevState)
- 新しいDOMが触れる
- this.setState() を呼んではいけない
アンマウントのときに呼ばれる
componentWillUnmount()
- アンマウントのときに呼ばれる
- リソースの開放とか、後処理する
おしまい
先がまだまだ長い〜
GOはサボり気味です。いそがしくて、いそがしくて。やりたいこといっぱいあるのになぁ