【问题标题】:React event listener function not called未调用 React 事件侦听器函数
【发布时间】:2017-11-22 18:24:12
【问题描述】:

我正在尝试将事件侦听器添加到 React 组件中的 SVG 路径。我遵循了以前使用匿名函数的 Stack Overflow 答案 (How to access SVG elements with Javascript),效果很好。当我尝试将回调设置为在 React 组件类中定义的函数时,如在此 Stack Overflow 答案 (ReactJS - Add custom event listener to component) 中,该函数未被调用。有趣的是,如果我在 componentWillMount 中引用该函数并使用该引用,它就可以工作。

import React, { Component } from "react";

export default class ProcessMap extends Component {

    constructor(props) {
        super(props);
        this.hover = this.hover.bind(this);
    }

    componentDidMount(){
        const t = this.hover;
        let svg = document.getElementById("drawing-svg");
        svg.addEventListener("load", function() {
            let svgDoc = svg.contentDocument;
            let path1 = svgDoc.getElementById("path3372");
            //path1.addEventListener("click", this.hover, false); // this did not work
            path1.addEventListener("click", t, false); // this works
        });
    }

    hover() {
        console.log("hover");
    }

    render() {
        return (
            <div>
                <object id="drawing-svg" width="300" height="400" type="image/svg+xml" data="images/drawing.svg"></object>
            </div>
        );
    }
};

【问题讨论】:

  • this inside componentDidMountthis 在事件调用的函数内不同。

标签: javascript reactjs svg addeventlistener


【解决方案1】:

它不起作用,因为您试图在新的常规 function() 中使用 this,其中 this 不再是 React 组件。

ES6 解决方案

替换

componentDidMount(){
    const t = this.hover;
    let svg = document.getElementById("drawing-svg");
    svg.addEventListener("load", function() {
        let svgDoc = svg.contentDocument;
        let path1 = svgDoc.getElementById("path3372");
        //path1.addEventListener("click", this.hover, false); // this did not work
        path1.addEventListener("click", t, false); // this works
    });
}

带箭头功能

componentDidMount(){
    const t = this.hover;
    let svg = document.getElementById("drawing-svg");
    svg.addEventListener("load", () => {
        let svgDoc = svg.contentDocument;
        let path1 = svgDoc.getElementById("path3372");
        path1.addEventListener("click", this.hover, false);
    });
}

ES5 解决方案

如果您不能使用 ES6,那么您可以通过将 this 存储在变量中来跟踪它:

componentDidMount(){
    const t = this.hover;
    let svg = document.getElementById("drawing-svg");
    var that = this;
    svg.addEventListener("load", function() {
        let svgDoc = svg.contentDocument;
        let path1 = svgDoc.getElementById("path3372");
        path1.addEventListener("click", that.hover, false);
    });
} 

或者使用.bind():

componentDidMount(){
    const t = this.hover;
    let svg = document.getElementById("drawing-svg");
    svg.addEventListener("load", (function() {
        let svgDoc = svg.contentDocument;
        let path1 = svgDoc.getElementById("path3372");
        path1.addEventListener("click", this.hover, false);
    }).bind(this));
} 

【讨论】:

  • 谢谢,所有解决方案都运行良好。我有点不好意思,我无法得到它。再次感谢您。
  • OP 的工作方式也是如此,只是被注释掉的行没有。所以不要认为他真的需要更换任何东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
  • 2020-02-12
  • 2018-08-06
  • 2020-08-08
  • 2020-09-06
  • 1970-01-01
相关资源
最近更新 更多