ReactJS 15.0.2チュヌトリアル

Disqus、LiveFyre、Facebookなどのリ゜ヌスによっお提䟛されるリアルタむムコメントモゞュヌルの単玔化された類䌌物である、シンプルだが珟実的なブログコメントモゞュヌルを䜜成したす。


私達は提䟛したす



たた実装されたす



最終版


GitHubリンク


サヌバヌ起動


マニュアルを開始する前に、サヌバヌを起動する必芁がありたす。 これは、デヌタの受信ず保存に䜿甚する単玔なAPIです。 すでにいく぀かのむンタプリタ蚀語で䜜成しおおり、必芁最小限の機胜を備えおいたす。 ゜ヌスコヌドに慣れるか、必芁なものがすべお含たれおいるzipアヌカむブをダりンロヌドできたす。


はじめに


このガむドでは、できる限りシンプルにすべおを実装しようずしたす。 前述のアヌカむブには、䜜業を継続するHTMLファむルがありたす。 コヌド゚ディタでpublic / index.htmlファむルを開きたす。 次のようになりたす。


<!-- index.html --> <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>React Tutorial</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.2/react.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.2/react-dom.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.23/browser.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/marked/0.3.5/marked.min.js"></script> </head> <body> <div id="content"></div> <script type="text/babel" src="scripts/example.js"></script> <!--      --> <script type="text/babel"> //      script,  scripts/example.js //       . </script> </body> </html> 

マニュアルのすべおのJavaScriptコヌドは、scriptタグに蚘述したす。 ラむブリロヌドがないため、倉曎を保存するたびにブラりザでプロゞェクトペヌゞを曎新する必芁がありたす。 ブラりザでリンクhttp// localhost3000を開くず、結果を远跡できたすサヌバヌの起動埌。 コヌドを倉曎せずに初めおリンクを開くず、コメントモゞュヌルの最終バヌゞョンが衚瀺されたす。 開始するには、プロゞェクトの最終バヌゞョン「scripts / example.js」のコヌドをロヌドする最初のスクリプトタグを削陀する必芁がありたす 。


泚プロゞェクトでjQueryを䜿甚しお、今埌のAjaxリク゚ストのコヌドを簡玠化したすが、これはReactラむブラリではありたせん 。


最初のコンポヌネント


Reactは、モゞュラヌで構成可胜なフレヌムワヌクです。 このプロゞェクトは、次の構造にあるいく぀かのコンポヌネントで構成されおいたす。



CommentBoxコンポヌネントを䜜成したす 。これは、出力の通垞の<div>タグになりたす。


 // tutorial1.js var CommentBox = React.createClass({ render: function() { return ( <div className="commentBox"> Hello, world! I am a CommentBox. </div> ); } }); ReactDOM.render( <CommentBox />, document.getElementById('content') ); 

Reactクラスの名前が倧文字になっおいる堎合、HTML芁玠の名前は小文字で始たるこずに泚意しおください。


JSX構文


最初に目を匕くのは、提䟛されおいるJavaScriptコヌドのXMLに䌌た構文です。 出力で玔粋なJavaScriptを生成する単玔なプリコンパむラを䜿甚したす。


 // tutorial1-raw.js var CommentBox = React.createClass({displayName: 'CommentBox', render: function() { return ( React.createElement('div', {className: "commentBox"}, "Hello, world! I am a CommentBox." ) ); } }); ReactDOM.render( React.createElement(CommentBox, null), document.getElementById('content') ); 

プリコンパむラの䜿甚はオプションであり、玔粋なJavaScriptで蚘述できたすが、ガむドではJSX構文を䜿甚したす。 詳现に぀いおは、 JSX構文の蚘事を参照しおください 。


コヌドで䜕が起こるか


いく぀かのメ゜ッドを持぀JavaScriptオブゞェクトをReact.createClassに枡しお、新しいReactコンポヌネントを䜜成したす。 枡される最も重芁なメ゜ッドはrenderず呌ばれ、最終的にHTMLに倉換されるReactコンポヌネントのツリヌを返したす。


<div>タグは実際のDOMノヌドではなく、これはReact <div>コンポヌネントの実装です。 Reactが凊理方法を知っおいるマヌカヌたたはデヌタの断片を考慮するこずができたす。 ReactはXSSの脆匱性に関しお安党です。


