Skip to content

Commit 7870fc0

Browse files
authored
feat(runtime-vapor): v-html and v-text work with component (#13496)
1 parent bba328a commit 7870fc0

File tree

12 files changed

+368
-11
lines changed

12 files changed

+368
-11
lines changed

packages/compiler-vapor/__tests__/transforms/__snapshots__/vHtml.spec.ts.snap

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,24 @@ export function render(_ctx) {
3232
return n0
3333
}"
3434
`;
35+
36+
exports[`v-html > work with component 1`] = `
37+
"import { resolveComponent as _resolveComponent, createComponentWithFallback as _createComponentWithFallback, setBlockHtml as _setBlockHtml, renderEffect as _renderEffect } from 'vue';
38+
39+
export function render(_ctx) {
40+
const _component_Comp = _resolveComponent("Comp")
41+
const n0 = _createComponentWithFallback(_component_Comp, null, null, true)
42+
_renderEffect(() => _setBlockHtml(n0, _ctx.foo))
43+
return n0
44+
}"
45+
`;
46+
47+
exports[`v-html > work with dynamic component 1`] = `
48+
"import { createDynamicComponent as _createDynamicComponent, setBlockHtml as _setBlockHtml, renderEffect as _renderEffect } from 'vue';
49+
50+
export function render(_ctx) {
51+
const n0 = _createDynamicComponent(() => (_ctx.Comp), null, null, true)
52+
_renderEffect(() => _setBlockHtml(n0, _ctx.foo))
53+
return n0
54+
}"
55+
`;

packages/compiler-vapor/__tests__/transforms/__snapshots__/vText.spec.ts.snap

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,24 @@ export function render(_ctx) {
3333
return n0
3434
}"
3535
`;
36+
37+
exports[`v-text > work with component 1`] = `
38+
"import { resolveComponent as _resolveComponent, createComponentWithFallback as _createComponentWithFallback, toDisplayString as _toDisplayString, setBlockText as _setBlockText, renderEffect as _renderEffect } from 'vue';
39+
40+
export function render(_ctx) {
41+
const _component_Comp = _resolveComponent("Comp")
42+
const n0 = _createComponentWithFallback(_component_Comp, null, null, true)
43+
_renderEffect(() => _setBlockText(n0, _toDisplayString(_ctx.foo)))
44+
return n0
45+
}"
46+
`;
47+
48+
exports[`v-text > work with dynamic component 1`] = `
49+
"import { createDynamicComponent as _createDynamicComponent, toDisplayString as _toDisplayString, setBlockText as _setBlockText, renderEffect as _renderEffect } from 'vue';
50+
51+
export function render(_ctx) {
52+
const n0 = _createDynamicComponent(() => (_ctx.Comp), null, null, true)
53+
_renderEffect(() => _setBlockText(n0, _toDisplayString(_ctx.foo)))
54+
return n0
55+
}"
56+
`;

packages/compiler-vapor/__tests__/transforms/vHtml.spec.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,18 @@ describe('v-html', () => {
5454
expect(code).matchSnapshot()
5555
})
5656

57+
test('work with dynamic component', () => {
58+
const { code } = compileWithVHtml(`<component :is="Comp" v-html="foo"/>`)
59+
expect(code).matchSnapshot()
60+
expect(code).contains('setBlockHtml(n0, _ctx.foo))')
61+
})
62+
63+
test('work with component', () => {
64+
const { code } = compileWithVHtml(`<Comp v-html="foo"/>`)
65+
expect(code).matchSnapshot()
66+
expect(code).contains('setBlockHtml(n0, _ctx.foo))')
67+
})
68+
5769
test('should raise error and ignore children when v-html is present', () => {
5870
const onError = vi.fn()
5971
const { code, ir, helpers } = compileWithVHtml(

packages/compiler-vapor/__tests__/transforms/vText.spec.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,18 @@ describe('v-text', () => {
5858
expect(code).matchSnapshot()
5959
})
6060

61+
test('work with dynamic component', () => {
62+
const { code } = compileWithVText(`<component :is="Comp" v-text="foo"/>`)
63+
expect(code).matchSnapshot()
64+
expect(code).contains('setBlockText(n0, _toDisplayString(_ctx.foo))')
65+
})
66+
67+
test('work with component', () => {
68+
const { code } = compileWithVText(`<Comp v-text="foo"/>`)
69+
expect(code).matchSnapshot()
70+
expect(code).contains('setBlockText(n0, _toDisplayString(_ctx.foo))')
71+
})
72+
6173
test('should raise error and ignore children when v-text is present', () => {
6274
const onError = vi.fn()
6375
const { code, ir } = compileWithVText(`<div v-text="test">hello</div>`, {

packages/compiler-vapor/src/generators/html.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,15 @@ export function genSetHtml(
88
context: CodegenContext,
99
): CodeFragment[] {
1010
const { helper } = context
11-
const { value, element } = oper
11+
12+
const { value, element, isComponent } = oper
1213
return [
1314
NEWLINE,
14-
...genCall(helper('setHtml'), `n${element}`, genExpression(value, context)),
15+
...genCall(
16+
// use setBlockHtml for component
17+
isComponent ? helper('setBlockHtml') : helper('setHtml'),
18+
`n${element}`,
19+
genExpression(value, context),
20+
),
1521
]
1622
}

packages/compiler-vapor/src/generators/text.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,16 @@ export function genSetText(
1010
context: CodegenContext,
1111
): CodeFragment[] {
1212
const { helper } = context
13-
const { element, values, generated, jsx } = oper
13+
const { element, values, generated, jsx, isComponent } = oper
1414
const texts = combineValues(values, context, jsx)
1515
return [
1616
NEWLINE,
17-
...genCall(helper('setText'), `${generated ? 'x' : 'n'}${element}`, texts),
17+
...genCall(
18+
// use setBlockText for component
19+
isComponent ? helper('setBlockText') : helper('setText'),
20+
`${generated && !isComponent ? 'x' : 'n'}${element}`,
21+
texts,
22+
),
1823
]
1924
}
2025

packages/compiler-vapor/src/ir/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ export interface SetTextIRNode extends BaseIRNode {
126126
values: SimpleExpressionNode[]
127127
generated?: boolean // whether this is a generated empty text node by `processTextLikeContainer`
128128
jsx?: boolean
129+
isComponent?: boolean
129130
}
130131

131132
export type KeyOverride = [find: string, replacement: string]
@@ -152,6 +153,7 @@ export interface SetHtmlIRNode extends BaseIRNode {
152153
type: IRNodeTypes.SET_HTML
153154
element: number
154155
value: SimpleExpressionNode
156+
isComponent?: boolean
155157
}
156158

157159
export interface SetTemplateRefIRNode extends BaseIRNode {

packages/compiler-vapor/src/transforms/vHtml.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,6 @@ export const transformVHtml: DirectiveTransform = (dir, node, context) => {
2222
type: IRNodeTypes.SET_HTML,
2323
element: context.reference(),
2424
value: exp,
25+
isComponent: node.tagType === 1,
2526
})
2627
}

packages/compiler-vapor/src/transforms/vText.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
import { DOMErrorCodes, createDOMCompilerError } from '@vue/compiler-dom'
1+
import {
2+
DOMErrorCodes,
3+
ElementTypes,
4+
createDOMCompilerError,
5+
} from '@vue/compiler-dom'
26
import { IRNodeTypes } from '../ir'
37
import { EMPTY_EXPRESSION } from './utils'
48
import type { DirectiveTransform } from '../transform'
@@ -30,15 +34,19 @@ export const transformVText: DirectiveTransform = (dir, node, context) => {
3034
context.childrenTemplate = [String(literal)]
3135
} else {
3236
context.childrenTemplate = [' ']
33-
context.registerOperation({
34-
type: IRNodeTypes.GET_TEXT_CHILD,
35-
parent: context.reference(),
36-
})
37+
const isComponent = node.tagType === ElementTypes.COMPONENT
38+
if (!isComponent) {
39+
context.registerOperation({
40+
type: IRNodeTypes.GET_TEXT_CHILD,
41+
parent: context.reference(),
42+
})
43+
}
3744
context.registerEffect([exp], {
3845
type: IRNodeTypes.SET_TEXT,
3946
element: context.reference(),
4047
values: [exp],
4148
generated: true,
49+
isComponent,
4250
})
4351
}
4452
}

0 commit comments

Comments
 (0)