compelem 0.20.0-b2 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CompElem.d.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  import { IComponent } from "./IComponent";
2
- import { CssTemplate } from "./render/CssTemplate";
3
2
  import { Template } from "./render/Template";
4
3
  import { DefaultProps, TmplFn, UpdatePoint } from "./types";
5
4
  /**
@@ -12,25 +11,18 @@ export declare class CompElem<T = HTMLElement> extends HTMLElement implements IC
12
11
  #private;
13
12
  static __l_globalRule: HTMLStyleElement;
14
13
  static defaults(options: DefaultProps): void;
14
+ __data_: Record<string, any>;
15
15
  __updateTree: Array<UpdatePoint>;
16
- __cssSheets: Array<CSSStyleSheet>;
17
- _eventList: Array<[string, Function, Node, Function?]>;
16
+ _eventBindList: Array<[string, Function, Node, Function?]>;
17
+ _listerners: Record<string, Function>;
18
18
  __docoEventMap: Map<string, Function>;
19
- __updateCssDeps: Array<string>;
20
19
  __updateSubViewDeps: Map<string, Set<UpdatePoint>>;
21
- __updateViewDeps: string[];
22
- _watchUpdateMap: Record<string, Set<Function>>;
23
- _watchDeepUpdateMap: Record<string, Set<Function>>;
24
- _watchKeys: string[];
25
- _watchKeysOnceMap: Map<string, boolean>;
26
- _watchKeysDeep: string[];
20
+ _cssUpdateInNextTick: boolean;
21
+ _cssVarOldValueMap: Record<string, string | number>;
22
+ __cssSheets: Array<CSSStyleSheet>;
27
23
  _watchUpdateSetInNextTick: Set<Function>;
28
24
  _watchUpdateArgsInNextTick: Map<Function, Record<string, any>>;
29
- _computedUpdateDeps: Map<string, Set<Function>>;
30
25
  _computedUpdateSetInNextTick: Set<Function>;
31
- _hasChangedPropOrStateMap: Map<string, Function>;
32
- _hasSyncPropSet: Set<string>;
33
- _hasShallowStateSet: Set<string>;
34
26
  get [Symbol.toStringTag](): string;
35
27
  get cid(): number;
36
28
  get attrs(): Record<string, string>;
@@ -39,18 +31,21 @@ export declare class CompElem<T = HTMLElement> extends HTMLElement implements IC
39
31
  get renderRoots(): HTMLElement[];
40
32
  get parentComponent(): CompElem | undefined;
41
33
  get wrapperComponent(): CompElem | undefined;
34
+ get slots(): Record<string, Array<Node>>;
42
35
  get slotHooks(): Record<string, (...args: any[]) => Template>;
43
- get styleSheets(): CSSStyleSheet[];
44
- get globalStyleSheet(): CSSStyleSheet;
36
+ get cssSheets(): CSSStyleSheet[];
37
+ get globalCssSheet(): CSSStyleSheet;
45
38
  get isMounted(): boolean;
46
- get slots(): Record<string, Array<Node>>;
39
+ __wrapperComponent: WeakRef<CompElem> | undefined;
47
40
  /**
48
41
  * 组件样式,CSSStyleSheet可动态变更
49
42
  */
50
- static get styles(): Array<string | CSSStyleSheet>;
51
- static get globalStyle(): string | undefined;
52
- static get hostStyle(): string | CSSStyleSheet | undefined;
53
- get styles(): Array<CssTemplate>;
43
+ static get css(): Array<string | CSSStyleSheet>;
44
+ static get globalCss(): string | undefined;
45
+ static get hostCss(): string | CSSStyleSheet | undefined;
46
+ get cssVars(): Record<string, string | number | undefined>;
47
+ __inited: boolean;
48
+ __thisRef: WeakRef<any>;
54
49
  constructor(...args: any[]);
55
50
  insertStyleSheet(sheet: string | CSSStyleSheet): CSSStyleSheet | null;
56
51
  /**
@@ -70,7 +65,6 @@ export declare class CompElem<T = HTMLElement> extends HTMLElement implements IC
70
65
  render(): Template | null;
71
66
  beforeMount(): void;
72
67
  mounted(): void;
73
- __onSlotChangeHook(e: Event): void;
74
68
  slotChange(slot: HTMLSlotElement, name: string): void;
75
69
  attributeChangedCallback(attributeName: string, oldValue: string | null, newValue: string | null): void;
76
70
  /**
@@ -94,8 +88,6 @@ export declare class CompElem<T = HTMLElement> extends HTMLElement implements IC
94
88
  * @returns
95
89
  */
96
90
  _notify(ov: any, chain: string[], subNewValue?: any, subOldValue?: any): void;
