【问题标题】:Getting Index of onClick target with ReactJs使用 ReactJs 获取 onClick 目标的索引
【发布时间】:2015-05-22 10:51:42
【问题描述】:

我在以下 url 有代码:https://gist.github.com/motleydev/6d5e980e4d90cc5d52fd 我正在构建一个选项卡类型设置。有一行选项卡、一段内容,然后是另一行具有交替活动状态的图像,具体取决于哪个选项卡“打开”。我最终需要做的是能够点击标签的索引,但我似乎无法找到一个好的方法来做到这一点。我需要的只是整数。欣赏任何见解。谢谢!

【问题讨论】:

  • 创建另一个名为 Tab 的组件,并将 Container onClick 事件作为属性和索引发送。然后,您可以在使用正确索引调用容器的 onClick 的实际选项卡上调用 onClick。它很脏,但我认为它会起作用。
  • 我相信答案是将索引存储在 HTML 元素上,并用 e.target 或 e.currentTarget 检索,而不是每次映射发生时都绑定函数

标签: reactjs


【解决方案1】:

我目前无法对此进行测试,但与此类似。基本上发送一个 callback 和一个 index 到每个单独的选项卡。当一个标签被点击时,以索引为参数执行回调:

var Tab = React.createClass({
  handleClick: function (event) {
    event.preventDefault();
    this.props.tabClicked(this.props.index);
  },
  render: function () {
    return (
      <li>
        <a href="#" onClick={this.handleClick}>Tab {this.props.index}</a>
      </li>
    );
  }
});

var Tabs = React.createClass({
  handleClick: function (index) {
    console.log('Tab #' + index);
  },
  render: function(){
    var self = this;
    var tabs = this.props.tabs.map(function (tab, index) {
      return (
        <Tab key={index} index={index} tabClicked={this.handleClick} />
      )
    });

    return (
      <nav>
        <ul>
          {tabs}
        </ul>
      </nav>
    );
  }
});

【讨论】:

  • 这是答案,在元素上存储data
  • 这是正确答案。您还可以创建一个包装器来捕获事件并将其与数据元素一起传递给父级。你可以检查这个小提琴jsfiddle.net/parthapal33/cydubbxh
【解决方案2】:

通过使用 event.target 的 getAttribute() 函数并将索引添加为自定义属性,可以在不创建新组件的情况下做到这一点

  var Tabs = React.createClass({
    handleClick: function(event){
      event.preventDefault();
      console.log(event.target.getAttribute('index');
    },

    render: function(){
      var self = this;
      var tabs = this.props.tabs.map(function(tab,index){
        var clickHandler = self.handleClick;
        return (<li key={'tab'+index}><a ref={'tab'+index} index={index} href="#" onClick={clickHandler} > {tab.meta.title}</a></li>)
      });
      return (
        <nav>
          <ul>
            {tabs}
          </ul>
        </nav>
        )
    }
  });

您可以在https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Using_data_attributes#JavaScript_Access找到有关 event.target.getAttribute() 的更多信息

【讨论】:

    【解决方案3】:

    Jorum 解决方案有效。

    你也可以替换:

        handleClick: function(event){
          event.preventDefault();
          console.log(this);
        },
        render: function(){
          var self = this;
          var tabs = this.props.tabs.map(function(tab,index){
            var clickHandler = self.handleClick;
            return (<li key={'tab'+index}><a ref={'tab'+index} href="#" onClick={clickHandler} > {tab.meta.title}</a></li>)
          });
          return (
            <nav>
              <ul>
                {tabs}
              </ul>
            </nav>
            )
        }
      });
    

    作者:

        handleClick: function(index){
          event.preventDefault();
          console.log(this);
        },
        render: function(){
          var self = this;
          var tabs = this.props.tabs.map(function(tab,index){
            var clickHandler = self.handleClick.bind(null,index);
            return (<li key={'tab'+index}><a ref={'tab'+index} href="#" onClick={clickHandler} > {tab.meta.title}</a></li>)
          });
          return (
            <nav>
              <ul>
                {tabs}
              </ul>
            </nav>
            )
        }
      });
    

    【讨论】:

    • 所以,我要感谢你,因为它是一个功能强大的解决方案,代码更少,尽管我也很欣赏 Jorums 解决方案。我首先尝试了这个解决方案的“味道”,但是每次我尝试将“this”传递给绑定的第一个参数而不是 null 对象时,它一直说“react 正在为你做这件事,停止自己做”或其他什么在那个脉络中。为什么它与 null 对象一起工作,并且无论如何事件都会通过?
    • 我也有这个问题。这是因为 React 不希望您更改方法调用的上下文(即使您绑定到已经绑定的组件,这有点奇怪),并且仅与 null 绑定不会更改上下文。或者,您可以使用下划线/lodash 中的 _.partial
    • 我正在尝试这种方法,并且索引传递得很好。但是,我的点击处理程序中的“this”现在为空,我需要能够通过通常的方式在点击处理程序中设置状态--> this.setState({...}) 因为“this”为空。
    猜你喜欢
    • 2016-10-22
    • 1970-01-01
    • 2011-03-02
    • 2020-04-08
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 2017-02-04
    相关资源
    最近更新 更多