【发布时间】:2021-06-22 02:46:25
【问题描述】:
我在父子关系中创建了 2 个组件。 第一个组件使用 refs 并且在 componentDidMount 我在 DOM 节点上添加了一个点击事件监听器, 在子组件中,我还添加了一个 onclick 侦听器,但这次使用的是 DOM 元素上的道具。
但是现在当我单击子组件时,父组件的事件侦听器被调用,如果我使用 props 而不是 refs 在父组件上添加 onClick,一切正常。
那么,谁能告诉我为什么当我们使用 refs 添加事件监听器时会出现这种行为。
class SecondDiv extends React.Component {
divClicked = (event) => {
event.stopPropagation();
console.log('Second Div clicked');
}
render() {
return <div className="Div2" onClick={this.divClicked} >
This is second div
</div>
}
}
class MovieItem extends React.Component {
constructor(props) {
super(props);
this.node = React.createRef();
}
componentDidMount() {
this.node.current.addEventListener('click', this.divClicked);
}
componentWillUnmount() {
this.node.current.removeEventListener('click', this.divClicked);
}
divClicked = (event) => {
event.stopPropagation();
console.log('First div clicked');
}
render() {
// 1st approach
return <div ref={this.node} className="Div1" >
<p>This is Div 1</p>
<SecondDiv />
</div>
// 2nd approach
// return <div ref={this.node} className="Div1" onClick={this.divClicked} >
// <p>This is Div 1</p>
// <SecondDiv />
// </div>
}
}
ReactDOM.render(<MovieItem />, document.getElementById("app"));
<div id="app"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
【问题讨论】:
-
对于可运行的示例,请使用 Stack Snippets(
[<>]工具栏按钮),而不是异地资源。人们不应该去场外查看示例,某些网站对某些用户被阻止,并且很容易真的不小心遗漏了问题中的一些重要代码。 Stack Snippets 支持 React,包括 JSX; here's how to do one. -
你包含了所有东西(太棒了!)所以我已经为你完成了 sn-p。
-
@T.J.Crowder 感谢您的 sn-p :)
标签: javascript reactjs addeventlistener ref