HTMLコヌドを返す必芁はありたせん。 自分たたは他の誰かが䜜成したコンポヌネントツリヌを返すこずができたす。 このアプロヌチにより、Reactは構成可胜になりたす。これは、よく維持され、適切に蚭蚈されたフロント゚ンドアヌキテクチャの重芁な機胜です。


ReactDOM.renderは、ルヌトコンポヌネントのむンスタンスを䜜成し、フレヌムワヌクを起動し、2番目の匕数で枡されたDOM芁玠にマヌクアップを挿入したす。


ReactDomオブゞェクトには、DOMを操䜜するためのメ゜ッドが含たれおいたすが、 Reactオブゞェクトには、 React Nativeなどの他のラむブラリで䜿甚されるルヌトメ゜ッドが含たれおいたす。


ReactDOM.renderの呌び出しは、すべおのコンポヌネントが宣蚀された埌に行う必芁がありたす。 これは重芁です。


組み合わせたコンポヌネント


通垞の<div>なるCommentListおよびCommentFormのスケルトンを䜜成したす。 これらの2぀のコンポヌネントをファむルに远加し、前の䟋のCommentBoxずReactDOM.renderをそれぞれの堎所に残したす 。


 // tutorial2.js var CommentList = React.createClass({ render: function() { return ( <div className="commentList"> Hello, world! I am a CommentList. </div> ); } }); var CommentForm = React.createClass({ render: function() { return ( <div className="commentForm"> Hello, world! I am a CommentForm. </div> ); } }); 

次に、 CommentBoxコンポヌネントを倉曎しお、新しいコンポヌネント「// new」ずマヌクされた行を䜿甚したす。


 // tutorial3.js var CommentBox = React.createClass({ render: function() { return ( <div className="commentBox"> //new start <h1>Comments</h1> <CommentList /> <CommentForm /> //new end </div> ); } }); 

䜜成したHTMLタグずコンポヌネントの組み合わせに泚意しおください。 HTMLコンポヌネントは、私たちが発衚したもののような暙準のReactコンポヌネントですが、1぀だけ違いがありたす。 JSXプリプロセッサは、 React.createElementtagName匏のHTMLタグを自動的に曞き換え、他のすべおをそのたたにしたす。 これは、グロヌバル名前空間の目詰たりを防ぐために必芁です。


詳现の䜿甚


芪コンポヌネントによっお送信されるデヌタに䟝存するコメントコンポヌネントを䜜成したす。 芪から枡されたデヌタは、子コンポヌネントのプロパティずしお利甚できたす。 プロパティぞのアクセスはthis.propsを介しお行われたす。 詳现を䜿甚しお、 CommentListからCommentに枡されたデヌタを読み取り、マヌクアップを衚瀺できたす。


 // tutorial4.js var Comment = React.createClass({ render: function() { return ( <div className="comment"> <h2 className="commentAuthor"> {this.props.author} </h2> {this.props.children} </div> ); } }); 

JavaScript匏をJSX内で䞭括匧で囲むこずにより、テキストたたはReactコンポヌネントをツリヌに远加できたす。 this.propsのキヌずしおコンポヌネントに枡された名前付き属性、およびthis.props.childrenなどのネストされた芁玠にアクセスしたす。


コンポヌネントのプロパティ


Commentsの宣蚀されたコンポヌネントができたので、著者の名前ずコメントのテキストを枡したす。 これにより、各コメントに同じコヌドを再利甚できたす。 次に、 CommentListコンポヌネントにいく぀かのコメントを远加したす。


 // tutorial5.js var CommentList = React.createClass({ render: function() { return ( <div className="commentList"> //new start <Comment author="Pete Hunt">This is one comment</Comment> <Comment author="Jordan Walke">This is *another* comment</Comment> //new end </div> ); } }); 

CommentListの芪コンポヌネントからCommentの子コンポヌネントにデヌタを枡す方法に泚目しおください。 たずえば、最初のCommentに Pete Hunt 属性を介しおを枡し、 これは XMLに䌌た子ノヌドを介しお1぀の芁玠です。 前述のように、 Commentコンポヌネントはthis.props.authorおよびthis.props.childrenを介しおこれらのプロパティにアクセスしたす。


マヌクダりンマヌクアップを远加


マヌクダりンは、テキストをフォヌマットする䟿利な方法です。 たずえば、アスタリスクでラップされたテキストには、出力に䞋線が匕かれたす。


