【问题标题】:React - Event bubblingReact - 事件冒泡
【发布时间】:2017-12-08 09:00:18
【问题描述】:

我正在使用反应。我不太清楚我应该如何编写事件处理,所以当我点击a 时,我可以提醒 data-href。现在如果我点击div或img,它会触发一个事件,但由于目标实际上不是a,它会提示null,这不是我想要的。

test(e){alert(e.target.getAttribute('data-href'))}
<div>
  <ui>
    <li >
      <a data-href = 'http://cnn.com'  onClick = {e = > this.test(e)>
          <div>
            <img src = 'someimage.jpg'}>
            hi there
          </div>
      </a>
    <li>
  </ui>
</div>

编辑:

类似的东西 conversationList() & selectConversation() 就是我这里说的~

import React from 'react';
import { connect, Provider } from 'react-redux';
import fetch from 'isomorphic-fetch';
import * as actions from './actions/index';

import io from 'socket.io-client';


class Chat extends React.Component{ 
    constructor(props){
        super(props);
        this.state = {recipientId: '', messageBuffer:'asdfadsfasdf'};
        this.userList = this.userList.bind(this);
        this.changeRecipient = this.changeRecipient.bind(this);
        this.insertText = this.insertText.bind(this);
    }
    componentWillMount(){
        this.props.loadConversationsSocket();
        this.props.loadConversations();
        this.props.loadRecipients();
    }



    participantsNames(participants){
        console.log('in par ');
        console.log(participants);  
        return participants.map(participant => (<div key= {participant._id}>{participant.name}</div>));
    }

    selectConversation(e){
        e.preventDefault();
        console.log(this.tagName);
        let data = this.getAttribute('data-href');
        alert(data);
    }

    conversationList(){
        if(!(this.props.conversations.length === 0)){
            console.log('in conversation if');


            return this.props.conversations.map(conversation =>(<li key = {conversation.conversation._id} >
                <a data-href = {'http://localhost:8000/messaages/'+conversation.conversation._id} onClick = {(e)=>this.selectConversation(e)}>
                    <div>
                        participants: {this.participantsNames(conversation.conversation.participants)}
                    </div> 
                    <div>
                        {conversation.message[0].auther}
                        {conversation.message[0].body}
                    </div>
                </a>

            </li>))
        }
    }



    render(){

        return (
            <div>
                <ul>
                    {this.conversationList()}
                </ul>
            </div>)
    }


}

function mapStateToProps(state) {  
    return { recipients: state.recipients, conversations: state.conversations};
}

export default connect(mapStateToProps, actions)(Chat);

【问题讨论】:

  • 我在这里没有看到任何反应代码,你能粘贴你的整个组件吗?
  • @klugjo 我添加了组件(进行了一些编辑,因此代码可能不会作为一个整体)

标签: javascript reactjs


【解决方案1】:

您的onClick 处理程序附加到img,而不是a。这是第一个问题。

那么你应该更新你的代码来查询event.currentTarget

event.currentTarget - 标识事件的当前目标,因为事件遍历 DOM。它总是指事件处理程序所指向的元素 已附加,而不是 event.target 标识 发生事件的元素。

你应该像这样编写你的事件处理程序:

class Hello extends React.Component {

  test(e){
   alert(e.currentTarget.getAttribute('data-href'))
  }

  render() {
    return (
        <div>
          <a onClick={this.test} data-href="foo">
            <img src="https://vignette.wikia.nocookie.net/mrmen/images/5/52/Small.gif/revision/latest?cb=20100731114437" />
            <div>clickMe</div>
          </a>
        </div>
    );
  }
}

我建议您也阅读this article 以了解处理事件。

【讨论】:

  • 但我确实希望在 下有一个
    子节点。
  • @I-PINGOu,好的,那么当你点击它们时会发生什么?
  • Dan Cantir 我刚刚意识到我将 onClick 放在了 img 标签中。我的意思是把它放在 标记中。
  • 谢谢。我知道这是一种解决方法。但我认为我本质上想知道的是如何使用 onclick 功能获取元素。现在它可以工作,因为我们知道父级是具有 onclick 功能的 noe。但是,如果它更嵌套怎么办。有没有办法在不知道它与目标的关系的情况下通过 onclick 获取元素?谢谢
猜你喜欢
相关资源
最近更新 更多
热门标签