2017-08-15 52 views
2

我正在建設以下場景。 Parent創建一個子組件的多個實例。每個孩子通過輸入字段保存其數據。孩子可以要求被刪除,父母會刪除該實例。到現在爲止還挺好。所以現在就是這個問題,一旦這個實例被移除,它的數據被傳遞/泄漏到下一個兄弟實例,並且如果該實例正在保存數據,它就會被移動到其他的next-to-it實例。我在這裏重現它fiddle爲什麼數據泄露到兄弟組件的實例當刪除vue 2

或見下文

Vue.component('child', { 
 
    \t props:['data'], 
 
     template: ` 
 
      <div> 
 
       index# {{data}}: {{messages}} 
 
       <input type="text" v-model="text" @keypress.enter="addMessage" placeholder="add some data then delete it"> 
 
       <button @click="addMessage">Add</button> 
 
       <button @click="$emit('delete-me')">Delete</button> 
 
      </div>`, 
 
      data() { 
 
      \t return { 
 
       \t messages:[], 
 
       text: '' 
 
       } 
 
      }, 
 
      methods: { 
 
      \t addMessage() { 
 
       \t this.messages.push(this.text) 
 
       this.text = '' 
 
       } 
 
      } 
 
    }) 
 
    
 
    Vue.component('parent', { 
 
     template: ` 
 
      <div> 
 
       Keep Adding new Instances 
 
       <button @click="newChild">New</button> 
 
       <hr /> 
 
       <child v-for="(child, index) in children" key="index" 
 
       v-on:delete-me="deleteThisRow(index)"" 
 
       :data="child" 
 
       ></child> 
 
      </div>`, 
 
      data() { 
 
      \t return { 
 
       \t children:[] 
 
       } 
 
     }, 
 
     methods: { 
 
     \t newChild() { 
 
      \t this.children.push(this.children.length) 
 
      }, 
 
      deleteThisRow(index) { 
 
       this.children.splice(index, 1); 
 
      } 
 
     } 
 
    }) 
 
    
 
    new Vue({ 
 
     el: '#app', 
 
     template: ` 
 
      <div> 
 
      \t \t <parent /> 
 
       
 
      </div> 
 
     `, 
 
     
 
     methods: { 
 
      
 
     } 
 
    }) 
 

 

 
    
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.3/vue.min.js"></script> 
 
<div id="app"></div>

回答

1

兩個錯誤:的

  1. :key代替key

原因:由於動態值可能變動,Vue公司應該知道這個修改 保持自身的更新index

原因

  • 的孩子,而不是:不確定,但可能是因爲Vue已經在虛擬DOM中擁有自己的索引副本,所以它只需要值