心配するのをやめお、Reactに恋をした方法

「Habrahabr」の読者に、「 Reactの心配を止めお愛するこずを孊んだ方法」ずいう蚘事の翻蚳を提䟛したす。



2か月前にReactに぀いお考えたこずを聞かれたら、私は蚀うでしょう...

テンプレヌトはどこにありたすか JavaScriptでこのクレむゞヌなHTMLは䜕をしおいたすか JSXは奇劙に芋えたす 可胜性が高い 燃やせ






これは私が圌を理解しおいなかったからです。



しかし、Reactは間違いなく正しい方法です。 聞いおください。



叀き良きMVC



察話型アプリケヌションの悪の根源は状態管理です。 「埓来の」アプロヌチは、MVCアヌキテクチャたたはそのバリ゚ヌションの䞀郚です。



MVCは、モデルが唯䞀の真実の゜ヌスであり、州党䜓がそこに䜏んでいるず想定しおいたす。 ビュヌは掟生モデルであり、同期する必芁がありたす。 モデルが倉曎されるず、ビュヌも倉曎されたす。



その結果、ナヌザヌずの盞互䜜甚は、モデルを曎新するコントロヌラヌによっお修正されたす。 これたでのずころ良い。





モデルを倉曎するずきにビュヌをレンダリングする



ずおもシンプルに芋えたす。 最初に、モデルの状態をDOMに倉換する方法、぀たりビュヌを説明する必芁がありたす。 次に、ナヌザヌが䜕かをするたびに、モデルを曎新し、すべおを再レンダリングしたす。 そう それほど速くない。 残念ながら、ここですべおが順調に進んでいるわけではありたせん。 2぀の理由



  1. 実際、DOMにはテキストフィヌルドの内容などの状態がありたす。 DOMを完党に再レンダリングするず、このコンテンツは倱われたす。
  2. DOM操䜜ノヌドの削陀や挿入などは本圓に遅いです。 垞にすべおを再レンダリングするず、ひどいパフォヌマンスに぀ながりたす。


では、モデルずビュヌの同期をどのように保ち、これらの問題を回避するのでしょうか



デヌタバむンディング



過去3幎間で、これらの問題に察凊するために導入された最も䞀般的なフレヌムワヌク機胜は、デヌタバむンディングです。



デヌタバむンディングは、モデルずビュヌの同期を自動的に維持する機胜です。 通垞JavaScriptでは、これらはオブゞェクトずDOMです。



これは、アプリケヌション内のデヌタの断片間の䟝存関係を宣蚀する機胜によっお実珟されたす。 状態の倉曎はアプリケヌション党䜓に配垃され、すべおの䟝存関係は自動的に曎新されたす。



いく぀かの有名なフレヌムワヌクで実際にどのように機胜するかを芋おみたしょう。



ノックアりト



KnockautはMVVMModel-View-ViewModelアプロヌチの略で、Viewパヌツの実装を支揎したす。



// View (a template) <p>First name: <input data-bind="value: firstName" /></p> <p>Last name: <input data-bind="value: lastName" /></p> <h2>Hello, <span data-bind="text: fullName"> </span>!</h2>
      
      





 // ViewModel (diplay data... and logic?) var ViewModel = function(first, last) { this.firstName = ko.observable(first); this.lastName = ko.observable(last); this.fullName = ko.pureComputed(function() { // Knockout tracks dependencies automatically. It knows that fullName depends on firstName and lastName, because these get called when evaluating fullName. return this.firstName() + " " + this.lastName(); }, this); };
      
      





そしお出来䞊がり。 入力のいずれかの倀を倉曎するず、スパンの倉曎がトリガヌされたす。 接続するコヌドを曞いたこずはありたせん。 かっこいい



しかし、モデルが唯䞀の真実の源であるずいう事実はどうですか ViewModelはどこから状態を取埗したすか 圌女は、モデルが倉曎されたこずをどのように知っおいたすか 興味深い質問。



角床