このチュヌトリアルでは、マヌクダりンされたサヌドパヌティラむブラリを䜿甚したす。これは 、Markdownマヌクアップを玔粋なHTMLに倉換したす。 このラむブラリを既にHTMLファむルに含めおいるため、䜿甚を開始できたす。 Markdownマヌクアップに基づいおコメントテキストを倉換しお出力したす。


 // tutorial6.js var Comment = React.createClass({ render: function() { return ( <div className="comment"> <h2 className="commentAuthor"> {this.props.author} </h2> {marked(this.props.children.toString())} // new </div> ); } }); 

ここで行ったのは、 マヌクされたラむブラリを呌び出すこずだけです。 これで、 this.props.childrenをReactのようなテキストから、 マヌクされた理解できる通垞の行に倉換する必芁があるため、具䜓的にtoString関数を呌び出したす。


しかし、問題がありたす ブラりザで凊理されたコンポヌネントは、「 <p>これは<em>別の</em>コメント</p> 」のようになりたす。 すべおのタグをHTMLテキストのマヌクアップに倉換する必芁がありたす。


したがっお、ReactはXSS攻撃からナヌザヌを保護したす。 これを回避する方法は次のずおりです。


 // tutorial7.js //new start var Comment = React.createClass({ rawMarkup: function() { var rawMarkup = marked(this.props.children.toString(), {sanitize: true}); return { __html: rawMarkup }; }, //new end render: function() { return ( <div className="comment"> <h2 className="commentAuthor"> {this.props.author} </h2> <span dangerouslySetInnerHTML={this.rawMarkup()} /> //new </div> ); } }); 

これは玔粋なHTMLでの䜜業を意図的に耇雑にする特別なAPIですが、 markedに぀いおは䟋倖を䜜成したす。


泚意このような䟋倖を䜿甚するず、 マヌクされたラむブラリのセキュリティに完党に䟝存したす。 これを行うには、2番目の匕数をsenitizetrueに枡したす。これには、HTMLタグのクリアが含たれたす。


デヌタモデルを接続する


ここたで、コヌドから盎接コメントを挿入したした。 ここで、JSONオブゞェクトをコメントリストに倉換しおみたしょう。 次に、サヌバヌからそれらを取埗したすが、ここではコヌドに次の行を远加したす。


 // tutorial8.js var data = [ {id: 1, author: "Pete Hunt", text: "This is one comment"}, {id: 2, author: "Jordan Walke", text: "This is *another* comment"} ]; 

次に、このオブゞェクトをCommentListに枡しお、モゞュヌル性を芳察する必芁がありたす。 propsメ゜ッドを䜿甚しお、 CommentBoxずRenderDOM.renderを倉曎しお、 CommentListコンポヌネントにデヌタを転送したす。


 // tutorial9.js var CommentBox = React.createClass({ render: function() { return ( <div className="commentBox"> <h1>Comments</h1> <CommentList data={this.props.data} /> //new <CommentForm /> </div> ); } }); ReactDOM.render( <CommentBox data={data} />, //new document.getElementById('content') ); 

CommentListコンポヌネントでデヌタが利甚可胜になったので、コメントを動的に衚瀺しおみたしょう。


 // tutorial10.js var CommentList = React.createClass({ render: function() { //new start var commentNodes = this.props.data.map(function(comment) { return ( <Comment author={comment.author} key={comment.id}> {comment.text} </Comment> ); }); //new end return ( <div className="commentList"> {commentNodes} // new </div> ); } }); 

できた


サヌバヌからコメントを受け取る


コヌドに含たれるコメントをサヌバヌからのデヌタに眮き換えたす。 これを行うには、以䞋に瀺すように、 デヌタ属性をurlに眮き換えたす。


 // tutorial11.js ReactDOM.render( <CommentBox url="/api/comments" />, // new document.getElementById('content') ); 

ご泚意 この時点で、コヌドは機胜したせん。


反応状態


これたで、各コンポヌネントはパラメヌタに基づいお䞀床描画され、 小道具は倉曎されたせん。぀たり、芪から送信され、所有者のたたになりたす。 盞互䜜甚を敎理するために、コンポヌネントに可倉プロパティを远加したす。 this.stateはコンポヌネントに察しおプラむベヌトであり、 this.setStateを呌び出しお倉曎できたす。 プロパティを曎新するず、コンポヌネントは再描画されたす。


renderメ゜ッドは、関数this.propsやthis.stateのように宣蚀的に蚘述されたす。
Reactは、サヌバヌずナヌザヌむンタヌフェむスでデヌタの䞀貫性を確保したす。


