v0.0.15: Function components

This commit is contained in:
2020-06-09 00:25:27 +02:00
parent 0da07549e7
commit 15506fe890
12 changed files with 1266 additions and 577 deletions

View File

@@ -1,6 +1,6 @@
{
"name": "@cerxes/csx",
"version": "0.0.13",
"version": "0.0.15",
"author": "Miel Truyen <miel.truyen@cerxes.net>",
"description": "CSX is a minimalistic UI-framework inspired by React+JSX for usage with WebComponents.",
"repository": {

View File

@@ -48,11 +48,16 @@ export function getNodeMeta(vnode) {
renderer: ShadowNodeRenderer,
normedType: ShadowDOM
};
} else {
} else if( typeof(type) === 'string' || type?.tagName){
return {
...NodeTreeRenderer.meta(),
renderer: NodeTreeRenderer,
normedType: window.customElements?.get(type) ?? type
};
}else if( typeof(type) === 'function'){
// Function component! (TODO we need to refine this case)
return 'function';
}else{
throw new Error("No renderer for type:", type);
}
}

View File

@@ -269,7 +269,14 @@ function flattenVNodeChildren(vnode){
if (next instanceof Array) queue.splice(0, 0, ...next);
else {
let meta = getNodeMeta(next);
if (meta) {
if(meta === 'function'){
let resolved = next.type(next.props, next.children);
if(resolved instanceof Array){
queue.splice(0,0, ...resolved)
}else{
queue.splice(0,0,resolved);
}
} else if (meta) {
children.push({ vnode: next, meta });
}else{
// null or undefined child, ignored

View File

@@ -16,7 +16,7 @@ export const HostNodeRenderer = {
meta(){
return {
hasChildren: true,
isNode: true, // Host node should always
isNode: false, // Host node itself has no place in the hierarchy, and is of a spcial type
};
},