当子"删除"时,如何删除父表行?在React JS中单击按钮?

时间:2016-05-13 00:16:08

标签: javascript reactjs javascript-events event-handling rendering

我在React JS中呈现表格数据,但是在点击一个孩子时我的表行被隐藏起来很困难"删除"按钮。我当前的处理程序和渲染函数如下所示:

...
changeHandler: function(e) {
 ...
},

deleteHandler: function(e) {
  e.currentTarget.closest("tr").style.visibility = "hidden";
},

render: function() {
    return (
    <div>   
        <div class="container">
          <select onChange={ this.changeHandler.bind(this) }>
            <option></option>
            ...
          </select>
          <table>
            <thead>
              <tr>
              ...
              </tr>
            </thead>
             <tbody>
                 {data.map(function(row, j) {
                     return <tr key={j}>
                     <td>{row.text}</td>
                     <td><a href="" onClick={this.deleteHandler.bind(this, j)}>delete</a></td>
                   </tr>                             
                       }
                     )}
            </tbody>
        </table>           
    </div>
  </div>
    );
}
...

当我点击删除锚点时,我在控制台中收到此错误:

Uncaught TypeError: Cannot read property 'bind' of undefined

我不明白为什么我的删除处理程序没有被识别和绑定,当我使用的changeHandler是。可能有人请告诉我如何让这个事件触及处理程序并且如何定位父tr以隐藏它?

1 个答案:

答案 0 :(得分:1)

在上面的拼写错误修正后,我发现这不是错误。查看以下小提琴,看看它的实际效果。隐藏行时,需要更改样式。

https://jsfiddle.net/vgo52rey/

问题在于小提琴中过滤器功能中'this'的绑定。抽象出另一个方法,所以你可以在不同的变量中存储对它的引用,然后你可以保持对this.delete或this.deleteHandler的引用。

delete: function(e) {
   e.currentTarget.closest("tr").style.visibility = "hidden";
},

renderRows: function() {
  var shouldIRender =(row) => (this.state.filter === row.status || this.state.filter === "");
  var self = this
    return requests.filter(shouldIRender).map(function(row, j) {
                     return <tr key={j}>
                     <td style={tdStyle}>{row.title}</td>
                     <td style={tdStyle}>{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>                             
                       }
                     )
},
现在你可以在你的渲染方法中提供这个renderRows方法的返回值:

             <tbody>
                 {this.renderRows()}
             </tbody>