agile-core 3.0.8 → 3.0.9
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/README.md +355 -355
- package/assets/aui-colored.svg +55 -55
- package/assets/aui.svg +35 -35
- package/dist/core.cjs.js +1 -1
- package/dist/core.cjs.js.map +1 -1
- package/dist/core.d.ts +23 -4
- package/dist/core.d.ts.map +1 -1
- package/dist/core.es.js +136 -107
- package/dist/core.es.js.map +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.es.js +2 -1
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.es.js.map +1 -1
- package/package.json +84 -84
- package/types/aui-global.d.ts +79 -79
- package/types/aui-vue-global.d.ts +35 -35
package/README.md
CHANGED
|
@@ -1,355 +1,355 @@
|
|
|
1
|
-
# Agile框架使用指南
|
|
2
|
-
|
|
3
|
-
<div align="center">
|
|
4
|
-
<img src="https://gitee.com/nandy007/agile-core/raw/main/assets/aui.svg" alt="Agile框架" style="width: 120px;border-radius:26px;background-color: #fff;box-shadow: 2px 2px 4px rgba(0,0,0,0.2);"/>
|
|
5
|
-
</div>
|
|
6
|
-
|
|
7
|
-
## 概述
|
|
8
|
-
|
|
9
|
-
`Agile`框架结合`Vite`和`VUE`的技术栈+自定义组件模块(基于`Web Component`),形成一个组件式的`微前端`框架。该框架旨在实现跨框架调用的`微前端组件`定义和使用。
|
|
10
|
-
|
|
11
|
-
使用`Agile`框架创建的组件称为`AUI`组件,该组件可以在框架内使用,也可以打包后在任意框架中通过引入js的方式使用,包括任何标准的DOM操作方式调用和样式设置。
|
|
12
|
-
|
|
13
|
-
## 特性
|
|
14
|
-
|
|
15
|
-
### 🚀 跨框架兼容
|
|
16
|
-
- **原生DOM组件**:基于Web Components标准,编译后的组件是原生HTMLElement扩展
|
|
17
|
-
- **多框架支持**:可在Vue、React、Angular等任意框架中使用
|
|
18
|
-
- **标准DOM操作**:支持`document.createElement`、`innerHTML`等标准DOM操作方式
|
|
19
|
-
- **双模式调用**:框架内可使用Vue组件语法和原生DOM方式,框架外使用原生DOM方式
|
|
20
|
-
|
|
21
|
-
### 💡 继承VITE+VUE开发体验
|
|
22
|
-
- **Vue语法兼容**:`.aui.vue`文件格式,保持Vue开发习惯
|
|
23
|
-
- **TypeScript支持**:完整的类型定义和智能提示
|
|
24
|
-
- **热更新支持**:基于Vite的现代化开发工具链
|
|
25
|
-
- **性能优化**:基于Vue3的性能优化
|
|
26
|
-
|
|
27
|
-
### 🔧 企业级场景设计
|
|
28
|
-
- **全粒度开发**:可以用于组件库、模块、插件、应用等任何粒度开发
|
|
29
|
-
- **Hook扩展机制**:为不同客户通过定制化组件实现差异功能
|
|
30
|
-
- **技术栈异构**:主应用和子应用使用不同前端框架
|
|
31
|
-
- **独立部署**:组件库独立发布,各应用按需引入
|
|
32
|
-
- **渐进式集成**:现有微前端项目可逐步引入AUI组件
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
## 规范
|
|
36
|
-
|
|
37
|
-
1. AUI组件必须以`.aui.vue`作为文件后缀
|
|
38
|
-
2. 组件名是唯一的,同一个组件名对应的实现只有一个,组件可以重复定义,但是后面定义的会覆盖前面的,其中有个名为`auix`的prop属性用于扩展属性
|
|
39
|
-
3. 组件名称必须是帕斯卡命名法(Pascal Case),即每个单词的首字母都是大写,单词之间没有分隔符
|
|
40
|
-
4. 组件名一般显式的在组件中通过name来定义,否则将取当前文件名的名称作为组件名
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
## 接口
|
|
44
|
-
|
|
45
|
-
### 1. AUI初始化事件
|
|
46
|
-
|
|
47
|
-
当组件`mounted`结束会执行两个动作:
|
|
48
|
-
1. 触发`aui-init`事件,事件的detail为`{code: 0}`。(该事件作用在原生DOM上,所以框架内和外都可以监听)
|
|
49
|
-
2. 执行组件内部的`auiInit`函数(如果存在),该函数与mounted同级。
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
### 2. 通用组件间函数调用
|
|
53
|
-
|
|
54
|
-
函数定义:<code>async $call(name: string, ...args: any[]) : any</code>
|
|
55
|
-
该函数是通用的组件间函数调用的定义,AUI原生DOM调用VUE组件函数或者VUE组件调用AUI原生DOM的函数都是使用这个方法。
|
|
56
|
-
|
|
57
|
-
其中,`name`可以是组件里`暴露`的`函数名`或者`属性名`(支持多级属性访问),前提是这些函数或属性要暴露,当为函数时为执行函数并返回结果;当为属性时,如果没有args则返回属性值,如果有args,将取args的第一个元素赋值给属性,返回null;当匹配不到任何函数和属性将返回一个Error对象。
|
|
58
|
-
|
|
59
|
-
1. 原生DOM调用VUE组件,则组件内使用`this.$call`调用,框架外使用`el.$call`。
|
|
60
|
-
|
|
61
|
-
```js
|
|
62
|
-
// $call是原生DOM上的扩展函数,用于组件外部调用内部的函数或者取值/赋值之用
|
|
63
|
-
const el = document.querySelector('aui-my-com');
|
|
64
|
-
const value = await el.$call('echo', 111); // value 为111
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
2. VUE组件调用原生DOM,则组件内使用`this.$call`调用
|
|
68
|
-
|
|
69
|
-
```js
|
|
70
|
-
// $call也是VUE组件的扩展函数,用于组件内调用原生DOM的函数或者取值/赋值之用
|
|
71
|
-
export default {
|
|
72
|
-
...
|
|
73
|
-
methods: {
|
|
74
|
-
setDomStyle() {
|
|
75
|
-
this.$call('setAttribute', 'style', 'color: red;');
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
...
|
|
79
|
-
}
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
### 3. MVVM使用
|
|
84
|
-
|
|
85
|
-
由于AUI组件本身是`原生DOM`,所以都是通过value值作为MVVM绑定的依据(注意区分通过setAttribute设置的value属性,非同一个意思)。
|
|
86
|
-
|
|
87
|
-
VUE组件扩展了两个重要的方法:`$value`和`$anyToArray`。
|
|
88
|
-
`$value`: 该方法用于获取或设置组件的原生DOM的value值,主要用于MVVM绑定值传递给原生DOM。
|
|
89
|
-
`$anyToArray`: 该方法用于将任意类型的值转换为数组类型,主要用于处理多选场景。
|
|
90
|
-
|
|
91
|
-
使用方式如下:
|
|
92
|
-
|
|
93
|
-
```html
|
|
94
|
-
<aui-tradition-comp v-model="msg" />
|
|
95
|
-
<!-- 使用Vue方式引用时,注意要加v-model:value,而使用标签名时只需要写v-model -->
|
|
96
|
-
<TraditionComp v-model:value="msg" />
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
在组件内部需要绑定一个额外的变量做内部的MVVM,并同时监听value值和该变量的变化,如下:
|
|
100
|
-
|
|
101
|
-
```js
|
|
102
|
-
{
|
|
103
|
-
...
|
|
104
|
-
data() {
|
|
105
|
-
return {
|
|
106
|
-
localValue: ''
|
|
107
|
-
}
|
|
108
|
-
},
|
|
109
|
-
watch: {
|
|
110
|
-
value(v) {
|
|
111
|
-
// 当原生DOM的value值变化,同时更新内部变量
|
|
112
|
-
this.localValue = v;
|
|
113
|
-
},
|
|
114
|
-
localValue(v) {
|
|
115
|
-
// 当内部变量变化,同时设置原生DOM的value值
|
|
116
|
-
this.$value(v);
|
|
117
|
-
},
|
|
118
|
-
}
|
|
119
|
-
...
|
|
120
|
-
}
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
注意:
|
|
124
|
-
1. 如果绑定的是多选类型,比如checkbox或者multiple类型的select以及一些自定义的组件,则内部变量的值必须是数组,而其他的则为字符串
|
|
125
|
-
2. value值默认是String类型,所以通过el.value获取到的值都是string类型,并且在设置value时也会被转为字符串,在多选场景下,如果希望直接获取到数组,可以在组件里为value添加prop,并设置type为Array即可
|
|
126
|
-
3. 如果多选场景没有单独设置value的type为Array,则需要自行在watch监听value变化的时候将字符串转为数组。VUE的`methods`上已经扩展里`$anyToArray`函数来转数组,比如:
|
|
127
|
-
|
|
128
|
-
```js
|
|
129
|
-
|
|
130
|
-
{
|
|
131
|
-
...
|
|
132
|
-
watch: {
|
|
133
|
-
value(v) {
|
|
134
|
-
this.localArray = this.$anyToArray(v);
|
|
135
|
-
},
|
|
136
|
-
localArray(v) {
|
|
137
|
-
this.$value(v);
|
|
138
|
-
}
|
|
139
|
-
},
|
|
140
|
-
...
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
### 4. slot插槽使用
|
|
146
|
-
|
|
147
|
-
由于AUI组件是原生DOM,所以使用上跟VUE本身的插槽使用方式有所不同。类似于DIV等标签,理论上所有子节点都是默认插槽的内容,而没有具名插槽,为了扩展具名插槽,AUI组件内部使用了`aui-slot`元素来实现具名插槽。
|
|
148
|
-
|
|
149
|
-
使用规范:
|
|
150
|
-
1. `aui-slot`仅在通过原生DOM方式时使用,通过标准VUE组件则仍使用`template`。
|
|
151
|
-
2. `aui-slot`元素使用for属性指定需要插入的插槽名称。
|
|
152
|
-
3. `aui-slot`不支持VUE插槽的高级用法。
|
|
153
|
-
|
|
154
|
-
比如:
|
|
155
|
-
|
|
156
|
-
```html
|
|
157
|
-
<!-- 使用原生DOM方式调用需要使用aui-slot包装 -->
|
|
158
|
-
<aui-my-comp>
|
|
159
|
-
<aui-slot for="header">
|
|
160
|
-
<div>这是header</div>
|
|
161
|
-
</aui-slot>
|
|
162
|
-
</aui-my-comp>
|
|
163
|
-
|
|
164
|
-
<!-- 使用VUE标准方式调用需要包使用template -->
|
|
165
|
-
<MyComp>
|
|
166
|
-
<template #header>
|
|
167
|
-
<div>这是header</div>
|
|
168
|
-
</template>
|
|
169
|
-
</MyComp>
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
### 5. 其他
|
|
173
|
-
|
|
174
|
-
在框架内部调用组件,可以直接使用标签名(`aui-comp-name`)方式调用,也可以使用Vue风格的组件调用方式,如果是在框架外调用则只能通过标准的DOM操作方式调用,比如:
|
|
175
|
-
|
|
176
|
-
```html
|
|
177
|
-
<!-- 该方式可以在框架内和框架外调用 -->
|
|
178
|
-
<aui-my-comp @aui-init="onInit" :my-msg="msg||'这是第一个AUI组件'"/>
|
|
179
|
-
<!-- 该方式只能在框架在调用 -->
|
|
180
|
-
<MyComp @aui-init="onInit" :my-msg="msg||'这是通过VUE组件方式引入的AUI组件'"/>
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
```js
|
|
184
|
-
// 通过标准创建原生DOM方式在框架内和框架外都可使用
|
|
185
|
-
const el = document.createElement('aui-my-comp');
|
|
186
|
-
document.body.append(el);
|
|
187
|
-
// 通过标准插入代码片段方式在框架内和框架外都可使用
|
|
188
|
-
document.body.innerHTML = '<aui-my-comp />'
|
|
189
|
-
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
## 使用
|
|
196
|
-
|
|
197
|
-
Agile3.0框架目前只支持在`Vite`项目中开发,但是编译后可以在任何框架中使用。
|
|
198
|
-
|
|
199
|
-
版本要求:
|
|
200
|
-
1. node22+
|
|
201
|
-
2. vite7+
|
|
202
|
-
3. vue3+
|
|
203
|
-
|
|
204
|
-
[->直达示例](https://gitee.com/nandy007/agile-vite-vue)
|
|
205
|
-
|
|
206
|
-
### 第一步:安装模块
|
|
207
|
-
|
|
208
|
-
```bash
|
|
209
|
-
npm install agile-core
|
|
210
|
-
```
|
|
211
|
-
安装完成会在当前工程的`types`目录生成必要的代码模块定义,如果没有生成,可以到已安装的模块的`types`目录下把所有`d.ts`文件拷贝到项目的types目录,并且设置项目自身的tsconfig.json文件,添加`types`目录到`include`节点下
|
|
212
|
-
|
|
213
|
-
### 第二步:在Vite.config.ts配置中添加aui插件
|
|
214
|
-
|
|
215
|
-
```js
|
|
216
|
-
import { defineConfig } from 'vite'
|
|
217
|
-
import vue from '@vitejs/plugin-vue'
|
|
218
|
-
import { getAuiConfig } from 'agile-core'
|
|
219
|
-
import { mergeConfig } from 'vite'
|
|
220
|
-
|
|
221
|
-
// 引入aui插件
|
|
222
|
-
const { userConfig, isCustomElement } = getAuiConfig();
|
|
223
|
-
|
|
224
|
-
const baseConfig = {
|
|
225
|
-
plugins: [vue({
|
|
226
|
-
template: {
|
|
227
|
-
compilerOptions: {
|
|
228
|
-
// 设置以aui开头的原生DOM为自定义元素
|
|
229
|
-
isCustomElement
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
})],
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
// https://vite.dev/config/
|
|
236
|
-
export default defineConfig(async () => {
|
|
237
|
-
// 合并aui配置到vite配置中
|
|
238
|
-
return mergeConfig(baseConfig, userConfig)
|
|
239
|
-
})
|
|
240
|
-
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
### 第三步:在项目中使用.aui.vue文件
|
|
244
|
-
|
|
245
|
-
所有aui组件都需要以.aui.vue文件的格式进行定义,ExampleComp.aui.vue文件:
|
|
246
|
-
|
|
247
|
-
```html
|
|
248
|
-
<template>
|
|
249
|
-
<div>
|
|
250
|
-
<button>按钮</button>
|
|
251
|
-
</div>
|
|
252
|
-
</template>
|
|
253
|
-
|
|
254
|
-
<script setup lang="ts">
|
|
255
|
-
import { onMounted } from 'vue'
|
|
256
|
-
|
|
257
|
-
onMounted(() => {
|
|
258
|
-
console.log('aui组件渲染完毕');
|
|
259
|
-
});
|
|
260
|
-
|
|
261
|
-
defineOptions({
|
|
262
|
-
// 如果不想以文件名做组件名,可以显示指定name
|
|
263
|
-
name: 'ExampleComp',
|
|
264
|
-
})
|
|
265
|
-
</script>
|
|
266
|
-
|
|
267
|
-
<style>
|
|
268
|
-
aui-example-comp {
|
|
269
|
-
button {
|
|
270
|
-
background-color: red;
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
</style>
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
组件内容与`VUE`组件规范一致,但是需要遵循前面提到的`规范`。
|
|
278
|
-
|
|
279
|
-
注:如果是在框架内使用,在import一个`.aui.vue`文件时可能会报错,需要添加类型定义,即在合适的`d.ts`文件中添加:
|
|
280
|
-
|
|
281
|
-
```ts
|
|
282
|
-
// vite-env.d.ts文件内容
|
|
283
|
-
/// <reference types="vite/client" />
|
|
284
|
-
|
|
285
|
-
declare module '*.aui.vue' {
|
|
286
|
-
import { DefineComponent } from 'vue';
|
|
287
|
-
const component: DefineComponent<{}, {}, any>;
|
|
288
|
-
export default component;
|
|
289
|
-
}
|
|
290
|
-
```
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
## 插件
|
|
294
|
-
|
|
295
|
-
### 介绍
|
|
296
|
-
|
|
297
|
-
AUI组件可通过插件机制对原组件的定义进行修改,或者对组件重新进行定义。
|
|
298
|
-
|
|
299
|
-
需要注意的是,对组件更新只有在组件创建前有效,请注意时机。
|
|
300
|
-
|
|
301
|
-
```js
|
|
302
|
-
|
|
303
|
-
// 引入AUI核心
|
|
304
|
-
import { default as auiCore, type Component } from 'agile-core';
|
|
305
|
-
|
|
306
|
-
```
|
|
307
|
-
|
|
308
|
-
### 组件HOOK
|
|
309
|
-
|
|
310
|
-
组件hook即对组件内部的行为进行变更,主要通过函数`hookStructure(tagName: string, handle: HookHandler): void;`实现
|
|
311
|
-
|
|
312
|
-
其中:
|
|
313
|
-
`tagName`是组件的完整标签名,比如:aui-my-comp
|
|
314
|
-
`handle`是一个函数,用于对组件内部的行为进行变更,函数的参数为组件的定义,返回值为变更后的组件定义,也可以不返回。
|
|
315
|
-
|
|
316
|
-
比如:
|
|
317
|
-
```js
|
|
318
|
-
auiCore.hookStructure('aui-example-comp', function (structure: Component) {
|
|
319
|
-
const originMounted = structure.mounted;
|
|
320
|
-
|
|
321
|
-
structure.mounted = function () {
|
|
322
|
-
console.log('from hook aui-example-comp');
|
|
323
|
-
originMounted?.call(this);
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
console.log('hook aui-example-comp');
|
|
327
|
-
});
|
|
328
|
-
|
|
329
|
-
```
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
### 组件定义
|
|
333
|
-
|
|
334
|
-
组件定义即对AUI组件进行定义,主要通过函数`define(v: Component, force?: boolean): Component;`实现。
|
|
335
|
-
|
|
336
|
-
其中:
|
|
337
|
-
`v`为组件的定义
|
|
338
|
-
`force`为是否强制定义,默认值为false。仅在当组件已经被定义时生效,true则会覆盖定义,false则本次定义无效
|
|
339
|
-
|
|
340
|
-
比如:
|
|
341
|
-
```js
|
|
342
|
-
auiCore.define({
|
|
343
|
-
name: 'ExampleComp',
|
|
344
|
-
props: {
|
|
345
|
-
myMsg: {
|
|
346
|
-
type: String,
|
|
347
|
-
default: ''
|
|
348
|
-
}
|
|
349
|
-
},
|
|
350
|
-
render() {
|
|
351
|
-
return h('div', { class: 'container' }, ['这是强制定义的组件', h('div', this.myMsg)]);
|
|
352
|
-
}
|
|
353
|
-
}, true);
|
|
354
|
-
|
|
355
|
-
```
|
|
1
|
+
# Agile框架使用指南
|
|
2
|
+
|
|
3
|
+
<div align="center">
|
|
4
|
+
<img src="https://gitee.com/nandy007/agile-core/raw/main/assets/aui.svg" alt="Agile框架" style="width: 120px;border-radius:26px;background-color: #fff;box-shadow: 2px 2px 4px rgba(0,0,0,0.2);"/>
|
|
5
|
+
</div>
|
|
6
|
+
|
|
7
|
+
## 概述
|
|
8
|
+
|
|
9
|
+
`Agile`框架结合`Vite`和`VUE`的技术栈+自定义组件模块(基于`Web Component`),形成一个组件式的`微前端`框架。该框架旨在实现跨框架调用的`微前端组件`定义和使用。
|
|
10
|
+
|
|
11
|
+
使用`Agile`框架创建的组件称为`AUI`组件,该组件可以在框架内使用,也可以打包后在任意框架中通过引入js的方式使用,包括任何标准的DOM操作方式调用和样式设置。
|
|
12
|
+
|
|
13
|
+
## 特性
|
|
14
|
+
|
|
15
|
+
### 🚀 跨框架兼容
|
|
16
|
+
- **原生DOM组件**:基于Web Components标准,编译后的组件是原生HTMLElement扩展
|
|
17
|
+
- **多框架支持**:可在Vue、React、Angular等任意框架中使用
|
|
18
|
+
- **标准DOM操作**:支持`document.createElement`、`innerHTML`等标准DOM操作方式
|
|
19
|
+
- **双模式调用**:框架内可使用Vue组件语法和原生DOM方式,框架外使用原生DOM方式
|
|
20
|
+
|
|
21
|
+
### 💡 继承VITE+VUE开发体验
|
|
22
|
+
- **Vue语法兼容**:`.aui.vue`文件格式,保持Vue开发习惯
|
|
23
|
+
- **TypeScript支持**:完整的类型定义和智能提示
|
|
24
|
+
- **热更新支持**:基于Vite的现代化开发工具链
|
|
25
|
+
- **性能优化**:基于Vue3的性能优化
|
|
26
|
+
|
|
27
|
+
### 🔧 企业级场景设计
|
|
28
|
+
- **全粒度开发**:可以用于组件库、模块、插件、应用等任何粒度开发
|
|
29
|
+
- **Hook扩展机制**:为不同客户通过定制化组件实现差异功能
|
|
30
|
+
- **技术栈异构**:主应用和子应用使用不同前端框架
|
|
31
|
+
- **独立部署**:组件库独立发布,各应用按需引入
|
|
32
|
+
- **渐进式集成**:现有微前端项目可逐步引入AUI组件
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
## 规范
|
|
36
|
+
|
|
37
|
+
1. AUI组件必须以`.aui.vue`作为文件后缀
|
|
38
|
+
2. 组件名是唯一的,同一个组件名对应的实现只有一个,组件可以重复定义,但是后面定义的会覆盖前面的,其中有个名为`auix`的prop属性用于扩展属性
|
|
39
|
+
3. 组件名称必须是帕斯卡命名法(Pascal Case),即每个单词的首字母都是大写,单词之间没有分隔符
|
|
40
|
+
4. 组件名一般显式的在组件中通过name来定义,否则将取当前文件名的名称作为组件名
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
## 接口
|
|
44
|
+
|
|
45
|
+
### 1. AUI初始化事件
|
|
46
|
+
|
|
47
|
+
当组件`mounted`结束会执行两个动作:
|
|
48
|
+
1. 触发`aui-init`事件,事件的detail为`{code: 0}`。(该事件作用在原生DOM上,所以框架内和外都可以监听)
|
|
49
|
+
2. 执行组件内部的`auiInit`函数(如果存在),该函数与mounted同级。
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
### 2. 通用组件间函数调用
|
|
53
|
+
|
|
54
|
+
函数定义:<code>async $call(name: string, ...args: any[]) : any</code>
|
|
55
|
+
该函数是通用的组件间函数调用的定义,AUI原生DOM调用VUE组件函数或者VUE组件调用AUI原生DOM的函数都是使用这个方法。
|
|
56
|
+
|
|
57
|
+
其中,`name`可以是组件里`暴露`的`函数名`或者`属性名`(支持多级属性访问),前提是这些函数或属性要暴露,当为函数时为执行函数并返回结果;当为属性时,如果没有args则返回属性值,如果有args,将取args的第一个元素赋值给属性,返回null;当匹配不到任何函数和属性将返回一个Error对象。
|
|
58
|
+
|
|
59
|
+
1. 原生DOM调用VUE组件,则组件内使用`this.$call`调用,框架外使用`el.$call`。
|
|
60
|
+
|
|
61
|
+
```js
|
|
62
|
+
// $call是原生DOM上的扩展函数,用于组件外部调用内部的函数或者取值/赋值之用
|
|
63
|
+
const el = document.querySelector('aui-my-com');
|
|
64
|
+
const value = await el.$call('echo', 111); // value 为111
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
2. VUE组件调用原生DOM,则组件内使用`this.$call`调用
|
|
68
|
+
|
|
69
|
+
```js
|
|
70
|
+
// $call也是VUE组件的扩展函数,用于组件内调用原生DOM的函数或者取值/赋值之用
|
|
71
|
+
export default {
|
|
72
|
+
...
|
|
73
|
+
methods: {
|
|
74
|
+
setDomStyle() {
|
|
75
|
+
this.$call('setAttribute', 'style', 'color: red;');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
...
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
### 3. MVVM使用
|
|
84
|
+
|
|
85
|
+
由于AUI组件本身是`原生DOM`,所以都是通过value值作为MVVM绑定的依据(注意区分通过setAttribute设置的value属性,非同一个意思)。
|
|
86
|
+
|
|
87
|
+
VUE组件扩展了两个重要的方法:`$value`和`$anyToArray`。
|
|
88
|
+
`$value`: 该方法用于获取或设置组件的原生DOM的value值,主要用于MVVM绑定值传递给原生DOM。
|
|
89
|
+
`$anyToArray`: 该方法用于将任意类型的值转换为数组类型,主要用于处理多选场景。
|
|
90
|
+
|
|
91
|
+
使用方式如下:
|
|
92
|
+
|
|
93
|
+
```html
|
|
94
|
+
<aui-tradition-comp v-model="msg" />
|
|
95
|
+
<!-- 使用Vue方式引用时,注意要加v-model:value,而使用标签名时只需要写v-model -->
|
|
96
|
+
<TraditionComp v-model:value="msg" />
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
在组件内部需要绑定一个额外的变量做内部的MVVM,并同时监听value值和该变量的变化,如下:
|
|
100
|
+
|
|
101
|
+
```js
|
|
102
|
+
{
|
|
103
|
+
...
|
|
104
|
+
data() {
|
|
105
|
+
return {
|
|
106
|
+
localValue: ''
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
watch: {
|
|
110
|
+
value(v) {
|
|
111
|
+
// 当原生DOM的value值变化,同时更新内部变量
|
|
112
|
+
this.localValue = v;
|
|
113
|
+
},
|
|
114
|
+
localValue(v) {
|
|
115
|
+
// 当内部变量变化,同时设置原生DOM的value值
|
|
116
|
+
this.$value(v);
|
|
117
|
+
},
|
|
118
|
+
}
|
|
119
|
+
...
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
注意:
|
|
124
|
+
1. 如果绑定的是多选类型,比如checkbox或者multiple类型的select以及一些自定义的组件,则内部变量的值必须是数组,而其他的则为字符串
|
|
125
|
+
2. value值默认是String类型,所以通过el.value获取到的值都是string类型,并且在设置value时也会被转为字符串,在多选场景下,如果希望直接获取到数组,可以在组件里为value添加prop,并设置type为Array即可
|
|
126
|
+
3. 如果多选场景没有单独设置value的type为Array,则需要自行在watch监听value变化的时候将字符串转为数组。VUE的`methods`上已经扩展里`$anyToArray`函数来转数组,比如:
|
|
127
|
+
|
|
128
|
+
```js
|
|
129
|
+
|
|
130
|
+
{
|
|
131
|
+
...
|
|
132
|
+
watch: {
|
|
133
|
+
value(v) {
|
|
134
|
+
this.localArray = this.$anyToArray(v);
|
|
135
|
+
},
|
|
136
|
+
localArray(v) {
|
|
137
|
+
this.$value(v);
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
...
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### 4. slot插槽使用
|
|
146
|
+
|
|
147
|
+
由于AUI组件是原生DOM,所以使用上跟VUE本身的插槽使用方式有所不同。类似于DIV等标签,理论上所有子节点都是默认插槽的内容,而没有具名插槽,为了扩展具名插槽,AUI组件内部使用了`aui-slot`元素来实现具名插槽。
|
|
148
|
+
|
|
149
|
+
使用规范:
|
|
150
|
+
1. `aui-slot`仅在通过原生DOM方式时使用,通过标准VUE组件则仍使用`template`。
|
|
151
|
+
2. `aui-slot`元素使用for属性指定需要插入的插槽名称。
|
|
152
|
+
3. `aui-slot`不支持VUE插槽的高级用法。
|
|
153
|
+
|
|
154
|
+
比如:
|
|
155
|
+
|
|
156
|
+
```html
|
|
157
|
+
<!-- 使用原生DOM方式调用需要使用aui-slot包装 -->
|
|
158
|
+
<aui-my-comp>
|
|
159
|
+
<aui-slot for="header">
|
|
160
|
+
<div>这是header</div>
|
|
161
|
+
</aui-slot>
|
|
162
|
+
</aui-my-comp>
|
|
163
|
+
|
|
164
|
+
<!-- 使用VUE标准方式调用需要包使用template -->
|
|
165
|
+
<MyComp>
|
|
166
|
+
<template #header>
|
|
167
|
+
<div>这是header</div>
|
|
168
|
+
</template>
|
|
169
|
+
</MyComp>
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### 5. 其他
|
|
173
|
+
|
|
174
|
+
在框架内部调用组件,可以直接使用标签名(`aui-comp-name`)方式调用,也可以使用Vue风格的组件调用方式,如果是在框架外调用则只能通过标准的DOM操作方式调用,比如:
|
|
175
|
+
|
|
176
|
+
```html
|
|
177
|
+
<!-- 该方式可以在框架内和框架外调用 -->
|
|
178
|
+
<aui-my-comp @aui-init="onInit" :my-msg="msg||'这是第一个AUI组件'"/>
|
|
179
|
+
<!-- 该方式只能在框架在调用 -->
|
|
180
|
+
<MyComp @aui-init="onInit" :my-msg="msg||'这是通过VUE组件方式引入的AUI组件'"/>
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
```js
|
|
184
|
+
// 通过标准创建原生DOM方式在框架内和框架外都可使用
|
|
185
|
+
const el = document.createElement('aui-my-comp');
|
|
186
|
+
document.body.append(el);
|
|
187
|
+
// 通过标准插入代码片段方式在框架内和框架外都可使用
|
|
188
|
+
document.body.innerHTML = '<aui-my-comp />'
|
|
189
|
+
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
## 使用
|
|
196
|
+
|
|
197
|
+
Agile3.0框架目前只支持在`Vite`项目中开发,但是编译后可以在任何框架中使用。
|
|
198
|
+
|
|
199
|
+
版本要求:
|
|
200
|
+
1. node22+
|
|
201
|
+
2. vite7+
|
|
202
|
+
3. vue3+
|
|
203
|
+
|
|
204
|
+
[->直达示例](https://gitee.com/nandy007/agile-vite-vue)
|
|
205
|
+
|
|
206
|
+
### 第一步:安装模块
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
npm install agile-core
|
|
210
|
+
```
|
|
211
|
+
安装完成会在当前工程的`types`目录生成必要的代码模块定义,如果没有生成,可以到已安装的模块的`types`目录下把所有`d.ts`文件拷贝到项目的types目录,并且设置项目自身的tsconfig.json文件,添加`types`目录到`include`节点下
|
|
212
|
+
|
|
213
|
+
### 第二步:在Vite.config.ts配置中添加aui插件
|
|
214
|
+
|
|
215
|
+
```js
|
|
216
|
+
import { defineConfig } from 'vite'
|
|
217
|
+
import vue from '@vitejs/plugin-vue'
|
|
218
|
+
import { getAuiConfig } from 'agile-core'
|
|
219
|
+
import { mergeConfig } from 'vite'
|
|
220
|
+
|
|
221
|
+
// 引入aui插件
|
|
222
|
+
const { userConfig, isCustomElement } = getAuiConfig();
|
|
223
|
+
|
|
224
|
+
const baseConfig = {
|
|
225
|
+
plugins: [vue({
|
|
226
|
+
template: {
|
|
227
|
+
compilerOptions: {
|
|
228
|
+
// 设置以aui开头的原生DOM为自定义元素
|
|
229
|
+
isCustomElement
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
})],
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// https://vite.dev/config/
|
|
236
|
+
export default defineConfig(async () => {
|
|
237
|
+
// 合并aui配置到vite配置中
|
|
238
|
+
return mergeConfig(baseConfig, userConfig)
|
|
239
|
+
})
|
|
240
|
+
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### 第三步:在项目中使用.aui.vue文件
|
|
244
|
+
|
|
245
|
+
所有aui组件都需要以.aui.vue文件的格式进行定义,ExampleComp.aui.vue文件:
|
|
246
|
+
|
|
247
|
+
```html
|
|
248
|
+
<template>
|
|
249
|
+
<div>
|
|
250
|
+
<button>按钮</button>
|
|
251
|
+
</div>
|
|
252
|
+
</template>
|
|
253
|
+
|
|
254
|
+
<script setup lang="ts">
|
|
255
|
+
import { onMounted } from 'vue'
|
|
256
|
+
|
|
257
|
+
onMounted(() => {
|
|
258
|
+
console.log('aui组件渲染完毕');
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
defineOptions({
|
|
262
|
+
// 如果不想以文件名做组件名,可以显示指定name
|
|
263
|
+
name: 'ExampleComp',
|
|
264
|
+
})
|
|
265
|
+
</script>
|
|
266
|
+
|
|
267
|
+
<style>
|
|
268
|
+
aui-example-comp {
|
|
269
|
+
button {
|
|
270
|
+
background-color: red;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
</style>
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
组件内容与`VUE`组件规范一致,但是需要遵循前面提到的`规范`。
|
|
278
|
+
|
|
279
|
+
注:如果是在框架内使用,在import一个`.aui.vue`文件时可能会报错,需要添加类型定义,即在合适的`d.ts`文件中添加:
|
|
280
|
+
|
|
281
|
+
```ts
|
|
282
|
+
// vite-env.d.ts文件内容
|
|
283
|
+
/// <reference types="vite/client" />
|
|
284
|
+
|
|
285
|
+
declare module '*.aui.vue' {
|
|
286
|
+
import { DefineComponent } from 'vue';
|
|
287
|
+
const component: DefineComponent<{}, {}, any>;
|
|
288
|
+
export default component;
|
|
289
|
+
}
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
## 插件
|
|
294
|
+
|
|
295
|
+
### 介绍
|
|
296
|
+
|
|
297
|
+
AUI组件可通过插件机制对原组件的定义进行修改,或者对组件重新进行定义。
|
|
298
|
+
|
|
299
|
+
需要注意的是,对组件更新只有在组件创建前有效,请注意时机。
|
|
300
|
+
|
|
301
|
+
```js
|
|
302
|
+
|
|
303
|
+
// 引入AUI核心
|
|
304
|
+
import { default as auiCore, type Component } from 'agile-core';
|
|
305
|
+
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### 组件HOOK
|
|
309
|
+
|
|
310
|
+
组件hook即对组件内部的行为进行变更,主要通过函数`hookStructure(tagName: string, handle: HookHandler): void;`实现
|
|
311
|
+
|
|
312
|
+
其中:
|
|
313
|
+
`tagName`是组件的完整标签名,比如:aui-my-comp
|
|
314
|
+
`handle`是一个函数,用于对组件内部的行为进行变更,函数的参数为组件的定义,返回值为变更后的组件定义,也可以不返回。
|
|
315
|
+
|
|
316
|
+
比如:
|
|
317
|
+
```js
|
|
318
|
+
auiCore.hookStructure('aui-example-comp', function (structure: Component) {
|
|
319
|
+
const originMounted = structure.mounted;
|
|
320
|
+
|
|
321
|
+
structure.mounted = function () {
|
|
322
|
+
console.log('from hook aui-example-comp');
|
|
323
|
+
originMounted?.call(this);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
console.log('hook aui-example-comp');
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
### 组件定义
|
|
333
|
+
|
|
334
|
+
组件定义即对AUI组件进行定义,主要通过函数`define(v: Component, force?: boolean): Component;`实现。
|
|
335
|
+
|
|
336
|
+
其中:
|
|
337
|
+
`v`为组件的定义
|
|
338
|
+
`force`为是否强制定义,默认值为false。仅在当组件已经被定义时生效,true则会覆盖定义,false则本次定义无效
|
|
339
|
+
|
|
340
|
+
比如:
|
|
341
|
+
```js
|
|
342
|
+
auiCore.define({
|
|
343
|
+
name: 'ExampleComp',
|
|
344
|
+
props: {
|
|
345
|
+
myMsg: {
|
|
346
|
+
type: String,
|
|
347
|
+
default: ''
|
|
348
|
+
}
|
|
349
|
+
},
|
|
350
|
+
render() {
|
|
351
|
+
return h('div', { class: 'container' }, ['这是强制定义的组件', h('div', this.myMsg)]);
|
|
352
|
+
}
|
|
353
|
+
}, true);
|
|
354
|
+
|
|
355
|
+
```
|