-
Notifications
You must be signed in to change notification settings - Fork 0
/
Component.js
128 lines (114 loc) · 2.73 KB
/
Component.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/**
* Created by army8735 on 2018/1/6.
*/
'use strict';
const migi = require('migi');
const Obj = migi.Obj;
const util = migi.util;
function arr2hash(arr) {
let hash = {};
for(let i = 0, len = arr.length; i < len; i++) {
let item = arr[i];
if(Array.isArray(item)) {
hash[item[0]] = item[1];
}
else {
for(let list = Object.keys(item), j = list.length - 1; j >= 0; j--) {
let k = list[j];
hash[k] = item[k];
}
}
}
return hash;
}
function hash2arr(hash) {
let arr = [];
for(let list = Object.keys(hash), i = 0, len = list.length; i < len; i++) {
let k = list[i];
arr.push([k, hash[k]]);
}
return arr;
}
function spread(arr) {
for(let i = 0, len = arr.length; i < len; i++) {
let item = arr[i];
if(!Array.isArray(item)) {
let temp = [];
for(let list = Object.keys(item), j = 0, len = list.length; j < len; j++) {
let k = list[j];
temp.push([k, item[k]]);
}
arr.splice(i, 1, ...temp);
}
}
return arr;
}
function Component(uid, props, children) {
if(Array.isArray(uid)) {
[uid, props, children] = [...uid];
}
props = props || [];
children = children || [];
let self = this;
// 构建工具中都是arr,手写可能出现hash情况
if(Array.isArray(props)) {
self.props = arr2hash(props);
self.__props = spread(props);
}
else {
self.props = props;
self.__props = hash2arr(props);
}
self.__uid = uid;
self.__children = children;
self.__bindHash = {};
self.__props.forEach(function(item, index) {
let k = item[0];
let v = item[1];
// 忽略onXXX和on-XXX
if(/^on[a-zA-Z]/.test(k)) {}
else if(/^on-[a-zA-Z\d_]/.test(k) && util.isFunction(v)) {}
else if(k === 'model') {}
else if(v instanceof Obj) {
self.__props[index] = v.v;
self.props[k] = v.v;
}
});
}
Component.prototype.render = function() {
return migi.createVd('div', this.__props, this.children, this.__uid);
};
Component.prototype.toString = function() {
return this.render();
};
Component.prototype.__initBind = function(name) {
return !this.__bindHash.hasOwnProperty(name);
};
Component.prototype.__getBind = function(name) {
return this.__bindHash[name];
};
Component.prototype.__setBind = function(name, v) {
this.__bindHash[name] = v;
};
Component.prototype.__data
= Component.prototype.on
= Component.prototype.once
= Component.prototype.off
= Component.prototype.emit
= function() {};
Object.defineProperties(Component.prototype, {
model: {
get: function() {
return this.__model;
},
set: function(v) {
this.__model = v;
},
},
children: {
get: function() {
return this.__children;
},
},
});
module.exports = Component;