22
33Object . defineProperty ( exports , '__esModule' , { value : true } ) ;
44
5+ function isStructObject ( value ) {
6+ return Object . prototype . toString . call ( value ) === "[object Object]" ;
7+ }
8+ function isArray ( value ) {
9+ return Object . prototype . toString . call ( value ) === "[object Array]" ;
10+ }
11+ function isString ( value ) {
12+ return Object . prototype . toString . call ( value ) === "[object String]" ;
13+ }
14+
515function createVNode ( type , props , children ) {
616 const vnode = {
717 type,
818 props,
919 children,
20+ shapeFlag : getShapeFlag ( type ) ,
1021 el : null ,
1122 } ;
23+ childrenShapeFlag ( vnode ) ;
1224 return vnode ;
1325}
14-
15- function isStructObject ( value ) {
16- return Object . prototype . toString . call ( value ) === "[object Object]" ;
17- }
18- function isArray ( value ) {
19- return Object . prototype . toString . call ( value ) === "[object Array]" ;
26+ function getShapeFlag ( type ) {
27+ return isString ( type )
28+ ? 1 /* ShapeFlags.ELEMENT */
29+ : 2 /* ShapeFlags.STATEFUL_COMPONENT */ ;
2030}
21- function isString ( value ) {
22- return Object . prototype . toString . call ( value ) === "[object String]" ;
31+ function childrenShapeFlag ( vNode ) {
32+ if ( isString ( vNode . children ) ) {
33+ vNode . shapeFlag |= 4 /* ShapeFlags.TEXT_CHILDREN */ ;
34+ }
35+ if ( isArray ( vNode . children ) ) {
36+ vNode . shapeFlag |= 8 /* ShapeFlags.ARRAY_CHILDREN */ ;
37+ }
2338}
2439
2540const PublicPropertiesMaps = {
@@ -79,11 +94,10 @@ function render(vnode, container) {
7994 patch ( vnode , container ) ;
8095}
8196function patch ( vnode , container ) {
82- // TODO(branlice): 判断是element 还是component
83- if ( typeof vnode . type === "string" ) {
97+ if ( vnode . shapeFlag & 1 /* ShapeFlags.ELEMENT */ ) {
8498 processElement ( vnode , container ) ;
8599 }
86- if ( isStructObject ( vnode . type ) ) {
100+ if ( vnode . shapeFlag & 2 /* ShapeFlags.STATEFUL_COMPONENT */ ) {
87101 processComponent ( vnode , container ) ;
88102 }
89103}
@@ -103,10 +117,10 @@ function mountElement(vnode, container) {
103117 // vnode.el -> element.el
104118 const el = ( vnode . el = document . createElement ( vnode . type ) ) ;
105119 // children
106- if ( isString ( vnode . children ) ) {
120+ if ( vnode . shapeFlag & 4 /* ShapeFlags.TEXT_CHILDREN */ ) {
107121 el . textContent = vnode . children ;
108122 }
109- else if ( isArray ( vnode . children ) ) {
123+ else if ( vnode . shapeFlag & 8 /* ShapeFlags.ARRAY_CHILDREN */ ) {
110124 mountChildren ( vnode . children , el ) ;
111125 }
112126 // props
0 commit comments