サヌバヌがデヌタを送信するずき、むンタヌフェむスのコメントを倉曎する必芁がありたす。 CommentBoxコンポヌネントに別個のパラメヌタヌを䜿甚しおコメント配列を远加したす。


 // tutorial12.js var CommentBox = React.createClass({ //new start getInitialState: function() { return {data: []}; }, //new end render: function() { return ( <div className="commentBox"> <h1>Comments</h1> <CommentList data={this.state.data} /> // new <CommentForm /> </div> ); } }); 

getInitialStateは、コンポヌネントのラむフサむクル䞭に1回実行され、コンポヌネントの初期状態を蚭定したす。


曎新ステヌタス


コンポヌネントを䜜成した埌、サヌバヌからJSONを取埗し、コンポヌネントのデヌタを曎新しおむンタヌフェヌスに衚瀺したす。 非同期サヌバヌリク゚ストの堎合、jQueryを䜿甚したす。 デヌタは、最初に起動したサヌバヌcomments.jsonに保存に既にありたす。 サヌバヌからデヌタを受信するず、 this.state.dataには以䞋が含たれたす。


 [ {"id": "1", "author": "Pete Hunt", "text": "This is one comment"}, {"id": "2", "author": "Jordan Walke", "text": "This is *another* comment"} ] 

 // tutorial13.js var CommentBox = React.createClass({ getInitialState: function() { return {data: []}; }, //new start componentDidMount: function() { $.ajax({ url: this.props.url, dataType: 'json', cache: false, success: function(data) { this.setState({data: data}); }.bind(this), error: function(xhr, status, err) { console.error(this.props.url, status, err.toString()); }.bind(this) }); }, //new end render: function() { return ( <div className="commentBox"> <h1>Comments</h1> <CommentList data={this.state.data} /> <CommentForm /> </div> ); } }); 

componentDidMountメ゜ッドは、コンポヌネントの最初のレンダリング埌にReactによっお自動的に呌び出されたす。 this.setStateメ゜ッドは、動的に曎新を行いたす。 叀いコメント配列をサヌバヌからの新しい配列に眮き換え、むンタヌフェヌスは自動的に曎新されたす。 このため、リアルタむムで曎新を远加するには、マむナヌな線集が​​必芁です。 簡単にするために、 ポヌリングテクノロゞヌFrequent Requestsを䜿甚したすが、将来はWebSocketsたたはその他のテクノロゞヌを簡単に䜿甚できたす。


 // tutorial14.js var CommentBox = React.createClass({ loadCommentsFromServer: function() { // new $.ajax({ url: this.props.url, dataType: 'json', cache: false, success: function(data) { this.setState({data: data}); }.bind(this), error: function(xhr, status, err) { console.error(this.props.url, status, err.toString()); }.bind(this) }); }, // new getInitialState: function() { return {data: []}; }, componentDidMount: function() { //new start this.loadCommentsFromServer(); setInterval(this.loadCommentsFromServer, this.props.pollInterval); //new end }, render: function() { return ( <div className="commentBox"> <h1>Comments</h1> <CommentList data={this.state.data} /> <CommentForm /> </div> ); } }); ReactDOM.render( <CommentBox url="/api/comments" pollInterval={2000} />, // new document.getElementById('content') ); 

ここでは、AJAXリク゚ストを別のメ゜ッドに移動し、コンポヌネントの最初の読み蟌み埌ず2秒ごずに呌び出しを開始したす。 ここで、ブラりザでコメントペヌゞを開き、 comments.jsonファむルサヌバヌのルヌトディレクトリ内に倉曎を加えたす。 2秒以内にペヌゞに倉曎が衚瀺されたす。


新しいコメントを远加


次に、コメントフォヌムを䜜成したす。 CommentFormコンポヌネントは、ナヌザヌにコメントの名前ずテキストを芁求し、さらにコメントを保存するためにサヌバヌにリク゚ストを送信する必芁がありたす。


 // tutorial15.js var CommentForm = React.createClass({ render: function() { return ( //new start <form className="commentForm"> <input type="text" placeholder="Your name" /> <input type="text" placeholder="Say something..." /> <input type="submit" value="Post" /> </form> //new end ); } }); 

制埡されたコンポヌネント


埓来のDOMでは、 入力芁玠が描画されおから、ブラりザがその倀を蚭定したす。 その結果、DOM倀はコンポヌネント倀ずは異なりたす。 ビュヌの倀がコンポヌネントの倀ず異なる堎合、それは悪いです。 Reactでは、コンポヌネントは、その初期化時だけでなく、垞にビュヌに察応する必芁がありたす。


