10

私はこのフィドルを持っています

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 クラスのインスタンスを作成し、そのインスタンスを使用して反応コンポーネントの状態を設定します。

this.state にはそのインスタンスが正確に含まれていると予想されますが、コンストラクターで設定されたインスタンス プロパティが利用可能である間は、そのインスタンスのクラス メソッドにアクセスできません。

フィドルのテストは、this.state がクラス Mine のインスタンスではないことを示しています。

誰かが何が起こっているのか理解していますか、それともこれは意図しない動作ですか?

4

3 に答える 3

5

さらに調査した結果、その理由がわかりました。

react の関数 _processPendingState は Object.assign を使用して新しい状態を設定するため、ターゲット オブジェクトは新しいオブジェクト (setState に渡されるものとは異なる) であるため、新しい状態は「Mine」クラスのインスタンスであるという品質を失います。

また、Object.assign は独自の列挙可能なプロパティをソースからターゲットにコピーするだけなので、新しい状態にもクラス メソッドはありません。

フィドルで行を置き換える場合...

let m = new Mine();

と...

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

結果の状態に「meth」プロパティはまだありません。"m" が "meth" プロパティを所有していても、それは列挙できません。

于 2016-07-20T12:24:59.930 に答える
0

そのような場合は を使用するreplaceStateと、うまくいくはずです。

于 2016-07-20T09:55:54.997 に答える