tixture55’s diary

主にプログラミング関係の日記です。

react.js触ってみた感想

Djangoの学習のついでにフロントエンドをreact.jsにして、いまさらながらいろいろ触ってみました。その備忘録。

 

Reactの基本的な考え方

  •  Component間での親子の関係を意識して、親がStateを持っていて子にPropとして渡す というのが基本
  • Stateはブラウザを閉じたり、リロードするまでは保持される
  • renderで返すComponentは単一の親でなければならない

 

createClass({})

とにもかくにも、reactの開発ではまず、React.createClass({})でコンポーネントを作成する。

var Parent = React.createClass({
getInitialState: function(){
return {
//初期値を定義
}
}
})

 

 

下記のように初期値、返すマークアップを定義する。このとき、子をタグとして定義できる。 

var Parent = React.createClass({
//State(状態は親が管理)
getInitialState: function() {
return {
textval: "",
children: []
};
},
// State(textVal)を変更
setStateTextVal: function(textVal) {
this.setState({ textVal: textVal });
},

//<Parent />の表示
render: function() {
return (
<div>
<p>入力してEnterを押す</p>
<ChildInput onChange={this.setStateTextVal} onSave={this.setStateChildren} />
<Child textVal={this.state.textVal} children={this.state.children} />
</div>
);
}
});

 子側では、関数を持ったマークアップとアクション毎に実行される関数を定義する。

 

予め定義された配列を読み込む

例えば、入力された英単語(apple)について、用法を表示するアプリだと、下記のように子側のreturnに返したい用法をベタ書きするのは好ましくない。

return (
<div>
<ul>
<li>this is a baked apple.(これは焼きリンゴだ)</li>
<li>An apple is round in shape.(りんごの形は丸い。)</li>
<li>The apple fell from the tree.(りんごが木から落ちた。)</li>
</ul>
</div>
);

上記の用法を予め配列として定義しておけば、変数として読むことで子側で使用できる。

<script type="text/jsx">

const numbers = [this is a baked apple.(これは焼きリンゴだ),
         An apple is round in shape.(りんごの形は丸い。),
        The apple fell from the tree.(りんごが木から落ちた。)];
const listItems = numbers.map((number) =>
<li>{number}</li>
);

// 親:<Parent />の定義
var Parent = React.createClass({
           //以下略 return (

//子側のreturn処理
return(
<div>
<ul>{listItems}</ul>
</div>
);
);

フックのポイント

例えば、componentDidMountはコンポーネントレンダリングされた後に実行される。

 

componentDidMount : function() {    
    this.loadCommentsFromServer(); 
},

ここでは、loadCommentsFromServerを呼び出している。 チュートリアルではここにAjaxの処理を書いてるので、それにならって、pythonからの結果を取得する処理を書く予定。処理はできるだけ小分けにする。

 

まとめ

いろいろ書いたあとに気づいたのですが、私が書いてたのってES5でした。しかし、もちろん本家は、

Our eventual goal is for ES6 classes to replace React.createClass completely,

 とおっしゃっておりますので、今後はES6で書いていきたいと思います。