97
- _requestWatchUpdate(newValue: any, oldValue: any, fullPath: string, rootObjNew?: any, rootObjOld?: any): void;
98
- _requestComputedUpdate(fullPath: string): void;
99
91
  _updateProps(props: Record<string, any>): void;
100
92
  _wrapperProp: Record<string, string>;
101
93
  _initProps(props: Record<string, any>, attrs?: Record<string, any>): void;
@@ -107,35 +99,15 @@ export declare class CompElem<T = HTMLElement> extends HTMLElement implements IC
107
99
  _updateSlot(name: string, propName?: string, value?: any): void;
108
100
  _asyncDirectives: WeakMap<TmplFn, any>;
109
101
  renderAsync(cbk: TmplFn, ...args: any[]): void;
110
- __attrChanged(name: string, oldValue: string | null, newValue: string | null): void;
111
- _regWrapper(wrapperComponent: CompElem): void;
112
102
  _regSubViewDeps(props: string[], up: UpdatePoint): void;
113
103
  _getPrivateData(): Record<string, any>;
114
104
  /**
115
- * 抛出自定义事件
105
+ * 发出组件事件
116
106
  * @param evName 事件名称
117
107
  * @param args 自定义参数
118
108
  */
119
- emit(evName: string, arg?: Record<string, any>, options?: {
120
- event?: Event;
121
- bubbles?: boolean;
122
- composed?: boolean;
123
- }): void;
124
- /**
125
- * 在root上绑定事件
126
- * @param evName
127
- * @param hook
128
- * @returns 函数钩子,用于卸载
129
- */
130
- on(evName: string, hook: (e: Event) => void): any;
131
- /**
132
- * 从root上移除事件
133
- * @param evName
134
- * @param hook on函数返回的钩子,可选。为空时移除所有evName事件
135
- */
136
- off(evName: string, hook?: (e: Event) => void): void;
137
- addEvent(node: Node, evName: string, hook: (e: Event) => void): any;
138
- removeEvent(node: Node, evName: string, hook?: (e: Event) => void): void;
109
+ emit(evName: string, arg?: Record<string, any>, event?: Event): void;
110
+ _addEvent(evName: string, hook: (e: Event) => void): void;
139
111
  /**
140
112
  * 下一帧执行
141
113
  * @param cbk
package/IComponent.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- import { CssTemplate } from "./render/CssTemplate";
2
1
  import { Template } from "./render/Template";
3
2
  /**
4
3
  * 组件接口
@@ -16,10 +15,10 @@ export interface IComponent<T = HTMLElement> {
16
15
  get wrapperComponent(): HTMLElement | undefined;
17
16
  get slots(): Record<string, Array<Node>>;
18
17
  get slotHooks(): Record<string, (...args: any[]) => Template>;
19
- get styleSheets(): CSSStyleSheet[];
20
- get globalStyleSheet(): CSSStyleSheet;
18
+ get cssSheets(): CSSStyleSheet[];
19
+ get globalCssSheet(): CSSStyleSheet;
21
20
  get isMounted(): boolean;
22
- get styles(): Array<CssTemplate>;
21
+ get cssVars(): Record<string, string | number | undefined>;
23
22
  propsReady(props: Record<string, any>): void;
24
23
  render(): Template | null;
25
24
  beforeMount(): void;
@@ -37,21 +36,7 @@ export interface IComponent<T = HTMLElement> {
37
36
  * @param evName 事件名称
38
37
  * @param args 自定义参数
39
38
  */
40
- emit(evName: string, arg: Record<string, any>, options?: {
41
- event?: Event;
42
- bubbles?: boolean;
43
- composed?: boolean;
44
- }): void;
45
- /**
46
- * 在root上绑定事件
47
- * @param evName
48
- * @param hook
49
- */
50
- on(evName: string, hook: (e: Event) => void): void;
51
- /**
52
- * 下一帧执行
53
- * @param cbk
54
- */
39
+ emit(evName: string, arg: Record<string, any>, event?: Event): void;
55
40
  nextTick(cbk: () => void): void;