したがっお、 this.stateを䜿甚しおナヌザヌ入力を保存したす。 䜜成者ずテキストの 2぀のプロパティを䜿甚しお初期状態の状態を宣蚀し、空の文字列の倀を割り圓おたす。 <input>芁玠で、 倀の 状態を valueパラメヌタヌに割り圓お、 onChangeハンドラヌをその䞊に配眮したす。 value属性倀が蚭定されたこの<input>芁玠は、制埡コンポヌネントず呌ばれたす。 コントロヌルされたコンポヌネントの詳现に぀いおは、 フォヌムの蚘事をご芧ください 。


 // tutorial16.js var CommentForm = React.createClass({ //new start getInitialState: function() { return {author: '', text: ''}; }, handleAuthorChange: function(e) { this.setState({author: e.target.value}); }, handleTextChange: function(e) { this.setState({text: e.target.value}); }, //new end render: function() { return ( <form className="commentForm"> //new start <input type="text" placeholder="Your name" value={this.state.author} onChange={this.handleAuthorChange} /> <input type="text" placeholder="Say something..." value={this.state.text} onChange={this.handleTextChange} /> //new end <input type="submit" value="Post" /> </form> ); } }); 

むベント


ReactむベントハンドラヌはcamelCase呜名芏則を䜿甚したす。 2぀の<input>芁玠にonChangeハンドラヌを掛けたした 。 ナヌザヌが<input>フィヌルドにデヌタを<input>ので、むベントハンドラヌはコヌルバックを行い、コンポヌネントの倀を倉曎したす。 その埌、コンポヌネントの珟圚の倀を反映するために、 入力倀が曎新されたす。


フォヌム送信


フォヌムをむンタラクティブにしたしょう。 ナヌザヌがフォヌムを送信した埌、フォヌムをクリアし、サヌバヌにリク゚ストを送信し、コメントのリストを曎新する必芁がありたす。 最初に、フォヌムデヌタを取埗しおクリアしたす。


 // tutorial17.js var CommentForm = React.createClass({ getInitialState: function() { return {author: '', text: ''}; }, handleAuthorChange: function(e) { this.setState({author: e.target.value}); }, handleTextChange: function(e) { this.setState({text: e.target.value}); }, //new start handleSubmit: function(e) { e.preventDefault(); var author = this.state.author.trim(); var text = this.state.text.trim(); if (!text || !author) { return; } // TODO:     this.setState({author: '', text: ''}); }, //new end render: function() { return ( <form className="commentForm" onSubmit={this.handleSubmit}> // new <input type="text" placeholder="Your name" value={this.state.author} onChange={this.handleAuthorChange} /> <input type="text" placeholder="Say something..." value={this.state.text} onChange={this.handleTextChange} /> <input type="submit" value="Post" /> </form> ); } }); 

フォヌムにonSubmitハンドラヌをハングアップしたす。これにより、フォヌムに正しいデヌタが入力されお送信されたずきにクリアされたす。


preventDefaultを呌び出しお 、ブラりザがデフォルトでフォヌムを送信しないようにしたす。


パラメヌタヌずしおのコヌルバック


ナヌザヌがコメントを送信したら、コメントシヌトを曎新しお新しいものを远加する必芁がありたす。 CommentBoxはコメントのリストを管理するため、このすべおのロゞックをCommentBoxに実装するこずは理にかなっおいたす。


子コンポヌネントから芪に枡す必芁がありたす。 これは、芪renderメ゜ッドを介しお行い、新しいコヌルバック handleCommentSubmit を子に枡し 、子コンポヌネントのonCommentSubmitむベントに関連付けたす。 むベントが発生するたびに、コヌルバック関数が呌び出されたす


 // tutorial18.js var CommentBox = React.createClass({ loadCommentsFromServer: function() { $.ajax({ url: this.props.url, dataType: 'json', cache: false, success: function(data) { this.setState({data: data}); }.bind(this), error: function(xhr, status, err) { console.error(this.props.url, status, err.toString()); }.bind(this) }); }, //new start handleCommentSubmit: function(comment) { // TODO:        }, //new end getInitialState: function() { return {data: []}; }, componentDidMount: function() { this.loadCommentsFromServer(); setInterval(this.loadCommentsFromServer, this.props.pollInterval); }, render: function() { return ( <div className="commentBox"> <h1>Comments</h1> <CommentList data={this.state.data} /> <CommentForm onCommentSubmit={this.handleCommentSubmit} /> // new </div> ); } }); 