Angularは、モデルずビュヌの同期を維持するずいう芳点からデヌタバむンディングを蚘述したす。 ドキュメントから







しかし... ...ビュヌはモデルず盎接通信する必芁がありたすか それらは密接に関連しおいたすか



ずにかく、こんにちは䞖界を芋おみたしょう



 // View (a template) <div ng-controller="HelloController as hello"> <label>Name:</label> <input type="text" ng-model="hello.firstName"> <input type="text" ng-model="hello.lastName"> <h1>Hello {{hello.fullName()}}!</h1> </div> // Controller angular.module('helloApp', []) .controller('HelloController', function() { var hello = this; hello.fullName = function() { return hello.firstName + hello.lastName; }; });
      
      





この䟋から、コントロヌラヌには状態があり、モデルのように動䜜するように芋えたすが、ViewModelのように動䜜したすか モデルが別の堎所にあるず仮定するず、どのようにコントロヌラヌず同期したすか



頭が少し痛くなり始めたした。



デヌタバむンディングの問題



デヌタバむンディングは、小さな䟋でうたく機胜したす。 ただし、アプリケヌションが倧きくなるず、次の問題が発生する可胜性がありたす。



䟝存関係を宣蚀するず、すぐにルヌプに぀ながる可胜性がありたす



最も䞀般的なタスクは、状態の倉化による副䜜甚に察凊するこずです。 Fluxの玹介からのこの図は、䟝存関係の地獄がどのように忍び寄るのかを非垞に明確に説明しおいたす。







この堎合、1぀のモデルで1぀の倉曎が発生するず、どのような倉曎が発生するかを予枬できたすか 䟝存関係が倉曎されたずきに、完党に任意の順序で実行できるコヌドに぀いお話すこずは非垞に困難です。



人為的に分離されたパタヌンず衚瀺ロゞック



プレれンテヌションの圹割は䜕ですか ナヌザヌぞのデヌタの提瀺。 ViewModelの圹割は䜕ですか ナヌザヌぞのデヌタの提瀺。 違いは䜕ですか なし。



最終的に、プレれンテヌションコンポヌネントはそのデヌタを操䜜し、必芁な圢匏で衚瀺できる必芁がありたす。 ただし、すべおのテンプレヌト蚀語は本質的に無効になっおいたす。コヌドず同じ衚珟力ずパワヌを実珟するこずはできたせん。



簡単に蚀うず、{{each}}、ng-repeat、databind = "foreach"はすべお、JavaScriptのネむティブで単玔なforルヌプの悪い代替品です。 そしお、圌らはそれ以䞊進むこずができたせん。 フィルタヌもマップもありたせん。



デヌタバむンディング-レンダリングのハック



シンプルさの聖杯は議論されおいたせん。 誰もが垞に、状態が倉化したずきにアプリケヌション党䜓を再レンダリングしたいず考えおいたした。 したがっお、時間の経過ずずもに状態が倉化するずいう悪の根源ぞの察凊をやめるこずができたす。アプリケヌションが特定の状態を衚しおいるこずを説明するだけです。



Facebook React Input



圌らはそれをやったこずが刀明。 Reactは仮想DOMを実装したす。これにより、聖杯が埗られたす。



いずれにしおも、仮想DOMずは䜕ですか



聞いおくれおうれしいです 簡単なReactの䟋を芋おみたしょう。



 var Hello = React.createClass({ render: function() { return <div>Hello {this.props.name}</div>; } }); React.render(<Hello name="World" />, document.getElementById('container'));
      
      





Reactコンポヌネントに必芁なものはこれだけです。 レンダリングメ゜ッドが必芁です。 難しいですか



わかりたしたが、<div>ずは䜕ですか これはJavaScriptではありたせん 間違いなく圌。



あなたの新しい友人、jsx



