【问题标题】:React onClick event on component在组件上反应 onClick 事件
【发布时间】:2015-03-31 20:57:46
【问题描述】:

我有一个名为 <SensorList /> 的 React 组件,它有许多子 <SensorItem />s(另一个 React 组件)。我希望能够在<SensorList /> 内的每个<SensorItem /> 上声明一个onClick 事件。我尝试过以下操作:

sensorSelected: function(sensor) {
    console.log('Clicked!');
},

render: function() {
    var nodes = this.state.sensors.map(function(sensor) {
        return (
            <SensorItem onClick={ this.sensorSelected } />
        );
    }.bind(this));

    return (
        <div className="sensor-list">
            { nodes }
        </div>
    );
}

不用说,我没有得到任何“点击!”出现在我的控制台中。 Chrome 中的 React 检查器指示注册了一个 onClick 事件,上面的函数体应该是。

因此,我得出结论,我无法在实际的 &lt;SensorItem /&gt; 标签上注册 onClick 事件(不过,我不确定这是为什么)。否则我该如何实现呢?

【问题讨论】:

    标签: javascript events reactjs


    【解决方案1】:

    问题

    正如另一个答案中所解释的那样,问题是 onClick&lt;SensorItem&gt; React 组件上(与本机 DOM 元素相反,如 &lt;div&gt;&lt;p&gt;)被视为组件属性的传递,而不是DOM 事件处理程序。而且很可能您的 &lt;SensorItem&gt; 组件没有声明 onClick 属性,因此该属性值会丢失。

    解决方案

    最直接的解决方案是在SensorItem 组件上显式添加onClick 属性,然后将其传递给该组件的根DOM 元素:

    function SensorItem({ prop1, prop2, onClick }) {
      (...)
    
      return (
        <p onClick={onClick}>
          (...)
        </p>
      );
    }
    

    但通常最适合我的解决方案是使用对象解构表示法对所有未定义组件的属性进行分组,然后将它们全部传递给该组件中的根 DOM 元素。这样您就可以传递onClickonHoverclassName 等,而无需为每个属性定义单独的属性:

    function SensorItem({ prop1, prop2, ...rootDOMAttributes }) {
      (...)
    
      return (
        <p {...rootDOMAttributes}>
          (...)
        </p>
      );
    }
    

    无论您使用这两种方法中的哪一种,处理程序现在都可以工作,因为它现在将附加到 SensorItem 的根 DOM 元素:

    <SensorItem onClick={...} />
    

    【讨论】:

      【解决方案2】:

      这取决于您的 SensorItem 组件的定义。 因为 SensorItem 不是一个原生 DOM 元素,但就像你说的,另一个 React 组件,这里定义的 onClick 只是该组件的一个属性。您需要做的是,在 SensorItem 组件内部将 onClick 属性传递给 DOM 组件的 onClick 事件:

      var SensorItem = React.createClass({
        render: function() {
          return (
            <div className="SensorItem" onClick={this.props.onClick}>
             ...
            </div>
          );
        }
      });
      

      【讨论】:

      • 知道了,我曾认为组件可能会自动将任何事件传递给主 DOM 节点 (getDOMNode()),但没有理由会出现这种情况。
      • 我曾想过,假设,肯定 Facebook 的那些天才会认为这很方便。不够方便,我猜。
      • 除此之外,您可以使用如下的参数解构语法相当轻松地将 all 道具传递给主 DOM 节点:``` const SensorItem = ({.. .props}) => { return (
        ...
        ); } ``` 如果您需要添加 onDoubleClick、onKeyDown 等,这将使其面向未来。
      猜你喜欢
      • 2016-07-12
      • 1970-01-01
      • 2021-04-09
      • 2015-12-05
      • 2017-08-05
      • 2019-06-10
      • 2022-01-15
      • 1970-01-01
      • 2019-06-10
      相关资源
      最近更新 更多