2017-03-27 14 views
2

Vueで数秒後に自動的に閉じる必要のある通知を表示するコンポーネントを作成しています。アラートコンポーネントが「期限切れ」イベントを発行し、親イベントをリッスンして削除しますそれはスプライスを持つ親データ配列からですが、これは時々動作しますが、時には 'アラート'は削除されません。タイムアウト時にアレイから項目を削除する

Vue.component('alert', { 
    template: '<li><slot></slot></li>', 
    mounted() { 
    setTimeout(() => this.$emit('expired'), 2000) 
    } 
}); 

new Vue({ 
    el: '#app', 
    data: { 
    count: 0, 
    alerts: [] 
    }, 
    methods: { 
     createAlert(){ 
     this.alerts.push(this.count++) 
     }, 
     removeItem(index) { 
     this.alerts.splice(index, 1) 
     } 
    } 
}); 

this Fiddleを参照してCreate Alertボタンを数回クリックして、アラートの一部が却下されません。どのようにこれを解決するための任意のアイデアですか?

+0

ヒント:アイテムが配列から削除された場合、その後のアイテムのインデックスはどうなりますか? – nnnnnn

+0

@nnnnnnリセットして0から再開しますが、javascriptに結合配列がない場合、どのように特定の項目を削除できますか? – enriqg9

+2

"承認された" Vueアプローチが何であるか知るには、Vueについて十分に分かりませんが、JSにはオブジェクトがあるので、おそらく1つのアプローチは 'id'と' text'プロパティを持つオブジェクトの配列を持つことです何でも)、remove関数では、正しい 'id'を持つオブジェクトの配列を検索します。 – nnnnnn

答えて

2

コメントに記載されているとおり、インデックスでは行わないでください。ここに一つの選択肢があります。

<div id="app"> 
    <button @click="createAlert"> 
    Create Alert 
    </button> 
    <alert v-for="(alert, index) in alerts" :key="alert.id" :alert="alert" @expired="removeItem(alert)">{{ alert.id }}</alert> 
</div> 

Vue.component('alert', { 
    props: ["alert"], 
    template: '<li><slot></slot></li>', 
    mounted() { 
    setTimeout(() => this.$emit('expired', alert), 2000) 
    } 
}); 

new Vue({ 
    el: '#app', 
    data: { 
    count: 0, 
    alerts: [] 
    }, 
    methods: { 
     createAlert(){ 
     this.alerts.push({id: this.count++}) 
     }, 
     removeItem(alert) { 
     this.alerts.splice(this.alerts.indexOf(alert), 1) 
     } 
    } 
}); 

Your fiddle revised

+0

ありがとう、ここで使われている 'key'プロパティは何ですか? – enriqg9

+0

@ enriqg9 'v-for'を使うときはいつでも、Vueがリストに追加/削除する正しいノードを識別するのを助ける' key'プロパティを使うべきです。 https://vuejs.org/v2/api/#key – Bert

+0

ドキュメントから、「2.2.0以降では、コンポーネントでv-forを使用する場合、キーが必要になりました。 https://vuejs.org/v2/guide/list.html – Bert

関連する問題