problem:vueのデータ変更でビュー更新の問題はトリガーされません
6454 ワード
前言:
データ変更後、vueはdomをどのようにレンダリングしますか?
実際のシーン:
データを更新してから、スクロールバーの位置を設定するのはなぜ無効ですか?
非表示の要素を表示状態に設定した後、要素の状態を読み込んで読み込めないのはなぜですか?
オブジェクト/配列の値が変更され、ページに最新の値が更新されませんか?
vueのデータ変更についてビューの更新をトリガーしない現象:
知っておくべき細部
vueでdataで定義された変数は、vueがその変化を傍受することができます.
vueでは、オブジェクトのプロパティの追加、変更、削除を傍受できません.
vueの配列に対して、下付きで変更した属性値は応答できません(ビュー更新をトリガーできません).
˙上記のソリューションについて
1.オブジェクトに属性を追加し、$set(obj,propname,propvalue)またはObject.assign({},obj,{...})追加
2、配列内のオブジェクト属性を変更します.例えば、dataに定義された配列(応答式変数)の値(オブジェクトタイプの値)に属性を追加します.
このプロパティは、ポイントまたは[]で直接追加されます.このプロパティ値が変更された後もビューの更新をトリガーできます.
3、配列については、配列にpush、shift、spliceなどの方法で配列に値を追加/削除し、ビュー更新をトリガすることができるが、下付きで配列に値を追加することは、ビュー更新をトリガすることはできない.
もう1つのケースは、変数が応答的なのか、ビューの更新がトリガーされていないのかです.vueでのデータの更新は非同期なので、データが変化した後にdomをタイムリーに更新したい場合はthis.$nextTick()にあります.
ここでは、データが変更されてもビューの更新がトリガーされない例を示します.
コンポーネント間で値が渡された場合、データはビュー更新の問題をトリガーしません.
1、入力ボックスの文字数を制限する機能.
2、keyupは入力を傍受し、文字列が32に達すると、32後の文字列を切り取ります.コンポーネント内のpropsの変数を直接変更することはできないので、親コンポーネントにイベントを投げつけるかsync識別子で親コンポーネントの変数の値を変更してからサブコンポーネントに伝えるしかありません.サブアセンブリでは、親アセンブリの変数の値は受け入れられますが、レンダリングされません.
ここでのレンダリングなしとvueの値の変更は非同期レンダリングに関連しています.
ソリューション:
1、inputの値はv-modelによって値をバインドし、v-modelはvalue賦値とoninputイベントの集合に相当する.
2、computedはname変数を定義し、入力ボックスに内容を表示し、set()とget()メソッドを定義することによって値と読み取り値を修正する(propsでusernameを定義する)
3、文字数を制限する方法では、内容を切り取った後、新しい値をname変数に直接割り当てると、nameのsetメソッドがトリガーされます
vueシリーズのログでは、次のようにまとめます.
1、vueにおける非同期レンダリングデータの問題
2、computed定義変数、変数にset/getメソッドと定義されていない違いを定義する
3、vueにおける応答式データメカニズム
4、javascriptの定義対象属性のObject.definedProperty()
転載先:https://www.cnblogs.com/yy95/p/9872534.html
データ変更後、vueはdomをどのようにレンダリングしますか?
実際のシーン:
データを更新してから、スクロールバーの位置を設定するのはなぜ無効ですか?
非表示の要素を表示状態に設定した後、要素の状態を読み込んで読み込めないのはなぜですか?
オブジェクト/配列の値が変更され、ページに最新の値が更新されませんか?
vueのデータ変更についてビューの更新をトリガーしない現象:
知っておくべき細部
vueでdataで定義された変数は、vueがその変化を傍受することができます.
vueでは、オブジェクトのプロパティの追加、変更、削除を傍受できません.
vueの配列に対して、下付きで変更した属性値は応答できません(ビュー更新をトリガーできません).
˙上記のソリューションについて
1.オブジェクトに属性を追加し、$set(obj,propname,propvalue)またはObject.assign({},obj,{...})追加
2、配列内のオブジェクト属性を変更します.例えば、dataに定義された配列(応答式変数)の値(オブジェクトタイプの値)に属性を追加します.
このプロパティは、ポイントまたは[]で直接追加されます.このプロパティ値が変更された後もビューの更新をトリガーできます.
3、配列については、配列にpush、shift、spliceなどの方法で配列に値を追加/削除し、ビュー更新をトリガすることができるが、下付きで配列に値を追加することは、ビュー更新をトリガすることはできない.
もう1つのケースは、変数が応答的なのか、ビューの更新がトリガーされていないのかです.vueでのデータの更新は非同期なので、データが変化した後にdomをタイムリーに更新したい場合はthis.$nextTick()にあります.
ここでは、データが変更されてもビューの更新がトリガーされない例を示します.
コンポーネント間で値が渡された場合、データはビュー更新の問題をトリガーしません.
1、入力ボックスの文字数を制限する機能.
2、keyupは入力を傍受し、文字列が32に達すると、32後の文字列を切り取ります.コンポーネント内のpropsの変数を直接変更することはできないので、親コンポーネントにイベントを投げつけるかsync識別子で親コンポーネントの変数の値を変更してからサブコンポーネントに伝えるしかありません.サブアセンブリでは、親アセンブリの変数の値は受け入れられますが、レンダリングされません.
limitLength(e) {
const input = e.target;
const value = input.value
const split = value.split('');
const map = split.map((s, i) => {
return (value.charCodeAt(i) >= 0 && value.charCodeAt(i) <= 128) ? 1 : 2;
});
let n = 0;
const charLength = map.length > 0 && map.reduce((accumulator, currentValue, index) => {
const count = accumulator + currentValue;
if (count === 31 || count === 32) {
n = index;
}
if (count > 32) { this.$emit('update:username',split.slice(0, n+1).join('') )
this.$emit("setUserName",split.slice(0, n+1).join(''));
}
return count
});
},
ここでのレンダリングなしとvueの値の変更は非同期レンダリングに関連しています.
ソリューション:
1、inputの値はv-modelによって値をバインドし、v-modelはvalue賦値とoninputイベントの集合に相当する.
<input
class="remark-modify"
maxlength="32"
type="text"
v-model="name"
@blur="saveRemark"
@keypress.enter="saveRemark"
@keyup="limitLength"
autofocus v-else>
2、computedはname変数を定義し、入力ボックスに内容を表示し、set()とget()メソッドを定義することによって値と読み取り値を修正する(propsでusernameを定義する)
computed: {
name: {
set(value) {
this.$emit("setUserName", value);
},
get(value) {
return this.username
}
}
},
3、文字数を制限する方法では、内容を切り取った後、新しい値をname変数に直接割り当てると、nameのsetメソッドがトリガーされます
limitLength(e) {
const input = e.target;
const value = input.value
const split = value.split('');
const map = split.map((s, i) => {
return (value.charCodeAt(i) >= 0 && value.charCodeAt(i) <= 128) ? 1 : 2;
});
let n = 0;
const charLength = map.length > 0 && map.reduce((accumulator, currentValue, index) => {
const count = accumulator + currentValue;
if (count === 31 || count === 32) {
n = index;
}
if (count > 32) {
this.name = split.slice(0, n+1).join('')
// this.$emit('update:username',split.slice(0, n+1).join('') )
// this.$emit("setUserName",split.slice(0, n+1).join(''));
}
return count
});
vueシリーズのログでは、次のようにまとめます.
1、vueにおける非同期レンダリングデータの問題
2、computed定義変数、変数にset/getメソッドと定義されていない違いを定義する
3、vueにおける応答式データメカニズム
4、javascriptの定義対象属性のObject.definedProperty()
転載先:https://www.cnblogs.com/yy95/p/9872534.html