当前位置: 首页 > 面试题库 >

反应-在表格行上触发点击事件

常光明
2023-03-14
问题内容

我在从React中的表行调用click事件时遇到麻烦。下面是我的代码。我有一个单独的函数来单独填充行,但似乎我弄乱了绑定信息。

import React, {Component, PropTypes} from 'react';
import Header from './Header';

export default class SongData extends Component {
 constructor(props, context) {
    super(props, context);
 }

isEmpty(obj) {
    return Object.keys(obj).length === 0;
}

fetchDetails(song) {
    console.log(song);
}

renderResultRows(data) {
    var self = this;
    return data.map(function(song) {
        return (
            <tr onClick={self.fetchDetails(song)}>
                <td data-title="Song">{song.S_SONG}</td>
                <td data-title="Movie">{song.S_MOVIE}</td>
                <td data-title="Year">{song.S_YEAR}</td>
            </tr>
        );
    }.bind(this));
}

render() {
    return (
        <div id="no-more-tables">
            <table className="table table-hover table-bordered table-striped">
                <thead>
                    <tr>
                        <th>Song</th>
                        <th>Movie</th>
                        <th>Year</th>
                    </tr>
                </thead>
                <tbody>
                    {!this.isEmpty(this.props.searchResult)
                        ? this.renderResultRows(this.props.searchResult)
                        : ''}
                </tbody>
            </table>
        </div>
    );
}

}


问题答案:

首先,您要传递一个评估函数调用到您的onClick属性。

单独查看以下代码:

 function foo(name) { return 'hello ' + name; }

 foo('bob');

您期望的输出为foo('bob')“ hello bob”。

如果我将其传递给onClickprop,则完全相同。例如:

 <button onClick={foo('bob')}

在这种情况下,我只是将字符串传递给onClick按钮的prop。的onClick(和其他事件的道具)希望被提供的功能(或ref)。我将进一步举例说明。

其次我看你有正确的意向试图维持使用的组合为你的函数正确的范围const self = thisbind。使用ES6 /
2015中的匿名函数可以更轻松地做到这一点,该函数始终保持声明它们的范围。

然后,我可以将您的代码更新为以下内容:

renderResultRows(data) {
    return data.map((song) => {  // anon func maintains scope!
        // Pass in a function to our onClick, and make it anon
        // to maintain scope.  The function body can be anything
        // which will be executed on click only.  Our song value
        // is maintained via a closure so it works.
        return (
            <tr onClick={() => this.fetchDetails(song)}>
                <td data-title="Song">{song.S_SONG}</td>
                <td data-title="Movie">{song.S_MOVIE}</td>
                <td data-title="Year">{song.S_YEAR}</td>
            </tr>
        );
    });  // no need to bind with anon function
}

但这仍然不是最佳的。当使用这样的匿名语法(例如<foo onClick={() => { console.log('clicked') })时,我们将在每个渲染器上创建一个新函数。如果您使用的是纯组件(例如,仅在提供新的prop实例时才应重新渲染的组件-
此检查是通过浅比较执行的),这可能是一个问题。始终尝试尽早创建函数,例如在构造函数中或通过类属性(如果您使用babel stage
1)来创建函数,这样始终传递相同的引用。

但是,对于您的示例,您需要将一个值“传递给”每个onClick处理程序。为此,您可以使用以下方法:

fetchSongDetails = () => {
  const song = e.target.getAttribute('data-item');
  console.log('We need to get the details for ', song);
}

renderResultRows(data) {
    return data.map((song, index) => {  // anon func maintains scope!
        // Pass in a function to our onClick, and make it anon
        // to maintain scope.  The function body can be anything
        // which will be executed on click only.  Our song value
        // is maintained via a closure so it works.
        return (
            <tr key={index} data-item={song} onClick={this.fetchSongDetails}>
                <td data-title="Song">{song.S_SONG}</td>
                <td data-title="Movie">{song.S_MOVIE}</td>
                <td data-title="Year">{song.S_YEAR}</td>
            </tr>
        );
    });  // no need to bind with anon function
}

这是一个更好的方法。另请注意,我向key生成的每一行添加了一个prop。这是React的另一种最佳实践,因为react会在差异算法中使用唯一的密钥标识符。

我强烈建议您阅读以下内容:

  • 范围和闭包: https : //github.com/getify/You-Dont-Know-JS/tree/master/scope%20%26%20closures
  • React&ES6 / 2015 :http://egorsmirnov.me/2015/08/16/react-and-es6-part3.html
  • 反应和动态子代: https : //facebook.github.io/react/docs/multiple-components.html#dynamic-children


 类似资料:
  • 问题内容: 我正在尝试找到最适合与我的React应用程序一起使用的表,而现在,react表提供了我需要的一切(分页,服务器端控件,过滤,排序,页脚行)。 话虽这么说,我似乎无法选择一行。没有任何例子可以证明这一点。 我尝试过的一些操作包括尝试在单击行时设置className。但是我似乎在nor中找不到调用元素。另外,我不喜欢这种方法,因为这不是React应用程序应该做的事情。 一些可能的解决方法是

  • 示例代码: 我能够获得所选行的行索引,以获得精确的列数据。 上面的tr点击事件就可以了。 我现在的问题是,当单击表行内的锚链接时,如何触发此tr绑定事件? 目标:首先获得(在tr.bind click事件上处理),然后再处理锚定链接上的其余代码? 我试图在锚链接click事件中复制tr click函数,但在unitno上得到了未定义的值。查看我的代码: 测试代码:http://jsfidle.ne

  • 我有这段代码,它在一个远程Java类中创建新的tab。 你能告诉我,当我双击树节点时,我如何修改代码以打开新选项卡。在我的代码中,当我单击一次时,选项卡就会打开。我需要什么事件处理程序?

  • 本文向大家介绍vue用ant design中table表格,点击某行时触发的事件操作,包括了vue用ant design中table表格,点击某行时触发的事件操作的使用技巧和注意事项,需要的朋友参考一下 使用customRow 设置行属性,写对应事件 :customRow="rowClick" 然后在data里面写 在官方文档中也写的很清楚 补充知识:Ant-Design-Vue table 合并

  • 问题内容: 我的页面上有一个超链接。我正在尝试自动执行对超链接的多次单击,以进行测试。有什么方法可以使用JavaScript模拟超链接的50次点击? 我正在寻找JavaScript中的onClick事件触发器。 问题答案: 单击HTML元素: 只需执行。大多数主流浏览器都支持此功能。 要多次重复单击: 将ID添加到元素以唯一地选择它: 并通过for循环在JavaScript代码中调用该方法:

  • 问题内容: 如何在 ReactJS中 手动触发click事件?当用户单击element1时,我想自动触发对标签的单击。 问题答案: 您可以使用该道具通过回调获取对基础HTMLInputElement对象的引用,将该引用存储为类属性,然后使用该引用稍后使用HTMLElement.click方法触发事件处理程序中的单击。 在您的方法中: 在事件处理程序中: 完整示例: 请注意 ES6箭头函数,该函数为