Chrome、Firefox 调试器未在 React 应用程序中显示“this”的正确值

2023-12-09

这是 React 组件类中的一些代码(使用 CRA 2 搭建脚手架)

  click = () => {
    console.log(this, "hello");
    let x = 1 + 1; //This is just here to let chrome put a break point here. 
  }

当此代码运行时,它将把组件对象打印到控制台。

但是 - 如果我将调试器附加到该点,Chrome (68) 和 Firefox (63) 都会将“this”显示为未定义。

这里发生了什么?

这与用于将 click 创建为类属性的 transform-class-properties babel 插件有关吗?

Edit:是的,看起来确实如此。

如果我们手动绑定该方法,例如:

  constructor() {
    super();
    this.click2 = this.click2.bind(this);
  }

  click2() {
    console.log(this, "hello");
    let x = 1 + 1;
  }

然后就可以正常工作了。

无论如何 - 有没有一种方便的方法来解决这个问题,这样我就不必放入所有这些绑定语句?


我创建了一个CodeSandbox 上的示例我认为重现了你的问题,尽管我不确定。如果没有,请创建您自己的示例。相关代码包含在下面。

在此示例中,代码运行良好。console.log(this, "hello") logs a Square正如你所期望的,对象+“你好”。如果你在let y = 2 + 2行,Chrome 调试器将显示

this: undefined
x: 2
y: undefined

当然,y是未定义的,因为let y语句尚未执行。x已定义,如预期的那样。this是未定义的,因为 React 和 Babel 在幕后跳过了很多圈子,并且this事实上,是未定义的。如果您想访问this从调试器中,您需要使用_this。事实上,即使你在线上放置了一个断点let y = 2 + 2,这不是正在执行的实际源代码或实际断点所在的位置。您所看到的是由源图它允许您查看并在您编写的代码上设置断点,尽管实际运行的代码完全不同(Babel 等处理的结果)。

我写的代码是:

class Square extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      value: null
    };
  }

  click = () => {
    console.log(this, "hello");
    let x = 1 + 1; //This is just here to let chrome put a break point here.
    let y = 2 + 2; //This is just here to let chrome put a break point here.
  };

  render() {
    return (
      <button className="square" onClick={this.click}>
        {this.props.value}
      </button>
    );
  }
}

实际运行的代码是:

var Square =
/*#__PURE__*/
function (_React$Component) {
  (0, _inherits2.default)(Square, _React$Component);

  function Square(props) {
    var _this;

    (0, _classCallCheck2.default)(this, Square);
    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Square).call(this, props));
    (0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "click", function () {
      console.log((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "hello");
      var x = 1 + 1; //This is just here to let chrome put a break point here.

      var y = 2 + 2; //This is just here to let chrome put a break point here.
    });
    _this.state = {
      value: null
    };
    return _this;
  }

  (0, _createClass2.default)(Square, [{
    key: "render",
    value: function render() {
      return _react.default.createElement("button", {
        className: "square",
        onClick: this.click
      }, this.props.value);
    }
  }]);
  return Square;
}(_react.default.Component);

