vueオブジェクトのプロパティ値を変更した後、ページが問題を再レンダリングしない
4208 ワード
解決策用$.set 用Object.assign
vue双方向バインド原理
Vueはデータハイジャックとパブリッシャー-サブスクライバモードを結合する方法を採用し、Objectを通過する.defineProperty()は,各属性のsetter,getter属性をハイジャックし,データが変動するとサブスクライバに通知し,コールバック関数の更新をトリガーし,ビューを再レンダリングする.
vueデータ
vueのdataで定義されたデータには、getterとsetterが付与されています.オブジェクトに新しい属性を追加する場合、または他の場所で直接thisします.出てくる変数は、getterとsetter属性がありません.
(通常のJavaScriptオブジェクトをdataオプションとしてVueインスタンスに転送すると、Vueはこのオブジェクトのすべてのプロパティを巡回し、Object.definePropertyを使用してこれらのプロパティをすべてgetter/setterに変換します.現代のJavaScriptの制限(およびObject.observeの廃棄)を受けて、Vueはオブジェクトプロパティの追加または削除を検出できません.Vueはインスタンスの初期化時に属性に対してgetter/setter変換プロセスを実行するため、Vueを変換するには、属性がdataオブジェクト上に存在する必要があります.これにより、応答することができます.)
解決策
vue双方向バインド原理
Vueはデータハイジャックとパブリッシャー-サブスクライバモードを結合する方法を採用し、Objectを通過する.defineProperty()は,各属性のsetter,getter属性をハイジャックし,データが変動するとサブスクライバに通知し,コールバック関数の更新をトリガーし,ビューを再レンダリングする.
vueデータ
vueのdataで定義されたデータには、getterとsetterが付与されています.オブジェクトに新しい属性を追加する場合、または他の場所で直接thisします.出てくる変数は、getterとsetter属性がありません.
(通常のJavaScriptオブジェクトをdataオプションとしてVueインスタンスに転送すると、Vueはこのオブジェクトのすべてのプロパティを巡回し、Object.definePropertyを使用してこれらのプロパティをすべてgetter/setterに変換します.現代のJavaScriptの制限(およびObject.observeの廃棄)を受けて、Vueはオブジェクトプロパティの追加または削除を検出できません.Vueはインスタンスの初期化時に属性に対してgetter/setter変換プロセスを実行するため、Vueを変換するには、属性がdataオブジェクト上に存在する必要があります.これにより、応答することができます.)
解決策
<div>{{data.a}}{{data.b}}{{data.c}}</div>
export default {
name: "addEdit",
data() {
return {
data: {
a: 1
}
}
},
mounted(){
this.data = Object.assign({},this.data,{ b: ' '});
// , , render
this.$forceUpdate();
this.$set(this.data,'c',' ');
}
}