読者です 読者をやめる 読者になる 読者になる

大学生からの Web 開発

廃れない技術よ 我が身に

React 触った

JavaScript React

Web 開発での Reactive programming の潮流に乗れていなかったことに危機感を覚えて、その界隈で最も有名な JS ライブラリ React を触った。以降、v0.12.2 での話。

やったのは、公式チュートリアルと一人React.js Advent Calendar 2014を10日目まで読んだこと。

これも読んだほうがいい。

成果はこちら。

上のはTutorial そのまんまの内容で、下のはこういうカウンターを作っただけ。でも意外と詰まった。

f:id:karur4n:20150303163015g:plain

感想

MVC でいう V だけを扱うライブラリなので、やることは多くなくて触りやすい。React.createClass で Component を定義して、React.renderレンダリング。Component 間は props っていうプロパティ群のオブジェクトを用いてやりとりする。これが基本。

感想書こうと思ってもこれまで JS を追いかけられていないので、何かと比較してどうかって書けない。Component でノードの親子関係やイベントを管理しやすくなってうれしい、って感じ。

あと、Component のタグに onClick とかを書いていくことや、コードのロジック内にマークアップすることってどうなんだろうと思ったけど、それはこれを読んでスッキリ納得した。

「関心の分離(Separation of concerns)」ではなくて「技術の分離(Separation of technologies)」だとしていて、マークアップとViewのロジックは密であるべきとしています。

reactjs - React.jsのComponentについて - Qiita

ただ良さげなテンプレートが出たらそれを使いそうな気はする。

詰まったとこ

Counter を作る際に詰まった。カウントされる値をどこで持つかだ。

f:id:karur4n:20150303163015g:plain

当初は、こういう構成にしていた。

  • Counter
    • CountNum (カウント値を表示する Component)
    • CountForm (Up, Down させるボタンの Component)

React は値やイベントのやりとりは親と子で行い、隣接する Component とは直接にはできないっぽい。 CountFormonClick を受けて、Counter のイベントを発火させて Counter から CountNum のイベントを発火させて CountNumstate を変化させる、っていう多重がだるかった。

結局、めんどくさくなって Counter Component で count を表示することにした。

【追記】

何にもつらくなった。

Counter で state.count を持って、それを CountNum, CountForm に配って、それらの子 Component は componentWillReceiveProps で受ければいいだけだった。componentWillReceiveProps については以下で書いてる。

【追記終わり】

あと、もうひとつ。

var Counter = React.createClass({
  getInitialState: function() {
    return {count: 0};
  },
  addable: function() {
    n > 0 || (n < 0 && this.state.count > 0)
  },
  changeCount: function(n) {
    if (this.addable) {
      this.setState({count: this.state.count + n});
    }
  },
  render: function() {
    return (
      <div className="counter">
        {this.state.count}
        <CountForm count={this.state.count} handleCount={this.changeCount} />
      </div>
    );
  }
});

Counter の値が 0 以下なら、Down ボタンを disabled にしようとしてちょっとつまづいた。CountFormthis.props.count の値と Counterthis.state.count の値が異なるのだ。Up, Down するにしても this.props.count の値が期待のものより ±1 違った。

CountFormcomponentWillReceiveProps を使うことで解決した。state に依存した props をやりとりするときは、componentWillReceiveProps(nextProps) で新しい props を取得できる。

Updating: componentWillReceiveProps - Component Specs and Lifecycle | React

うまく説明できていないのは、React に対する自信がないから。

勉強する動機

モバイル環境でネイティブ並みの速度が出ればうれしい。Web 開発の手軽さでアプリを作りたい。

前線に走らないといけない

僕は、2013年〜2014 年の JS 界隈が Backbone とか AngularJS に代表される MVC フレームワークで盛り上がっていた様子をやるやる詐欺で外部から見ていた人間なんだけど、今回の React の潮流もそれに見えて、「結局それらを使うことで自身の問題解決につながっている人は少ない、今回の React もまだ使う必要ないんじゃないか」と思っていた。

でも、それは間違いかもしれない。その時代の前線を走ることで、「後発で出たこのライブラリは、過去の辛かったこういう部分が解決されたものなんだ。」と文法のみにとどまらない知識が身につき、理解を深める。前線を築いていくことは、自分をプロのエンジニアに押し上げてくれる。うーん、励みたい。