2017-10-29 9 views
2

私はVueJsを学習しています。私は自分の問題に最適な解決策を見つけようとしています。
this.$set()を複数回呼び出すと、最後のコールだけが登録されるという問題があります。複数のVue.set()はオブジェクト/ DOMを更新していません

私はsetTimeoutを使用しようとしましたが(古いangular1日のように)、まだ動作しません。
DOMを再レンダリングするVue.$nextTick()を試しましたが、データがオブジェクトに十分に速く追加されていないようです。

デモを確認here
すべてのボタンを複数回押すと、ほとんどの場合、最初のログはスキップされます。

答えて

2

Date.now()の使用が正しくありません。 タイムスタンプが非常に速いため、時々タイムスタンプが2 this.$set操作の間で変更されないため、logsオブジェクトの値を上書きします。最後1509287061243財産だった

{ 
    1509287060410:"I was clicked!" 
    1509287060412:"I was clicked again!" 
    1509287061243:"I was clicked again!" 
} 

:私は最初のボタンを

1509287060410 // first result of Date.now. 
1509287060412 // Second Result of Date.now - this time, it's different from the first attempt, so 2 different entries will be created. 
1509287061243 // another click on the button - timestamp has changed obviosuly. 
1509287061243 // Javascript did the second Set so far, that time timestamp didn't even changed yet. thus, it overrides the value of the second entry 

をクリックしますので、このログ、4つのthis.$set操作の結果は、このlogsオブジェクトを作成したとき

Date.now()のログを参照してくださいオーバーライド。

(関数の2番目の引数)のキーは、呼び出すたびに異なることを確認してください。

は私の新しいコードの提案を参照してください:

data() { 
    return { 
     title: 'Multiple Vue.set() not updating object/DOM', 
     logs: {}, 
     index: 0 
    } 
    }, 
    methods: { 
    log: function(data) { 
     console.log(Date.now()) 
     this.index += 1 
     this.$set(this.logs, this.index, data) 
    }, 
+0

うわー、私が今まで私は、キーを上書きするかもしれないという事実について考えたことがありません!これをフレームワークの中でやってみると、実際にはそれについて考えて、基本を追い払います。私はこれがAngularワールドで直面していたのと同じことだと思っていました。 ありがとうございました! – tbutcaru

+0

問題はありません。:) – LiranC

1

またArrayにログの種類を変更することができます。この方法では、キーオーバーライドのためにログを見逃すことはありません。例えば、

new Vue({ 
 
    el: '#app', 
 
    data() { 
 
    return { 
 
     logs: [] 
 
    } 
 
    }, 
 
    methods: { 
 
    log(data) { 
 
     this.logs.push({ 
 
     time: Date.now(), 
 
     text: data 
 
     }) 
 
    }, 
 
    logClick() { 
 
     this.log('I was clicked!') 
 
     this.log('I was clicked again!') 
 
    } 
 
    } 
 
})
<div id="app"> 
 
    <button @click="logClick">Log click :)</button> 
 
    <ul v-if="logs"> 
 
    <li v-for="(log, i) in logs" :key="i" v-text="log.text"></li> 
 
    </ul> 
 
</div> 
 
<script src="https://unpkg.com/vue"></script>

+0

私はこれについて知っていますが、なぜオブジェクトで動作しないのか知りたかったのです。 – tbutcaru

関連する問題