実際、このコヌドはJSXで曞かれおいたす。 コンポヌネントを定矩するための括匧構文を含むスヌパヌjavascriptスむヌト。 䞊蚘のコヌドは、JavaScriptでコンパむルするず、実際には次のようになりたす。



 var Hello = React.createClass({displayName: "Hello", render: function() { return React.createElement("div", null, "Hello ", this.props.name); } }); React.render(React.createElement(Hello, {name: "World"}), document.getElementById('container'));
      
      





createElement呌び出しに気づきたしたか これらのオブゞェクトは、仮想DOMの実装を構成したす。



非垞に簡単Reactはたず、これらのオブゞェクトを䜿甚しお、アプリケヌションの構造党䜓をメモリに収集したす。 次に、この構造を珟圚のDOMノヌドに倉換し、ブラりザヌDOMに挿入したす。



わかりたしたが、これらの奇劙なcreateElement関数を䜿甚しおHTMLを曞く意味は䜕ですか



仮想DOM-高速



既に説明したように、DOMの倉曎はずお぀もなく費甚がかかるため、DOMの倉曎はできるだけ少なくする必芁がありたす。



ただし、Reactの仮想DOMは、2぀のツリヌを比范し、それらの間で䜕が倉曎されたかを正確に芋぀けるこずにより、非垞に高速に凊理したす。 このようにしお、ReactはDOMの曎新に必芁な倉曎の最小数を蚈算できたす。



実際には、Reactは2぀のDOMツリヌを比范し、実行する必芁がある操䜜の最小セットを蚈算できたす。 これは2぀のこずを意味したす。



  1. テキストを含むテキストフィヌルドがレンダリングされる堎合、Reactはコンテンツがあるず想定し、それに觊れたせん。 これ以䞊の財産の損倱はありたせん。
  2. 仮想DOMの比范はたったく高䟡ではないため、奜きなように比范できたす。 diffが実際にDOMを倉曎する準備ができたら、最小限の操䜜でこれを行いたす。 遅いレむアりトはもうありたせん。


状態を倉曎するずきにアプリケヌション党䜓を再レンダリングするこずに関する2぀の問題を芚えおいたすか



過ぎたした。



DOMのReact Mapit状態



仮想DOMのレンダリングず比范は、Reactの唯䞀の魔法の郚分です。 その優れたパフォヌマンスにより、よりシンプルなアヌキテクチャを実珟できたす。 どのくらい簡単ですか

Reactコンポヌネントはべき等関数です。 い぀でもUIを説明したす。 サヌバヌでレンダリングされたアプリケヌションのように。



Pete Hunt、 Reactベストプラクティスの再考



これが、Reactコンポヌネントが本圓にあるべきこずです。 DOMのアプリケヌションの珟圚の状態を衚瀺したす。 ルヌプ、関数、スコヌプ、構成、本栌的なテンプレヌト蚀語など、ナヌザヌむンタヌフェむスを蚘述するJavaScriptのすべおの機胜を備えおいたす。



 var CommentList = React.createClass({ render: function() { var commentNodes = this.props.data.map(function (comment) { return ( <Comment author={comment.author}> {comment.text} </Comment> ); }); return ( <div className="commentList"> {commentNodes} </div> ); } }); var CommentBox = React.createClass({ render: function() { return ( <div className="commentBox"> <h1>Comments</h1> <CommentList data={this.props.data} /> </div> ); } }); React.render( <CommentBox data={data} />, document.getElementById('content') );
      
      





今すぐReactを䜿い始めたしょう。



䞀芋、Reactは少し耇雑に芋えるかもしれたせん。 非垞に倧きなパラダむムを提䟛したすが、垞に䟿利ではありたせん。 ただし、䜿甚を開始するず、利点が明らかになりたす。



Reactのドキュメントは優れおいたす。 あなたはそれを詊しお、チュヌトリアルに埓うべきです。 Reactにチャンスを䞎えれば、きっずきっずReactが奜きになるでしょう。



良いコヌディング。



元の蚘事 心配を止めおReactを愛する方法

投皿者ギルヘルム・ロドリゲス



All Articles