Przeglądaj źródła

fix v-repeat building duplicate primitive values

Evan You 11 lat temu
rodzic
commit
3406fc0b73

+ 6 - 4
src/directives/repeat.js

@@ -193,6 +193,7 @@ module.exports = {
         }
         }
       } else { // new instance
       } else { // new instance
         vm = this.build(obj, i)
         vm = this.build(obj, i)
+        vm._new = true
       }
       }
       vms[i] = vm
       vms[i] = vm
       // insert if this is first run
       // insert if this is first run
@@ -246,6 +247,7 @@ module.exports = {
           vm.$before(targetNext.$el)
           vm.$before(targetNext.$el)
         }
         }
       }
       }
+      vm._new = false
       vm._reused = false
       vm._reused = false
     }
     }
     return vms
     return vms
@@ -392,10 +394,10 @@ module.exports = {
       if (cached) {
       if (cached) {
         var i = 0
         var i = 0
         var vm = cached[i]
         var vm = cached[i]
-        // since duplicated vm instances might be reused
-        // already, we need to return the first non-reused
-        // instance.
-        while (vm && vm._reused) {
+        // since duplicated vm instances might be a reused
+        // one OR a newly created one, we need to return the
+        // first instance that is neither of these.
+        while (vm && (vm._reused || vm._new)) {
           vm = cached[++i]
           vm = cached[++i]
         }
         }
         return vm
         return vm

+ 3 - 3
test/unit/specs/directives/repeat_spec.js

@@ -25,7 +25,7 @@ if (_.inBrowser) {
       var vm = new Vue({
       var vm = new Vue({
         el: el,
         el: el,
         data: {
         data: {
-          items: [1, 2]
+          items: [2, 1, 2]
         },
         },
         template: '<div v-repeat="items">{{$index}} {{$value}}</div>'
         template: '<div v-repeat="items">{{$index}} {{$value}}</div>'
       })
       })
@@ -47,7 +47,7 @@ if (_.inBrowser) {
       var vm = new Vue({
       var vm = new Vue({
         el: el,
         el: el,
         data: {
         data: {
-          items: [1, 2]
+          items: [2, 1, 2]
         },
         },
         template: '<div v-repeat="item:items">{{$index}} {{item}}</div>'
         template: '<div v-repeat="item:items">{{$index}} {{item}}</div>'
       })
       })
@@ -502,7 +502,7 @@ function assertPrimitiveMutations (vm, el, done) {
   go(
   go(
     function () {
     function () {
       // check duplicate
       // check duplicate
-      vm.items.push(2, 3)
+      vm.items.push(2, 2, 3)
     },
     },
     assertMarkup
     assertMarkup
   )
   )