javascript - "this.setState is not a function"在嵌套的 addEventListener 函数中使用 setState 时

标签 javascript reactjs setstate

我一生都无法在我的 react 组件中传递这个 TypeError 。我已阅读所有相关主题并实现了几乎所有建议的修复,但均无济于事。

import React, { Component } from "react";

class Wave extends Component {
    state = {
        position: 44
    };

    changePosition = () => {
        let parentDiv = document.getElementById('parentDiv');
        //this.setState({position: 3})

        parentDiv.addEventListener('click', function (e) {
            let offset = this.getClientRects()[0];          
            alert(e.clientX - offset.left);
            let xcord = e.clientX - offset.left;
            this.setState({position: xcord})
        }, false);
    }

    render() {          
        return (
            <div id={"parentDiv"}>
                <div id={"childDiv"} onClick={this.changePosition}>HI THERE!</div>
            </div>
        );
    }
}

export default Wave;

我知道我正在丢失 React 类 this 上下文,并尝试在组件构造函数内绑定(bind) changePosition 方法,但这似乎不起作用。我还尝试在 addEventListener 函数末尾使用 .bind(this) -

changePosition = () => {
    let parentDiv = document.getElementById('parentDiv');
    //this.setState({position: 3})

    parentDiv.addEventListener('click', function (e) {
        let offset = this.getClientRects()[0];          
        alert(e.clientX - offset.left);
        let xcord = e.clientX - offset.left;
        this.setState({position: xcord})
    }.bind(this), false);
}

但是当我这样做时,以及当我尝试将 addEventListener 函数更改为箭头函数 (e) => { 时,我会留下 TypeError: this.getClientRects不是一个函数

非常感谢有关如何解决此错误的任何启发,因为这已经占用了我一天中的最后 2-3 个小时。非常感谢!

最佳答案

parentDiv.addEventListener('click', function (e) {
    let offset = this.getClientRects()[0];  // this refers to parentDiv        
}

将其更改为箭头函数以正确绑定(bind)this

parentDiv.addEventListener('click', (e) => {
    let offset = parentDiv.getClientRects()[0];  // this refers to Wave component, so we use the actual div reference
    alert(e.clientX - offset.left);
    let xcord = e.clientX - offset.left;
    this.setState({position: xcord}); // works fine
}, false);

关于javascript - "this.setState is not a function"在嵌套的 addEventListener 函数中使用 setState 时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54612522/

相关文章:

javascript - 在 Jest 中模拟 WebSocket

reactjs - 如果 Context API 不持久,为什么还要使用它?

javascript - 无法使用绑定(bind)到 `this.setState` 的对象文字调用 `partialState`,因为字符串 [1] 与字符串文字 [2] 不兼容

android - Flutter SetState 不更新文本

javascript - 首次单击时 react 状态未更新且组件未渲染

javascript - 单击图像,获取坐标并将其保存在数据库中 JavaScript 和 Rails

javascript - tableToGrid jqgrid可排序问题

node.js - 无法将 JSX 与 nodejs ESM 模块加载器一起使用

javascript - ReactJS:何时运行分析页面加载

javascript - 检查多个选项并在 vuex 中进行过滤