56
41
  /**
57
42
  * 强制更新一次视图
package/README.md CHANGED
@@ -37,21 +37,23 @@ export class PageTest extends CompElem {
37
37
 
38
38
  //////////////////////////////////// styles
39
39
  //静态样式
40
- static get styles(): Array<string | CSSStyleSheet> {
40
+ static get css(): Array<string | CSSStyleSheet> {
41
41
  return [`:host{
42
42
  font-size:16px;
43
- }...`];
43
+ }
44
+ h2,p,i,h3{
45
+ ...
46
+ background-image:var(--test-color);
47
+ filter:hue-rotate(var(--test-hue-rotate));
48
+ }
49
+ ...`];
44
50
  }
45
- //动态样式
46
- get styles() {
47
- return [
48
- css`h2,p,i,h3{
49
- background-image:${this.color};
50
- }`,
51
- css`h2,p,i,h3{
52
- filter:hue-rotate(${this.rotation}deg);
53
- }`,
54
- ]
51
+ //动态样式变量
52
+ get cssVars() {
53
+ return {
54
+ testColor: this.color,
55
+ testHueRotate: `${this.rotation}deg`
56
+ }
55
57
  }
56
58
 
57
59
  @query('i[name="text"]')
@@ -84,7 +86,7 @@ export class PageTest extends CompElem {
84
86
  <i>for building</i>
85
87
  <h3>Web Components</h3>
86
88
  <p>
87
- &lt;c-element&gt; <i name="text">...</i> &lt;/c-element&gt;
89
+ &lt;comp-element&gt; <i name="text">...</i> &lt;/comp-element&gt;
88
90
  </p>
89
91
  ${this.arg}
90
92
  </div>`
@@ -106,7 +108,7 @@ export class PageTest extends CompElem {
106
108
  render(): Template{
107
109
  return html`<div>Hello CompElem</div>`
108
110
  }
109
- //对于无需内部样式的组件(如容器类)可返回null,此时不会创建Shadow DOM
111
+ //对于无需内部样式的组件(如容器类)可返回null(或跳过定义该方法),此时不会创建Shadow DOM
110
112
  render(){
111
113
  return null
112
114
  }
@@ -139,7 +141,7 @@ export class PageTest extends CompElem {
139
141
  - ### 无视图
140
142
  对于无体组件无需定义渲染函数,常用于layout、grid等结构控制相关组件。无视图组件仅支持global及host样式,如
141
143
  ```ts
142
- static get hostStyle(): string {
144
+ static get hostCss(): string {
143
145
  return `
144
146
  l-main{
145
147
  display: block;
@@ -152,24 +154,25 @@ export class PageTest extends CompElem {
152
154
  同样,无视图组件的renderRoot/renderRoots/...等属性都为空
153
155
 
154
156
  - ### 样式
155
- 使用静态函数定义组件样式或全局样式(如弹框),对于包裹在上级组件内的动态样式(如:hover)时,可通过hostStyles进行指定
157
+ 使用静态函数定义组件样式或全局样式(如弹框),对于包裹在上级组件内的伪类样式(如:hover)时,可通过hostCss进行指定
156
158
  ```ts
157
- static get styles(): Array<string | CSSStyleSheet> {
159
+ static get css(): Array<string | CSSStyleSheet> {
158
160
  return [];
159
161
  }
160
- static get globalStyle(): string {
162
+ static get globalCss(): string {
161
163
  return '';
162
164
  }
163
- static get hostStyle(): string {
165
+ static get hostCss(): string {
164
166
  return '';
165
167
  }
166
168
  ```
167
- 对于需要动态控制 host 元素样式可以使用组件实例 getter
169
+ 对于需要响应组件状态变化并动态更新样式时可以通过css变量进行变更,该方法会自动追踪内部所有响应状态
168
170
  ```ts
169
- get styles(){
170
- return [css`:host{
171
- ${this.border?'border: 1px solid rgb(var(--l-color-border-secondary)); ':''}
172
- }`]
171
+ get cssVars() {
172
+ return {
173
+ testColor: this.color,
174
+ testHueRotate: `${this.rotation}deg`
175
+ }
173
176
  }
174
177
  ```
175
178
  - ### 属性
@@ -221,7 +224,7 @@ export class PageTest extends CompElem {
221
224
  }
222
225
  ```
223
226
 
224
- 对于同类属性共享处理逻辑的监视,可以批量处理
227
+ 对于同类属性共享处理逻辑的监视,可批量处理
225
228
 
226
229
  ```ts
227
230
  @watch(['height', 'minHeight', 'maxHeight'], { immediate: true })
@@ -231,7 +234,7 @@ export class PageTest extends CompElem {
231
234
  ```
232
235
 
233
236
  - ### 计算状态
234
- 计算状态会缓存 return 结果,只有当内部使用的任意属性/状态发生变化时才会重新计算
237
+ 计算状态会缓存 return 结果,只有当内部使用的响应属性/状态发生变化时才会重新计算
235
238
  使用`@computed`注解的 Getter,如
236
239
  ```ts
237
240
  @computed
@@ -246,7 +249,7 @@ export class PageTest extends CompElem {
246
249
  @query('l-icon')
247
250
  iconEl: HTMLElement
248
251
  //ref
249
- refNode: HTMLElement
252
+ refNode: RefObject
250
253
  ```
251
254
  ref可用于内部DOM被移出但仍需访问的场景,比如tooltip、toast、overlay等
252
255
  ```ts
@@ -263,18 +266,13 @@ export class PageTest extends CompElem {
263
266
  - `readonly` shadowRoot 阴影DOM,可能为空
264
267
  - `readonly` slots 插槽元素映射
265
268
  - `readonly` slotHooks 动态插槽钩子映射
266
- - `readonly` styleSheets 组件样式对象列表
267
- - `readonly` globalStyleSheet 通过静态getter创建的全局样式表对象,所有实例共享
269
+ - `readonly` cssSheets 组件样式对象列表
270
+ - `readonly` globalCssSheet 通过静态getter创建的全局样式表对象,所有实例共享
268
271
  - `readonly` attrs 组件特性
269
272
  - `readonly` props 组件属性
270
273
  - `readonly` isMounted 组件是否已挂载
271
274
  - `readonly` isDestroyed 组件是否已销毁
272
- - slotComponent 所在插槽组件
273
- - on(evName: string, hook: (e: Event) => void) 在root元素上绑定事件
274
- - off(evName: string, hook?: (e: Event) => void) 在root元素上卸载事件
275
- - addEvent(node: Node, evName: string, hook: (e: Event) => void) 在指定元素上绑定事件
276
- - removeEvent(node: Node, evName: string, hook?: (e: Event) => void) 在指定元素上卸载事件
277
- - emit(evName: string, arg: Record<string, any>, options?: {event?: Event;bubbles?: boolean;composed?: boolean;}) 抛出自定义事件
275
+ - emit(evName: string, arg: Record<string, any>, event?: Event) 抛出自定义事件
278
276
  - nextTick(cbk: () => void) 下一帧执行函数
279
277
  - forceUpdate() 强制更新一次视图
280
278
  - insertStyleSheet(sheet: string | CSSStyleSheet): CSSStyleSheet 向组件ShadowDOM插入样式表
@@ -434,16 +432,28 @@ return html` <l-tooltip>
434
432
  - @onced 定义一次性事件
435
433
  - @throttled 定义节流函数
436
434
 
437
- #### 继承
435
+ ### 继承
438
436
  部分指令可由子类继承不会覆盖,包括@state/@prop/@watch/@computed
439
437
 
440
438
  ## 事件
439
+ 在CompElem中有三类不同事件,分别返回原生事件对象及自定义对象
441
440
 
442
- 在CompElem中事件分为三类
441
+ 1. 原生事件 —— `<div @click="..."` 在原生元素上可以监听原生事件,监听器回调参数返回原生事件对象
442
+ 2. 扩展原生事件 —— `<div @resize="..."` 在原生元素/组件元素上都可以监听扩展原生事件,监听器回调参数返回自定义数据对象
443
+ 3. 组件事件 —— `<l-select @change="..."` 在组件元素上默认仅可监听组件事件,监听器回调参数返回自定义数据对象
443
444
 
444
- 1. 原生事件 —— `<div @click="..."`,监听器回调参数返回原生事件对象
445
- 2. 扩展原生事件 —— `<div @resize="..."`,监听器回调参数返回`CustomEvent`事件对象
446
- 3. 组件自定义事件 —— `<l-select @change="..."`,监听器回调参数返回`CustomEvent`事件对象
445
+ ### 组件原生事件
446
+ 如果想要在组件上监听原生事件如`click`等,需要使用`native`关键字
447
+ ```html
448
+ <l-select @click.native="${...}"></l-select>
449
+ ```
450
+ 此时click事件监听器参数返回原生事件对象
451
+
452
+ ### 跨框架事件监听
453
+ 如果组件要用于非 `CompElem` 框架时,需要为组件添加 `emit-native`属性,这样框架会将组件事件转为`CustomEvent`
454
+ ```html
455
+ <l-select @change="${...}" emit-native></l-select>
456
+ ```
447
457
 
448
458
  ### 事件修饰符
449
459
  通过`.`号可使用修饰符修饰事件如 `@scroll.throttle:100="${...}"`
@@ -465,4 +475,16 @@ return html` <l-tooltip>
465
475
  可直接用于DOM元素的扩展事件(非组件事件),支持列表如下
466
476
  - resize 元素尺寸变化时触发
467
477
  - outside 鼠标点击元素外部时触发,可通过修饰符限制鼠标点击类型`outside.[mousedown/up/click/dblclick]`,默认click
468
- - mutate 内容变化时触发。基于 Mutation Observer API
478
+ - mutate 内容变化时触发。基于 Mutation Observer API
479
+
480
+ ### 无视图组件事件
481
+ 当组件无内部视图或想要监听组件自身元素时,可使用`@event`装饰器
482
+ ```ts
483
+ class CustomButton{
484
+ ...
485
+ @event('click.native', (comp) => comp)
486
+ onClick() {
487
+ this.emit('click')
488
+ }
489
+ }
490
+ ```