fix(runtome-dom): properly support creating customized built-in element
This commit is contained in:
parent
412ec86128
commit
b1d0b046af
@ -102,7 +102,11 @@ export interface RendererOptions<
|
|||||||
): void
|
): void
|
||||||
insert(el: HostNode, parent: HostElement, anchor?: HostNode | null): void
|
insert(el: HostNode, parent: HostElement, anchor?: HostNode | null): void
|
||||||
remove(el: HostNode): void
|
remove(el: HostNode): void
|
||||||
createElement(type: string, isSVG?: boolean): HostElement
|
createElement(
|
||||||
|
type: string,
|
||||||
|
isSVG?: boolean,
|
||||||
|
isCustomizedBuiltIn?: string
|
||||||
|
): HostElement
|
||||||
createText(text: string): HostNode
|
createText(text: string): HostNode
|
||||||
createComment(text: string): HostNode
|
createComment(text: string): HostNode
|
||||||
setText(node: HostNode, text: string): void
|
setText(node: HostNode, text: string): void
|
||||||
@ -549,7 +553,11 @@ function baseCreateRenderer(
|
|||||||
// exactly the same, and we can simply do a clone here.
|
// exactly the same, and we can simply do a clone here.
|
||||||
el = vnode.el = hostCloneNode(vnode.el)
|
el = vnode.el = hostCloneNode(vnode.el)
|
||||||
} else {
|
} else {
|
||||||
el = vnode.el = hostCreateElement(vnode.type as string, isSVG)
|
el = vnode.el = hostCreateElement(
|
||||||
|
vnode.type as string,
|
||||||
|
isSVG,
|
||||||
|
props && props.is
|
||||||
|
)
|
||||||
// props
|
// props
|
||||||
if (props) {
|
if (props) {
|
||||||
for (const key in props) {
|
for (const key in props) {
|
||||||
|
20
packages/runtime-dom/__tests__/customizedBuiltIn.spec.ts
Normal file
20
packages/runtime-dom/__tests__/customizedBuiltIn.spec.ts
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import { render, h } from '@vue/runtime-dom'
|
||||||
|
|
||||||
|
describe('customimized built-in elements support', () => {
|
||||||
|
let createElement: jest.SpyInstance
|
||||||
|
afterEach(() => {
|
||||||
|
createElement.mockRestore()
|
||||||
|
})
|
||||||
|
|
||||||
|
test('should created element with is option', () => {
|
||||||
|
const root = document.createElement('div')
|
||||||
|
createElement = jest.spyOn(document, 'createElement')
|
||||||
|
render(h('button', { is: 'plastic-button' }), root)
|
||||||
|
expect(createElement.mock.calls[0]).toMatchObject([
|
||||||
|
'button',
|
||||||
|
{ is: 'plastic-button' }
|
||||||
|
])
|
||||||
|
// should also render the attribute
|
||||||
|
expect(root.innerHTML).toBe(`<button is="plastic-button"></button>`)
|
||||||
|
})
|
||||||
|
})
|
@ -22,8 +22,10 @@ export const nodeOps: Omit<RendererOptions<Node, Element>, 'patchProp'> = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
createElement: (tag, isSVG): Element =>
|
createElement: (tag, isSVG, is): Element =>
|
||||||
isSVG ? doc.createElementNS(svgNS, tag) : doc.createElement(tag),
|
isSVG
|
||||||
|
? doc.createElementNS(svgNS, tag)
|
||||||
|
: doc.createElement(tag, is ? { is } : undefined),
|
||||||
|
|
||||||
createText: text => doc.createTextNode(text),
|
createText: text => doc.createTextNode(text),
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user