2016-05-13 5 views
0

私は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

感謝です!

答えて

0

イベントハンドラで状態を変更すると、レンダリングがトリガされます。現在の状態に基づいて、レンダリングメソッドでDOM要素とスタイルをレンダリングします。

+0

私はその意味を理解していると思っていましたが、クリックハンドラの内部でリクエストデータ配列を変更していますが、何も起こっていません。同じハンドラの内部で、再レンダリングを呼び出すときに、影響を与えたいstatus TD要素のinnerHTMLを手動でリセットしようとしています。何も働いていません。これを正しく行う方法の例を教えてください。 – kurofune

+0

確かに、 'selectChangeHandler'を見て、私はそれを以前より助けました。状態を操作しています。setStateを呼び出すと、レンダリングが自動的にトリガされます。レンダリング関数では、今度はthis.state.filterに新しいフィルタが含まれています。あなたのコードを見ると、多くのエラーがあり、 'onclick'は' onClick'に違いがあります。 'statusDropdownClickHandler'は' e'を定義しません、 'e.current.target'は' e.currentTarget'でなければなりません。ここでも、フィルタの状態変化をどのように処理するかを見てみましょう。 DOM操作をレンダリングメソッドに移動します。 – sheeldotme

+0

さて、私はここに尖っているような気がする。そして、私はあなたが私のフィドルの古いバージョンを見ているように感じます、私はこの事柄のほとんどを考慮に入れました(onClickなど) 私は要求データアレイを初期状態そのため、 'this.setState({requests:update-code-here});で更新すると、自動的に再レン​​ダリングされますか? – kurofune

関連する問題