class - 当 setState 与类的对象实例发生 react 时会发生什么

标签 class reactjs instance setstate

我有这个fiddle

let m = new Mine();
this.setState(m, () => {
    console.log('1:', m instanceof Mine, m.x, m.meth);
    // => 1: true 123 function meth() {}
    console.log('2:', this.state instanceof Mine, this.state.x, this.state.meth);
    // => 2: false 123 undefined
});

如您所见,我创建了 Mine 类的一个实例,然后使用该实例在 React 组件中设置状态。

我希望 this.state 完全包含该实例,但是虽然构造函数中设置的实例属性可用,但我无法访问该实例上的任何类方法。

fiddle 中的测试表明 this.state 不是 Mine 类的实例。

有人明白发生了什么或者这是意外行为吗?

最佳答案

经过更多调查,我找到了发生这种情况的原因。

react 中的函数 _processPendingState 使用 Object.assign 来设置新状态,因此由于目标对象是一个新对象(与传递给 setState 的对象不同),因此新状态失去了作为“Mine”实例的质量。 “类。

并且由于 Object.assign 仅将自己的可枚举属性从源复制到目标,因此新状态也不会具有类方法。

如果在 fiddle 中我们替换该行...

let m = new Mine();

与...

let m = {x: 123};
Object.defineProperty(m, 'meth', {
    enumerable: false,
    get() { return function() {}; }
});

我们在结果状态上仍然没有“meth”属性。即使“m”拥有“meth”属性,它也是不可枚举的。

关于class - 当 setState 与类的对象实例发生 react 时会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38477284/

相关文章:

reactjs - React with TypeScript - 如何导入方法

javascript - 将 React 添加到大型 PHP 项目 (ZF3)

python - Django : get model instance with dynamic variable name and value

Haskell 无法创建 TypeClass 的实例

html - CSS a-Tag 链接颜色 : Particular change for a class

class - 在 LaTeX 中编写类和样式文件的教程/手册?

c# - 如何循环访问 C# 类 (.NET 2.0) 的属性?

javascript - 获取期间无法在 try-catch 中捕获 403

java - 实例变量何时初始化并赋值?

c++ - 一个类的内存布局是连续的吗?