由于 React.js 的内部结构(特别是它包装事件的方式),在调用处理程序时,this未定义。如果你查看调用堆栈,你会发现executeDispatch calls invokeGuardedCallbackAndCatchFirstError明确值为undefined为了context对象最终的价值this在回调里面。当你编写代码时,React 和 Babel 会尝试向你隐藏所有这些,但它们无法完全向调试器隐藏这些,特别是在以下方面:this,所以这种情况你得去实际的代码中看看需要参考_this在调试器中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Chrome、Firefox 调试器未在 React 应用程序中显示“this”的正确值 的相关文章

  • React js Stripe 结账不起作用

    我正在尝试在 React js 应用程序中呈现条带结账默认表单
  • 为什么 JavaScript base-36 转换看起来不明确

    我目前正在编写一段使用 Base 36 编码的 JavaScript 我遇到了这个问题 parseInt welcomeback 36 toString 36 看来要回归了 welcomebacg 我在 Chrome 开发者控制台和 Nod
  • 尝试将布尔 C# 变量传递给 javascript 变量并将其设置为 true

    在我的 aspx 页面中 我将布尔变量 C 传递给需要布尔类型的 javascript 函数 但遇到了问题 但是 C 变量返回 True 而 javascript 不喜欢大写 myjavascript 如果我将 c 变量转换为字符串 那么我
  • jquery.find() 可以只选择直接子项吗?

    我应该向 jQuery find 提供什么参数来选择元素子元素而不选择其他元素 我不能用 gt 引导选择器 而用 将选择所有后代 而不仅仅是直接子代 我知道 jQuery children 但这是一个库 因此用户能够提供自己的选择器 并且我
  • TypeError: props.render 不是一个函数(React hook 形式)

    我将方法作为我用react hook form制作的形式的道具传递 当从react hook form添加控制器时 它给了我 TypeError props render不是一个函数 我在网上找不到任何解决方案 因此感谢任何帮助 impor
  • 解析“流”JSON

    我在浏览器中有一个网格 我想通过 JSON 将数据行发送到网格 但浏览器应该在接收到 JSON 时不断解析它 并在解析时将行添加到网格中 换句话说 在接收到整个 JSON 对象后 不应将行全部添加到网格中 应该在接收到行时将其添加到网格中
  • 使用模数按字母顺序对列表进行排序

    我在获取元素列表并按字母顺序对它们进行排序方面没有任何问题 但我很难理解如何使用模数来做到这一点 更新 这是按我的方式工作的代码 但是 我更喜欢下面提供的答案的可重用性 因此接受了该答案
  • 检查 JavaScript 字符串是否为 URL

    JavaScript 有没有办法检查字符串是否是 URL 正则表达式被排除在外 因为 URL 很可能是这样写的stackoverflow 也就是说它可能没有 com www or http 如果你想检查一个字符串是否是有效的 HTTP UR
  • 如何抑制窗口鼠标滚轮滚动...?

    我正在开发嵌入页面中的画布应用程序 我有它 因此您可以使用鼠标滚轮放大绘图 但不幸的是 这会滚动页面 因为它是文章的一部分 当我在 dom 元素上滚动鼠标滚轮时 是否可以阻止鼠标滚轮在窗口上滚动 附加鼠标滚轮 不是 Gecko DOMMou
  • Javascript正则表达式用于字母字符和空格? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我需要一个
  • 音频 blob 的 URL.createObjectURL 在 Firefox 中给出 TypeError

    我正在尝试从创建的音频 blob 创建对象 URLgetUserMedia 该代码在 Chrome 中可以运行 但在 Firefox 中存在问题 错误 当我打电话时stopAudioRecorder 它停在audio player src
  • Jquery/Javascript 上传和下载文件,无需后端

    是否可以在没有后端服务器的情况下在 JavaScript 函数中下载和上传文件 我需要导出和导入由 JavaScript 函数生成的 XML 我想创建按钮 保存 xml 来保存文件 但我不知道是否可行 另一方面 我希望将 XML 文件直接上
  • 使用 KnockoutJs 映射插件进行递归模板化

    我正在尝试使用以下方法在树上进行递归模板化ko映射 插入 http knockoutjs com documentation plugins mapping html 但我无法渲染它 除非我定义separate每个级别的模板 在以下情况下
  • Firefox 书签探索未超过 Javascript 的第一级

    我已经编写了一些代码来探索我的 Firefox 书签 但我只获得了第一级书签 即我没有获得文件夹中的链接 e g 搜索引擎 雅虎网站 谷歌网站 在此示例中 我只能访问 Search engines 和 google com 不能访问 yah
  • 提交表单并重定向页面

    我在 SO 上看到了很多与此相关的其他问题 但没有一个对我有用 我正在尝试提交POST表单 然后将用户重定向到另一个页面 但我无法同时实现这两种情况 我可以获取重定向或帖子 但不能同时获取两者 这是我现在所拥有的
  • 如何使用tampermonkey模拟react应用程序中的点击?

    我正在尝试使用 Tampermonkey 脚本模拟对 React 元素的点击 不幸的是 由于 React 有自己的影子 DOM 所以天真的方法使用document querySelector 不工作 我遇到了一些需要修改 React 组件本
  • 为什么在 Internet Explorer 中访问 localStorage 对象会引发错误?

    我正在解决一个客户端问题 Modernizr 意外地没有检测到对localStorageInternet Explorer 9 中的对象 我的页面正确使用 HTML 5 文档类型 并且开发人员工具报告该页面具有 IE9 的浏览器模式和 IE
  • 在 vue.js 中访问数组对象属性

    给定以下数组vue js packageMaps Object packageMap 0 Object Id 16 PackageType flag list ProductCode F BannerBase packageMap 1 Ob
  • JQuery 图像上传不适用于未来的活动

    我希望我的用户可以通过帖子上传图像 因此 每个回复表单都有一个上传表单 用户可以通过单击上传按钮上传图像 然后单击提交来提交帖子 现在我的上传表单可以上传第一个回复的图像 但第二个回复的上传不起作用 我的提交过程 Ajax 在 php 提交
  • 如何获取浏览器视口中当前显示的内容

    如何获取当前正在显示长文档的哪一部分的指示 例如 如果我的 html 包含 1 000 行 1 2 3 9991000 并且用户位于显示第 500 行的中间附近 那么我想得到 500 n501 n502 或类似的内容 显然 大多数场景都会比

