2017-03-27 1 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부터 시작하지만 어떻게 특정 항목을 삭제할 수 있습니까? – enriqg9

+2

나는 "승인 된"Vue 접근법이 무엇인지 알기에 Vue에 대해 충분히 알지 못하지만 JS에는 객체가 있으므로 아마도 한 가지 접근법은 객체의 배열을 '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

관련 문제