test(createRenderer): add tests for portal and fix found bugs
This commit is contained in:
parent
4b9483fd5e
commit
1a361e2e71
@ -0,0 +1,23 @@
|
|||||||
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||||
|
|
||||||
|
exports[`renderer: portal should update children 1`] = `"<div>teleported</div>"`;
|
||||||
|
|
||||||
|
exports[`renderer: portal should update children 2`] = `""`;
|
||||||
|
|
||||||
|
exports[`renderer: portal should update children 3`] = `"teleported"`;
|
||||||
|
|
||||||
|
exports[`renderer: portal should update target 1`] = `"<!----><!--[object Object]--><div>root</div><!---->"`;
|
||||||
|
|
||||||
|
exports[`renderer: portal should update target 2`] = `"<div>teleported</div>"`;
|
||||||
|
|
||||||
|
exports[`renderer: portal should update target 3`] = `""`;
|
||||||
|
|
||||||
|
exports[`renderer: portal should update target 4`] = `"<!----><!--[object Object]--><div>root</div><!---->"`;
|
||||||
|
|
||||||
|
exports[`renderer: portal should update target 5`] = `""`;
|
||||||
|
|
||||||
|
exports[`renderer: portal should update target 6`] = `"<div>teleported</div>"`;
|
||||||
|
|
||||||
|
exports[`renderer: portal should work 1`] = `"<!----><!--[object Object]--><div>root</div><!---->"`;
|
||||||
|
|
||||||
|
exports[`renderer: portal should work 2`] = `"<div>teleported</div>"`;
|
@ -1,3 +1,84 @@
|
|||||||
|
import {
|
||||||
|
nodeOps,
|
||||||
|
serializeInner,
|
||||||
|
render,
|
||||||
|
h,
|
||||||
|
createComponent,
|
||||||
|
Portal,
|
||||||
|
Text,
|
||||||
|
Fragment,
|
||||||
|
ref,
|
||||||
|
nextTick,
|
||||||
|
TestElement,
|
||||||
|
TestNode
|
||||||
|
} from '@vue/runtime-test'
|
||||||
|
import { VNodeChildren } from '../src/vnode'
|
||||||
|
|
||||||
describe('renderer: portal', () => {
|
describe('renderer: portal', () => {
|
||||||
test.todo('should work')
|
test('should work', () => {
|
||||||
|
const target = nodeOps.createElement('div')
|
||||||
|
const root = nodeOps.createElement('div')
|
||||||
|
|
||||||
|
const Comp = createComponent(() => () =>
|
||||||
|
h(Fragment, [
|
||||||
|
h(Portal, { target }, h('div', 'teleported')),
|
||||||
|
h('div', 'root')
|
||||||
|
])
|
||||||
|
)
|
||||||
|
render(h(Comp), root)
|
||||||
|
|
||||||
|
expect(serializeInner(root)).toMatchSnapshot()
|
||||||
|
expect(serializeInner(target)).toMatchSnapshot()
|
||||||
|
})
|
||||||
|
|
||||||
|
test('should update target', async () => {
|
||||||
|
const targetA = nodeOps.createElement('div')
|
||||||
|
const targetB = nodeOps.createElement('div')
|
||||||
|
const target = ref(targetA)
|
||||||
|
const root = nodeOps.createElement('div')
|
||||||
|
|
||||||
|
const Comp = createComponent(() => () =>
|
||||||
|
h(Fragment, [
|
||||||
|
h(Portal, { target }, h('div', 'teleported')),
|
||||||
|
h('div', 'root')
|
||||||
|
])
|
||||||
|
)
|
||||||
|
render(h(Comp), root)
|
||||||
|
|
||||||
|
expect(serializeInner(root)).toMatchSnapshot()
|
||||||
|
expect(serializeInner(targetA)).toMatchSnapshot()
|
||||||
|
expect(serializeInner(targetB)).toMatchSnapshot()
|
||||||
|
|
||||||
|
target.value = targetB
|
||||||
|
await nextTick()
|
||||||
|
|
||||||
|
expect(serializeInner(root)).toMatchSnapshot()
|
||||||
|
expect(serializeInner(targetA)).toMatchSnapshot()
|
||||||
|
expect(serializeInner(targetB)).toMatchSnapshot()
|
||||||
|
})
|
||||||
|
|
||||||
|
test('should update children', async () => {
|
||||||
|
const target = nodeOps.createElement('div')
|
||||||
|
const root = nodeOps.createElement('div')
|
||||||
|
const children = ref<VNodeChildren<TestNode, TestElement>>([
|
||||||
|
h('div', 'teleported')
|
||||||
|
])
|
||||||
|
|
||||||
|
const Comp = createComponent(() => () =>
|
||||||
|
h(Portal, { target }, children.value)
|
||||||
|
)
|
||||||
|
render(h(Comp), root)
|
||||||
|
|
||||||
|
expect(serializeInner(target)).toMatchSnapshot()
|
||||||
|
|
||||||
|
children.value = []
|
||||||
|
await nextTick()
|
||||||
|
|
||||||
|
expect(serializeInner(target)).toMatchSnapshot()
|
||||||
|
|
||||||
|
children.value = [h(Text, 'teleported')]
|
||||||
|
await nextTick()
|
||||||
|
|
||||||
|
expect(serializeInner(target)).toMatchSnapshot()
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
@ -680,7 +680,11 @@ export function createRenderer<
|
|||||||
isSVG: boolean,
|
isSVG: boolean,
|
||||||
optimized: boolean
|
optimized: boolean
|
||||||
) {
|
) {
|
||||||
const targetSelector = n2.props && n2.props.target
|
let targetSelector = n2.props && n2.props.target
|
||||||
|
if (isRef(targetSelector)) {
|
||||||
|
targetSelector = targetSelector.value
|
||||||
|
}
|
||||||
|
|
||||||
const { patchFlag, shapeFlag, children } = n2
|
const { patchFlag, shapeFlag, children } = n2
|
||||||
if (n1 == null) {
|
if (n1 == null) {
|
||||||
const target = (n2.target = isString(targetSelector)
|
const target = (n2.target = isString(targetSelector)
|
||||||
@ -733,7 +737,7 @@ export function createRenderer<
|
|||||||
if (targetSelector !== (n1.props && n1.props.target)) {
|
if (targetSelector !== (n1.props && n1.props.target)) {
|
||||||
const nextTarget = (n2.target = isString(targetSelector)
|
const nextTarget = (n2.target = isString(targetSelector)
|
||||||
? hostQuerySelector(targetSelector)
|
? hostQuerySelector(targetSelector)
|
||||||
: null)
|
: targetSelector)
|
||||||
if (nextTarget != null) {
|
if (nextTarget != null) {
|
||||||
// move content
|
// move content
|
||||||
if (shapeFlag & ShapeFlags.TEXT_CHILDREN) {
|
if (shapeFlag & ShapeFlags.TEXT_CHILDREN) {
|
||||||
|
Loading…
Reference in New Issue
Block a user