【问题标题】:React.Component 'this' changed in ComponentDidMountReact.Component 'this' 在 ComponentDidMount 中改变
【发布时间】:2018-08-25 10:18:48
【问题描述】:

React.Component 生命周期中的“this”怎么可能变成了不同的对象? 在render()componentDidMount() this 指向不同的对象?

  1. 我使用 React 16.0.0
  2. 所有生命周期方法只调用一次
  3. 我用 Webpack 转译 Typescript
  4. 我无法在浏览器中重复它,在浏览器one === two // true
  5. 我有一个非常大的应用程序,所以我认为可以对 ReactFiber 进行某种优化?

喜欢这里:JsBin

【问题讨论】:

  • 你能把你的代码复制到你做测试的地方吗?能输出一和二的值吗?
  • 它可能是一个副本而不是一个引用因此不同的对象值(在不同的时间分配)?
  • @ChrisR 添加了一个屏幕,Lukasz 关于你在谈论什么变量? onetwothis
  • @MiheyMik 在您的 JSBin 中返回 true(我必须将 <div id ="app" /> 添加到 HTML 以便组件呈现)。
  • @MiheyMik 一和二,因为这是对对象的引用。我认为使用 Object.assign 复制属性作为新对象,因此您的快照会随着时间的推移而不同,因为 React 会更改一些道具。

标签: javascript reactjs react-fiber


【解决方案1】:

如您所见,two 具有更多属性。这是因为在构造函数中的第一次输出是一个纯 Javascript 类。然后,React 出现并在渲染之前、期间和之后更改类。

【讨论】:

  • 好吧,明白了,但这并不能回答我的问题,为什么这会更改为不同的对象
  • 同一个对象,只是在被 React 改变后没有相同的属性。所以=== 严格相等表达式返回 false。
  • 这不是 js === 运算符的工作方式。当变量指针从===的左右两侧指向同一个对象时,该对象是相同的
【解决方案2】:

举个例子:

var a = {one:"1"};

var b = a;

a==b  // true
a===b // true
var c = Object.assign({}, a);

c     //{one: "1"}
a===c // false
a==c  // false

Object.assign 的调用创建了对象的副本,因此不等式。

【讨论】:

  • Lukasz 这没有回答我的问题。 Object.assign - 将新属性分配给第一个参数。在我的情况下是“窗口”对象。所以这让我在控制台中看到onetwo
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
  • 1970-01-01
  • 2019-05-20
  • 2016-10-29
  • 2020-08-27
  • 1970-01-01
相关资源
最近更新 更多