Skip to content

Commit aa7143d

Browse files
committed
feat(omi): Function component is supported! 🎉
1 parent 8719ef9 commit aa7143d

File tree

6 files changed

+40
-10
lines changed

6 files changed

+40
-10
lines changed

‎packages/omi/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "omi",
3-
"version": "7.4.6",
3+
"version": "7.5.0",
44
"scripts": {
55
"start": "vite",
66
"dev-vite": "vite",

‎packages/omi/src/diff.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,9 @@ function idiff(
144144
}
145145

146146
let vnodeName = vnode.nodeName
147-
if (typeof vnodeName !== 'string') {
148-
vnodeName = (vnodeName as Component).tagName
149-
}
147+
// if (typeof vnodeName !== 'string') {
148+
// vnodeName = (vnodeName as Component).tagName
149+
// }
150150

151151
// Tracks entering and exiting SVG namespace when descending through the tree.
152152
isForeignObject = vnodeName === 'foreignObject'

‎packages/omi/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,4 @@ export { Signal } from './signal'
1818
export { css } from './css-tag'
1919
export { mixin } from './options'
2020
export { registerDirective } from './directive'
21-
export const version = '7.4.6'
21+
export const version = '7.5.0'

‎packages/omi/src/utils.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,8 @@ export function isSameNodeType(node: ExtendedElement, vnode: VNode): boolean {
111111
if (typeof vnode === 'string' || typeof vnode === 'number') {
112112
return node.splitText !== undefined
113113
}
114-
const nodeName = (vnode as ObjectVNode).nodeName
115-
return isNamedNode(
116-
node,
117-
typeof nodeName !== 'string' ? (nodeName as Component).tagName : nodeName,
118-
)
114+
115+
return isNamedNode(node, (vnode as ObjectVNode).nodeName as string)
119116
}
120117

121118
/**

‎packages/omi/src/vdom.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,17 @@ export function createElement(
7171
}
7272
}
7373

74+
// fragment component
7475
if (nodeName === Fragment) {
7576
return children
77+
} else if (typeof nodeName === 'function') {
78+
if ((nodeName as unknown as Component).tagName) {
79+
// class component
80+
nodeName = (nodeName as unknown as Component).tagName
81+
} else {
82+
// function component
83+
return nodeName(attributes)
84+
}
7685
}
7786

7887
const p: VNode = {

‎packages/omi/test/base.test.jsx

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,4 +441,28 @@ describe('base', () => {
441441
expect(parentElement.firstChild.shadowRoot.firstChild.firstChild.shadowRoot.innerHTML).toBe('<span>a</span>')
442442

443443
})
444+
445+
it('rendering function', () => {
446+
447+
function ChildComponent(props) {
448+
return (
449+
<span>{props.msg}</span>
450+
)
451+
}
452+
453+
class ParentComponent extends Component {
454+
render() {
455+
return (
456+
<div>
457+
<ChildComponent msg="omi" />
458+
</div>
459+
)
460+
}
461+
}
462+
let node = genNode()
463+
define(node.name, ParentComponent)
464+
render(<ParentComponent />, parentElement)
465+
expect(parentElement.firstChild.shadowRoot.firstChild.innerHTML).toBe('<span>omi</span>')
466+
467+
})
444468
})

0 commit comments

Comments
 (0)