|
|
@@ -10,9 +10,13 @@ import {
|
|
|
dumpOps,
|
|
|
NodeOpTypes,
|
|
|
serializeInner,
|
|
|
- createTextVNode
|
|
|
+ createTextVNode,
|
|
|
+ createBlock,
|
|
|
+ openBlock,
|
|
|
+ createCommentVNode
|
|
|
} from '@vue/runtime-test'
|
|
|
import { PatchFlags } from '@vue/shared'
|
|
|
+import { renderList } from '../src/helpers/renderList'
|
|
|
|
|
|
describe('renderer: fragment', () => {
|
|
|
it('should allow returning multiple component root nodes', () => {
|
|
|
@@ -269,4 +273,46 @@ describe('renderer: fragment', () => {
|
|
|
render(null, root)
|
|
|
expect(serializeInner(root)).toBe(``)
|
|
|
})
|
|
|
+
|
|
|
+ // #2080
|
|
|
+ test('`template` keyed fragment w/ comment + hoisted node', () => {
|
|
|
+ const root = nodeOps.createElement('div')
|
|
|
+ const hoisted = h('span')
|
|
|
+
|
|
|
+ const renderFn = (items: string[]) => {
|
|
|
+ return (
|
|
|
+ openBlock(true),
|
|
|
+ createBlock(
|
|
|
+ Fragment,
|
|
|
+ null,
|
|
|
+ renderList(items, item => {
|
|
|
+ return (
|
|
|
+ openBlock(),
|
|
|
+ createBlock(
|
|
|
+ Fragment,
|
|
|
+ { key: item },
|
|
|
+ [
|
|
|
+ createCommentVNode('comment'),
|
|
|
+ hoisted,
|
|
|
+ createVNode('div', null, item, PatchFlags.TEXT)
|
|
|
+ ],
|
|
|
+ PatchFlags.STABLE_FRAGMENT
|
|
|
+ )
|
|
|
+ )
|
|
|
+ }),
|
|
|
+ PatchFlags.KEYED_FRAGMENT
|
|
|
+ )
|
|
|
+ )
|
|
|
+ }
|
|
|
+
|
|
|
+ render(renderFn(['one', 'two']), root)
|
|
|
+ expect(serializeInner(root)).toBe(
|
|
|
+ `<!--comment--><span></span><div>one</div><!--comment--><span></span><div>two</div>`
|
|
|
+ )
|
|
|
+
|
|
|
+ render(renderFn(['two', 'one']), root)
|
|
|
+ expect(serializeInner(root)).toBe(
|
|
|
+ `<!--comment--><span></span><div>two</div><!--comment--><span></span><div>one</div>`
|
|
|
+ )
|
|
|
+ })
|
|
|
})
|