随机推荐

  • 在 .NET 中存储数据的方法

    我正在寻找在 NET 中的 Windows 窗体应用程序中存储数据的方法 我想让系统的输入数据持久化 因此当我关闭程序并再次打开它时 会检索数据 除了创建链接数据库之外 还有哪些方法可以实现此目的 我们很高兴地赞赏这些例子 有数十种不同的方
  • 尝试安装 HAXM 时出错 - Intel VT-x 已关闭

    我已经安装了 Android Studio 但在尝试安装 HAXM 时收到此错误 我尝试在BIOS中启用虚拟化 但并没有解决问题 然后我在 Windows 8 1 64 位 中禁用了 Hyper V 重新启动计算机后 没有任何变化 并且由于
  • 融合类型中的 C++ 类

    我希望为一堆 C 类实现 python 包装器 在 pxd 的某个地方我有 cdef cppclass FooImpl1 FooImpl1 int foo cdef cppclass FooImpl2 FooImpl2 int foo 我想
  • 在 EL 表达式中使用多个布尔条件

    我想知道如何在 EL 中组合多个布尔条件 我有以下示例 但它不起作用
  • 使用 JNI 访问我的共享库时出现“未定义的引用”

    我正在尝试构建一个版本Botan 加密算法库 使用 JNI 在 Android 上运行一些本机 C 程序 我已经使用 NDK 工具链 NDK R5b 成功创建了 libbotan so 没有任何错误 但是 当我从 Android 项目 示例
  • Select2 - 搜索通配符匹配项

    我正在使用 Select2 来设计我的选择框并添加功能 我想知道如何使搜索规则更加宽松 目前 如果我在下拉列表中有 新墨西哥 我可以搜索 墨西哥 或 新墨西哥 来匹配选择选项 但如果我输入 墨西哥新 我会得到 找不到结果 有没有办法扩展搜索
  • 使用 Meteor 动态加载每个模板的 JS/CSS

    我理解几个问题 即this 这种性质已经发布 但尚未找到可靠的解决方案 从表面上看 Meteor 目前缺乏动态加载 渲染不同 UI JavaScript 的能力 即uilang 或每个模板的 CSS 文件 在我的应用程序中 我的模板需要特定
  • Visual Studio 2005 和 .Net 框架 1.1

    是否可以使用 Visual Studio 2005 创建和维护 Net Framework 1 1 应用程序 实际上有一个 MSBuild 扩展允许这种情况 它被称为MSBee您可以在 CodePlex 上找到它 MSBuild Extra
  • Java和无符号字节[重复]

    这个问题在这里已经有答案了 我需要使用无符号字节数组 我需要通过网络将某些字符发送到服务器 其中一些字符大于 127 我有下面代码的简化版本来尝试理解这个概念 int i 160 byte j byte i System out print
  • 如何在VB中从数组元素中得出所有可能的总和组合

    如果有一个数组 其中元素为 1 2 3 4 则程序应返回另一个数组 其中包含所有组合的总和 1 2 3 4 3 1 2 4 1 3 5 1 4 5 2 3 6 2 4 7 3 4 6 1 2 3 7 1 2 4 8 1 3 4 9 2 3
  • 无法使用 Oreo android 更改我的应用程序的语言

    EDIT 我使用了区域设置更改的解决方案来更改应用程序的语言 但它在奥利奥中不起作用 它在我的三星 S4 上运行良好 但在我的 S9 上运行不佳 所以我正在像这样进行区域设置更改 public void initAppLanguages C
  • “类型错误:没有编码的字符串参数”,但字符串已编码?

    我正在努力转换现有计划从Python2到Python3 该程序中的方法之一通过远程服务器对用户进行身份验证 它将提示用户输入密码 def handshake self timestamp int time time token md5has
  • 我们可以将电子邮件 ID 作为 Firebase 数据库中的键吗? [复制]

    这个问题在这里已经有答案了 我想创建一个登录系统 当用户登录时 基于 在登录用户的电子邮件 ID 上 我想检索 EID 我想要的 JSON 结构是 email protected EID 0153 S email protected EID
  • ggplot2:如何绘制正交回归线?

    我已经在两项不同的视觉感知测试中对大量参与者进行了测试 现在 我想看看这两项测试的表现有多大程度的相关性 为了可视化相关性 我使用 R 绘制了散点图ggplot 我拟合了一条回归线 使用stat smooth 然而 由于我的两个x and
  • 传递匿名函数作为参数

    为什么以下工作有效 foo lt function x x curve foo plots the identity function between 0 and 1 这并不 curve function x x 曲线错误 函数 x exp
  • Android:仅适用于非数字字符的输入类型

    我有一个 EditText 我想让用户仅输入非数字字符 例如 A Z 或 a z 有没有办法做到这一点 我使用的所有组合 文本 文本用户名等 都允许用户选择数字 我认为您必须编写自己的 InputFilter 并将其添加到 EditText
  • 从 Active Directory 组获取用户

    我创建了一个 Active Directory 域名 ADDOMAIN2 其组名为 CommonUsers 有 8 个用户 但是当我对 CommonUsers 组中的用户进行目录搜索时 它返回零结果 她是我的代码 DirectorySear
  • countplot() 与频率

    我有一个 Pandas DataFrame 其中有一列名为 AXLES 它可以采用 3 12 之间的整数值 我正在尝试使用 Seaborn 的 countplot 选项来实现以下绘图 左 y 轴显示这些值在数据中出现的频率 轴延伸范围为 0
  • XML 中的 PHP 代码?

    是否可以将 PHP 代码放入 XML 文档中以便稍后执行 例如 我可以说
  • Chrome、Firefox 调试器未在 React 应用程序中显示“this”的正确值

    这是 React 组件类中的一些代码 使用 CRA 2 搭建脚手架 click gt console log this hello let x 1 1 This is just here to let chrome put a break