React 触った
Web 開発での Reactive programming の潮流に乗れていなかったことに危機感を覚えて、その界隈で最も有名な JS ライブラリ React を触った。以降、v0.12.2
での話。
やったのは、公式チュートリアルと一人React.js Advent Calendar 2014を10日目まで読んだこと。
これも読んだほうがいい。
成果はこちら。
上のはTutorial そのまんまの内容で、下のはこういうカウンターを作っただけ。でも意外と詰まった。
感想
MVC でいう V だけを扱うライブラリなので、やることは多くなくて触りやすい。React.createClass
で Component を定義して、React.render
でレンダリング。Component 間は props
っていうプロパティ群のオブジェクトを用いてやりとりする。これが基本。
感想書こうと思ってもこれまで JS を追いかけられていないので、何かと比較してどうかって書けない。Component でノードの親子関係やイベントを管理しやすくなってうれしい、って感じ。
あと、Component のタグに onClick とかを書いていくことや、コードのロジック内にマークアップすることってどうなんだろうと思ったけど、それはこれを読んでスッキリ納得した。
「関心の分離(Separation of concerns)」ではなくて「技術の分離(Separation of technologies)」だとしていて、マークアップとViewのロジックは密であるべきとしています。
ただ良さげなテンプレートが出たらそれを使いそうな気はする。
詰まったとこ
Counter を作る際に詰まった。カウントされる値をどこで持つかだ。
当初は、こういう構成にしていた。
CounterCountNum (カウント値を表示する Component)CountForm (Up, Down させるボタンの Component)
React は値やイベントのやりとりは親と子で行い、隣接する Component とは直接にはできないっぽい。
CountForm
で onClick
を受けて、Counter
のイベントを発火させて Counter
から CountNum
のイベントを発火させて CountNum
の state
を変化させる、っていう多重がだるかった。
結局、めんどくさくなって 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 にしようとしてちょっとつまづいた。CountForm
の this.props.count
の値と Counter
の this.state.count
の値が異なるのだ。Up, Down するにしても this.props.count
の値が期待のものより ±1 違った。
CountForm
で componentWillReceiveProps
を使うことで解決した。state に依存した props をやりとりするときは、componentWillReceiveProps(nextProps)
で新しい props を取得できる。
Updating: componentWillReceiveProps - Component Specs and Lifecycle | React
うまく説明できていないのは、React に対する自信がないから。
勉強する動機
モバイル環境でネイティブ並みの速度が出ればうれしい。Web 開発の手軽さでアプリを作りたい。
前線に走らないといけない
僕は、2013年〜2014 年の JS 界隈が Backbone とか AngularJS に代表される MVC フレームワークで盛り上がっていた様子をやるやる詐欺で外部から見ていた人間なんだけど、今回の React の潮流もそれに見えて、「結局それらを使うことで自身の問題解決につながっている人は少ない、今回の React もまだ使う必要ないんじゃないか」と思っていた。
でも、それは間違いかもしれない。その時代の前線を走ることで、「後発で出たこのライブラリは、過去の辛かったこういう部分が解決されたものなんだ。」と文法のみにとどまらない知識が身につき、理解を深める。前線を築いていくことは、自分をプロのエンジニアに押し上げてくれる。うーん、励みたい。