diff --git a/src/core/instance/render-helpers/render-list.js b/src/core/instance/render-helpers/render-list.js index 22cc8583926..09ec4cddb11 100644 --- a/src/core/instance/render-helpers/render-list.js +++ b/src/core/instance/render-helpers/render-list.js @@ -1,6 +1,6 @@ /* @flow */ -import { isObject } from 'core/util/index' +import { isObject, isDef } from 'core/util/index' /** * Runtime helper for rendering v-for lists. @@ -28,5 +28,8 @@ export function renderList ( ret[i] = render(val[key], key, i) } } + if (isDef(ret)) { + (ret: any)._isVList = true + } return ret } diff --git a/src/core/vdom/helpers/normalize-children.js b/src/core/vdom/helpers/normalize-children.js index cc400e1abb1..700b9b2318a 100644 --- a/src/core/vdom/helpers/normalize-children.js +++ b/src/core/vdom/helpers/normalize-children.js @@ -1,7 +1,7 @@ /* @flow */ import VNode, { createTextVNode } from 'core/vdom/vnode' -import { isFalse, isDef, isUndef, isPrimitive } from 'shared/util' +import { isFalse, isTrue, isDef, isUndef, isPrimitive } from 'shared/util' // The template compiler attempts to minimize the need for normalization by // statically analyzing the template at compile time. @@ -58,7 +58,10 @@ function normalizeArrayChildren (children: any, nestedIndex?: string): Array { expect(vm.$el.textContent).toBe('2foo') }).then(done) }) + + it('the elements of slot should be updated correctly', done => { + const vm = new Vue({ + data: { n: 1 }, + template: '
{{ i }}
', + components: { + test: { + template: '
' + } + } + }).$mount() + expect(vm.$el.innerHTML).toBe('
1
') + const input = vm.$el.querySelector('input') + input.value = 'b' + vm.n++ + waitForUpdate(() => { + expect(vm.$el.innerHTML).toBe('
12
') + expect(vm.$el.querySelector('input')).toBe(input) + expect(vm.$el.querySelector('input').value).toBe('b') + }).then(done) + }) }) diff --git a/test/unit/modules/vdom/create-element.spec.js b/test/unit/modules/vdom/create-element.spec.js index f937cbc52fe..c2f0d048ec1 100644 --- a/test/unit/modules/vdom/create-element.spec.js +++ b/test/unit/modules/vdom/create-element.spec.js @@ -152,4 +152,32 @@ describe('create-element', () => { }).$mount() expect('Avoid using observed data object as vnode data').toHaveBeenWarned() }) + + it('nested child elements should be updated correctly', done => { + const vm = new Vue({ + data: { n: 1 }, + render (h) { + const list = [] + for (let i = 0; i < this.n; i++) { + list.push(h('span', i)) + } + const input = h('input', { + attrs: { + value: 'a', + type: 'text' + } + }) + return h('div', [[...list, input]]) + } + }).$mount() + expect(vm.$el.innerHTML).toBe('0') + const el = vm.$el.querySelector('input') + el.value = 'b' + vm.n++ + waitForUpdate(() => { + expect(vm.$el.innerHTML).toBe('01') + expect(vm.$el.querySelector('input')).toBe(el) + expect(vm.$el.querySelector('input').value).toBe('b') + }).then(done) + }) })