Skip to content

program-spiritual/maple-render

Folders and files

NameName
Last commit message
Last commit date

Latest commit

author
1410200695@qq.com
Apr 2, 2021
9fd3692 · Apr 2, 2021

History

19 Commits
Mar 31, 2021
Apr 1, 2021
Mar 31, 2021
Apr 1, 2021
Mar 31, 2021
Apr 1, 2021
Apr 2, 2021
Apr 2, 2021
Apr 1, 2021
Apr 1, 2021
Apr 1, 2021

Repository files navigation

Maple Render

target:

Handwritten implementation of VNode

todo:

  • Patch function
  • Diff algorithm
  • User defined render
  • Build Version

how

Inspired by this project:

http://hcysun.me/vue-design/zh

tutorial

using in vue or any popular framework:

import method

import { h, render } from 'maplerender'

create VNode

 function handler() {
  alert('click me')
}
const elVNode = h(
  'div',
  {
    style: { height: '100px', width: '200px', background: 'red' },
    // click event
    onclick: handler,
  },
  h('div', {
    style: {
      height: '50px',
      width: '50px',
      background: 'green',
    },
    class: [
      'class-a',
      {
        'class-b': true,
        'class-c': false,
      },
    ],
  }),
)

render VNode to DOM

render(elVNode, document.getElementById('demo5'))

render Functional Component

export function MyFunctionalComponent() {
  return h(
    'div',
    {
      style: {
        background: 'green',
      },
    },
    [
      h('span', null, 'component title 1...'),
      h('span', null, 'component title 2...'),
    ],
  )
}
const functionalComponent = h(MyFunctionalComponent)
render(functionalComponent, document.getElementById('functional-component'))

render Stateful Component

export default class MYSuperComponent {
  render() {
    throw 'lack of render function!'
  }
}
export class MyComponent extends MYSuperComponent {
  render() {
    return h(
      'div',
      {
        style: {
          background: 'green',
        },
      },
      [
        h('span', null, 'component title 1...'),
        h('span', null, 'component title 2...'),
      ],
    )
  }
}
const elCLassComponentVNode = h(MyComponent)
render(
  elCLassComponentVNode,
  document.getElementById('customer-class-component'),
)

function: h params:

param desc
tag create element such as 'div', 'svg', Component Object
data bind data to current component , such as {style:{...},class:[....]}
children the child VNodes

function: render params:

param desc
vnode VNode Component Object
container in web platform , it means DOM Object

data struct

the VNode data struct show below:

{
    _isVNode: boolean;
    tag: any;
    data: any;
    key: any;
    children: any;
    flags: any;
    childFlags: any;
    el: any;
}

you can check it on chrome devtools or any other popular browser

interface

VNode

export interface VNode {
  handle?: IFunctionalComponentHandle;
  data: any;
  _isVNode: boolean;
  tag: any;
  key?: string;
  children: any;
  flags: number;
  childFlags: number;
  el: any;
}

IFunctionalComponentHandle

export  interface IFunctionalComponentHandle {
  prev: VNode;
  next: VNode;
  container: HTMLElement;
  update: Function
}

Customer Render Options

export interface CustomerRenderOptions {
    nodeOps: NodeOps;
    patchData: (el: any, key: any, prevValue: any, nextValue: any) => void;
}
interface NodeOps {
    appendChild: (parent: any, child: any) => void;
    createText: (text: string) => any;
    removeChild: (parent: any, child: any) => void;
    querySelector: (selector: any) => any;
    createElement: (tag: any, isSVG: number | boolean) => any;
    parentNode: (node: any) => any;
    nextSibling: (node: any) => any;
    setText: (node: any, text: string) => void;
    insertBefore: (parent: any, child: any, ref: any) => void;
}
export {};

customer render

if U want to define your self render ,please clone the repo on github and change everything .

https://github.com/xiaomiwujiecao/maple-render