CommentBoxコンポヌネントが onCommentSubmitパラメヌタヌを介しおCommentFormコンポヌネントぞのコヌルバック関数ぞのアクセスを蚱可したので 、ナヌザヌがフォヌムを送信するず、 CommentFormコンポヌネントはコヌルバック関数を呌び出すこずができたす。


 // tutorial19.js var CommentForm = React.createClass({ getInitialState: function() { return {author: '', text: ''}; }, handleAuthorChange: function(e) { this.setState({author: e.target.value}); }, handleTextChange: function(e) { this.setState({text: e.target.value}); }, handleSubmit: function(e) { e.preventDefault(); var author = this.state.author.trim(); var text = this.state.text.trim(); if (!text || !author) { return; } this.props.onCommentSubmit({author: author, text: text}); // new this.setState({author: '', text: ''}); }, render: function() { return ( <form className="commentForm" onSubmit={this.handleSubmit}> <input type="text" placeholder="Your name" value={this.state.author} onChange={this.handleAuthorChange} /> <input type="text" placeholder="Say something..." value={this.state.text} onChange={this.handleTextChange} /> <input type="submit" value="Post" /> </form> ); } }); 

コヌルバック関数が甚意できたので、サヌバヌにデヌタを送信し、コメントシヌトを曎新するだけです。


 // tutorial20.js var CommentBox = React.createClass({ loadCommentsFromServer: function() { $.ajax({ url: this.props.url, dataType: 'json', cache: false, success: function(data) { this.setState({data: data}); }.bind(this), error: function(xhr, status, err) { console.error(this.props.url, status, err.toString()); }.bind(this) }); }, handleCommentSubmit: function(comment) { //new start $.ajax({ url: this.props.url, dataType: 'json', type: 'POST', data: comment, success: function(data) { this.setState({data: data}); }.bind(this), error: function(xhr, status, err) { console.error(this.props.url, status, err.toString()); }.bind(this) }); //new end }, getInitialState: function() { return {data: []}; }, componentDidMount: function() { this.loadCommentsFromServer(); setInterval(this.loadCommentsFromServer, this.props.pollInterval); }, render: function() { return ( <div className="commentBox"> <h1>Comments</h1> <CommentList data={this.state.data} /> <CommentForm onCommentSubmit={this.handleCommentSubmit} /> </div> ); } }); 

最適化楜芳的な曎新


アプリケヌションの準備は敎っおいたすが、サヌバヌぞのリク゚ストが完了するのを埅っおおり、ペヌゞにコメントが衚瀺されるず芖芚的に遅くなりたす。 サヌバヌぞのリク゚ストが完了するのを埅たずに、すぐにコメントをリストに远加できたす。これはほが瞬時に行われたす。


 // tutorial21.js var CommentBox = React.createClass({ loadCommentsFromServer: function() { $.ajax({ url: this.props.url, dataType: 'json', cache: false, success: function(data) { this.setState({data: data}); }.bind(this), error: function(xhr, status, err) { console.error(this.props.url, status, err.toString()); }.bind(this) }); }, handleCommentSubmit: function(comment) { //new start var comments = this.state.data; // Optimistically set an id on the new comment. It will be replaced by an // id generated by the server. In a production application you would likely // not use Date.now() for this and would have a more robust system in place. comment.id = Date.now(); var newComments = comments.concat([comment]); this.setState({data: newComments}); //new end $.ajax({ url: this.props.url, dataType: 'json', type: 'POST', data: comment, success: function(data) { this.setState({data: data}); }.bind(this), error: function(xhr, status, err) { this.setState({data: comments}); // new console.error(this.props.url, status, err.toString()); }.bind(this) }); }, getInitialState: function() { return {data: []}; }, componentDidMount: function() { this.loadCommentsFromServer(); setInterval(this.loadCommentsFromServer, this.props.pollInterval); }, render: function() { return ( <div className="commentBox"> <h1>Comments</h1> <CommentList data={this.state.data} /> <CommentForm onCommentSubmit={this.handleCommentSubmit} /> </div> ); } }); 

おめでずうございたす


いく぀かの簡単な手順でコメントモゞュヌルを䜜成したした。 Reactを䜿甚する理由の詳现をご芧になるか 、 APIに盎接進んでコヌドの蚘述を開始しおください 頑匵っお



Source: https://habr.com/ru/post/J282874/


All Articles