私はReact JSを使ってデモアプリケーションを完成させ、データをテーブルにレンダリングしています。ステータス列の項目にカーソルを合わせると、ポップアップdivが表示され、リスト内の3つのオプションのいずれかをクリックできます。アイテムの1つがクリックされると、クリックハンドラを実行できるようになりましたが、DOMを変更して新しくクリックされたステータスを表示し、更新フィールドを新しい現在のものに変更する方法がわかりません、日付。React JSクリックハンドラは、実行時にどのようにDOMを更新するのですか?
私は現在、ソースデータを変更して再レンダリングしようとしていますが、運がないとしています。 Reactでこれを行うための慣用的でシンプルな方法を教えてください。ここで
は私のクリックハンドラである:
statusDropdownClickHandler: function(e) {
var el = e.currentTarget.closest("tr").firstChild;
var title = el.innerHTML;
var newStatus = e.currentTarget.innerHTML;
e.currentTarget.closest("td").innerHtml = newStatus;
for (i=0; i < requests.length; i++) {
if (requests[i].title === title) {
var newDate = new Date();
requests[i].status = newStatus;
requests[i].updated_at = String(newDate);
}
}
e.currentTarget.closest("td").firstChild.style.display = 'none';
this.render();
},
、ここでは、ページのこのセクションをレンダリングする機能です。
renderRows: function() {
var self = this;
var shouldIRender = (row) =>
(this.state.filter === row.status || this.state.filter === "");
var sortedRequests = requests.sort(function(a,b) {
return new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime();
});
for (i=0; i < sortedRequests.length; i++) {
sortedRequests[i].created_at = sortedRequests[i].created_at.split(" ")[0];
sortedRequests[i].updated_at = sortedRequests[i].updated_at.split(" ")[0];
}
return sortedRequests.filter(shouldIRender).map(function(row, j) {
return <tr key={j}>
<td style={tdStyle}>{row.title}</td>
<td style={statusStyle}
onMouseOver={self.statusHoverHandler}
onMouseOut={self.statusBlurHandler}
onChange={self.statusChangeHandler}>
<div style={statusDropdownStyle}>
{statusItems.map(function(item, j) {
return (
<div key={j} style={dropdownDivStyle}
//see here -----> onClick={self.statusDropdownClickHandler}
onMouseOver={self.statusDropdownHoverHandler}
onMouseOut={self.statusDropdownBlurHandler}>{item.text}</div>
)})}
</div>
{row.status}</td>
<td style={tdStyle}>{row.created_at}</td>
<td style={tdStyle}>{row.updated_at}</td>
<td style={tdStyle}><a href="#" onClick={self.delete}>delete</a></td>
</tr>
})
},
そして、ここではa link to a current JS fiddle
感謝です!
私はその意味を理解していると思っていましたが、クリックハンドラの内部でリクエストデータ配列を変更していますが、何も起こっていません。同じハンドラの内部で、再レンダリングを呼び出すときに、影響を与えたいstatus TD要素のinnerHTMLを手動でリセットしようとしています。何も働いていません。これを正しく行う方法の例を教えてください。 – kurofune
確かに、 'selectChangeHandler'を見て、私はそれを以前より助けました。状態を操作しています。setStateを呼び出すと、レンダリングが自動的にトリガされます。レンダリング関数では、今度はthis.state.filterに新しいフィルタが含まれています。あなたのコードを見ると、多くのエラーがあり、 'onclick'は' onClick'に違いがあります。 'statusDropdownClickHandler'は' e'を定義しません、 'e.current.target'は' e.currentTarget'でなければなりません。ここでも、フィルタの状態変化をどのように処理するかを見てみましょう。 DOM操作をレンダリングメソッドに移動します。 – sheeldotme
さて、私はここに尖っているような気がする。そして、私はあなたが私のフィドルの古いバージョンを見ているように感じます、私はこの事柄のほとんどを考慮に入れました(onClickなど) 私は要求データアレイを初期状態そのため、 'this.setState({requests:update-code-here});で更新すると、自動的に再レンダリングされますか? – kurofune