Skip to content

Commit

Permalink
fix: isPagecheck
Browse files Browse the repository at this point in the history
  • Loading branch information
missannil committed Dec 25, 2023
1 parent af6b169 commit 03f6452
Show file tree
Hide file tree
Showing 34 changed files with 997 additions and 533 deletions.
41 changes: 22 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,38 +23,40 @@

### 简介

annil(安奈儿)是微信小程序原生开发插件。
annil(安奈儿)是微信小程序原生开发插件,相较于原生API,使用annil会大大提高开发效率和代码质量

### 特点

- **新的组件构建API**
- **组件构建API功能更强大**

新的组件构建API加入了[computed](./doc/fields/computed.md)[watch](./doc/fields/watch.md)[store](./doc/fields/store.md)(基于mobx的全局响应式数据)`等功能,使开发更便捷。

- **复杂组件解决方案**

新的组件构建方案(根组件 + 子组件(可选)),组件逻辑与wxml元素(标签)一一对应。解决书写复杂组件时代码逻辑耦合的问题。
新的组件构建方案(根组件 + 子组件(可选)),组件逻辑与wxml标签一一对应。解决书写复杂组件时不同组件代码耦合的问题。
- **专为typescript开发设计**

annil是专为TS开发而设计的,通过类型提示、约束、检测,提升开发效率,避免运行时错误的发生。使用js开发时可忽略开发文档中的ts部分。

- **组件类型概念**

在使用ts开发时,新的组件构建API返回的类型叫组件文档类型,好比传统组件(UI)库为每个组件书写的使用文档,在做为子组件构建新组件(页面)时,子组件API要求使用者输入组件类型,让使用者知道该定义哪些字段(类型提示)并确保字段值类型正确(类型约束和检测)。这样实现了一个页面中所有子组件之间的类型耦合,无论组件嵌套多少层,无论哪层组件数据类型发生改变,所有相关组件类型都会得到感知。当您修改、重构代码时,只要无类型报错(tsc --noEmit --watch)就不会有运行时报错的心智负担。
新的组件构建API(DefineComponent)返回的类型叫组件(文档)类型,好比传统组件(UI)库为每个组件书写的使用文档,在做为子组件构建新组件(页面)时,子组件API(SubComponent)要求使用者输入组件类型,在定义选项字段时,会得到类型提示、约束和检测。这样实现了一个页面中所有子组件之间的类型耦合,无论组件嵌套多少层,无论哪层组件数据类型发生改变,所有相关组件类型都会得到感知。当您增改、重构代码时,只要无类型报错(tsc --noEmit --watch)就不会有运行时报错的心智负担。

- **类型约束代码规范**
- **类型约束书写规范**

js开发时可以任意`setData`一个未声明变量或通过`this.triggerEvent('name',unknown)`触发组件自定义事件。这是js的特点,但易读性和易维护性差。(ts开发时)新API通过类型报错形式对[代码规范](./doc/standard.md)给了强制约束
annil通过类型来约束代码书写规范,例如在js开发时可以通过`this.setData({...})`新增一个未在data字段中定义的数据或修改properties中定义的数据,这显然是不对的。新API通过类型报错的形式约束[书写规范](./doc/designIdea.md),在特定情形下(例如测试)你可以通过 `//@ts-ignore``as any`关闭类型检测。

- **高兼容性**

annil提供的API都是原生API的语法糖,不具有强制性和侵入性,开发者可在整个项目中使用,也可只在某处使用
annil提供的API都是原生API的语法糖,不具有强制性和侵入性,可渐进性使用或重构代码

- **类型修补**

官方类型(miniprogram-api-typings)存在更新不及时等问题,annil提供了新的类型方便ts开发,同时会对官方类型库发起PR。
这些类型都采用ES模块化,不会污染全局类型。
官方类型(miniprogram-api-typings)存在更新不及时等问题,annil提供了新的类型方便开发,这些类型都采用ES模块化,不会污染全局类型。

- **适配任何第三方库**
- **适配第三方库类型**

通过插件提供的泛型[GenerateDoc](./src/types/GenerateDoc.ts)即可根据组件文档生成组件类型,插件也内置了原生和第三方组件库类型
第三方组件库一般都是以文档的形式对组件说明,插件提供了泛型[GenerateDoc](./src/types/GenerateDoc.ts),可根据组件文档快速书写组件类型,使第三方组件融入组件构建模型,后续插件会陆续添加原生(Wm)和常用第三方组件库(Vant)类型

### 安装

Expand All @@ -69,6 +71,7 @@ annil(安奈儿)是微信小程序原生开发插件。
- 可选

```bash
# 使用ts开发
npm typescript --save-dev
```

Expand Down Expand Up @@ -115,18 +118,18 @@ annil(安奈儿)是微信小程序原生开发插件。
### 使用文档
1. 组件构建API
- **组件构建API**
[DefineComponent](./doc/api/DefineComponent.md)
[DefineComponent](./doc/api/DefineComponent.md)
[RootComopnent](./doc/api/RootComopnent.md)
[RootComopnent](./doc/api/RootComopnent.md)
[SubComponent](./doc/api/SubComponent.md)
[SubComponent](./doc/api/SubComponent.md)
### 更新日志
- **navigateTo**
[CHANGELOG](./CHANGELOG.md)
[navigateTo](./doc/api/navigateTo.md)
### 协议
### 更新日志
[MIT](./LICENSE)
[CHANGELOG](./CHANGELOG.md)
20 changes: 10 additions & 10 deletions doc/api/DefineComponent.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
### DefineComponent 接口
### DefineComponent

DefineComponent 是组件构建API其中之一,搭配 [RootComponent](./RootComponent.md)[SubComponent](./SubComponent.md)使用
> DefineComponent 是组件构建函数之一,搭配 [RootComponent](./RootComponent.md)[SubComponent](./SubComponent.md)使用
示例 A (DefineComponent 建立页面时)

Expand All @@ -19,7 +19,7 @@ const rootComponent = RootComponent()({
});

DefineComponent({
path: "/pages/index/index",
path: "/pages/index/index", // 构建页面时为 `path` 字段 js可忽略
rootComponent,
subComponents: [SubComponentA, SubComponentB],
});
Expand All @@ -37,24 +37,24 @@ const SubComponentB = SubComponent()({
// ...
});
const rootComponent = RootComponent()({
// 无isPage字段 或 isPage:false
// 不写isPage字段 或 isPage:false
});

DefineComponent({
name: "demo",
name: "compA", // 构建组件时为 `name`字段 js可忽略
rootComponent,
subComponents: [SubComponentA, SubComponentB],
});
```

RootComponent有3个字段
**字段说明**

1. rootComponent字段即 RootComponent接口返回的对象([RootComponentDoc](../../src\api\RootComponent\RootComponentDoc.ts)类型)
1. rootComponent字段类型为([RootComponentDoc](../../src\api\RootComponent\RootComponentDoc.ts)),即RootComponent接口返回类型

2. subComponents字段为数组,item是SubComponent接口返回的对象([SubComponentDoc](../../src\api\SubComponent\SubComponentDoc.ts)类型)
2. subComponents字段类型为([SubComponentDoc](../../src\api\SubComponent\SubComponentDoc.ts)[ ]),即SubComponent接口返回的类型数组

3. path或name字段
3. path或name字段(js开发可忽略)

当rootComponent字段的isPage为true时(页面),字段为path,类型为`/${string}`
当rootComponent字段的isPage不存在或为false时(组件),字段为name,类型为非空字符串
ts开发时有类型提示(检测),js开发时有运行时检测。
ts开发时有类型提示(检测).
166 changes: 146 additions & 20 deletions doc/api/RootComponent.md
Original file line number Diff line number Diff line change
@@ -1,78 +1,204 @@
### RootComponent 接口
### RootComponent

DefineComponent 是组件构建API其中之一,搭配 [RootComponent](./RootComponent.md)[SubComponent](./SubComponent.md)使用,其选项继承大多原生Component接口选项(暂不支持 "definitionFilter","export"),新增和修改选项如下:
RootComponent 是组件构建函数之一,搭配 [DefineComponent](./DefineComponent.md)[SubComponent](./SubComponent.md)使用,支持所有原生[Component] API选项,并增加了新的功能选项,具体如下:

**新增**
> **特别注意:为了使用外部泛型,接口采用高阶函数,需要2次调用**
- isPage
示例:

是否可选: 页面时必需,组件时可选
```ts
RootComponent()({
properties: {
// ...
},
data: {
// ...
},
// ...
});
```

- **isPage**

是否可选: 页面时必需为true,组件时可选

类型:boolean

默认: false

解释: 表示创建的组件类型(true为页面,false为组件),影响pageLifetime字段类型和DefineComponent接口的字段(path/name)
说明: 表示创建的实例类型(true为页面,false为组件),影响pageLifetime字段类型和DefineComponent选项字段(path/name),有运行时检测。

[示例A和B](./DefineComponent.md)

- computed
- **properties**

是否可选: 可选

类型: boolean
类型:[PropertiesConstraint](../../src/api/RootComponent/Properties/PropertiesConstraint.ts)

默认: {}
默认: { }

说明: js开发时同原生Component的properties选项。ts开发时,字段类型不允许null,对象配置去除observer字段,可通过as [DetailedType](../../src/types/DetailedType.ts)定义任意类型,有字段检测和value类型检测。

示例:

[定义必需字段示例](../../src/api/RootComponent/Properties/test/normalRequired.test.ts)

[定义可选字段示例](../../src/api/RootComponent/Properties/test/normalOptional.test.ts)

[类型错误示例](../../src/api/RootComponent/Properties/test/error.test.ts)

解释: 定义实例的计算属性,函数体内可通过this.data获取实例数据,依赖实例的数据变化时会自动更新实例上定义字段的值。
- **computed**

是否可选: 可选

类型: [ComputedConstraint](../../src/api/RootComponent/Computed/ComputedConstraint.ts)

默认: { }

说明: 定义实例的计算属性,函数体内可通过this.datay引用其他实例数据(包括其他计算属性),依赖的实例数据变化时会自动更新。

[标准示例](../../src/api/RootComponent/Computed/test/normal.test.ts)

[类型错误示例](../../src/api/RootComponent/Computed/test/error.test.ts)

[测试用例](../../jest/computed/normal/normal.ts)

- store
- **store**

是否可选: 可选

类型: [StoreConstraint](../../src/api/RootComponent/Store/StoreConstraint.ts)

默认: {}

解释: 定义实例上的响应式数据字段(基于mobx),当store数据发生变化,实例数据跟随变化。
可通过实例方法disposer取消对store变化的监控(this.disposer.xxx())
说明: 定义引入的全局响应式数据字段(基于mobx),当store数据发生变化,实例数据随之变化。
可通过disposer取消对定义字段的监控(this.disposer.storeFields())

[标准示例](../../src/api/RootComponent/Store/test/normal.test.ts)

[类型错误示例](../../src/api/RootComponent/Store/test/error.test.ts)

[测试用例](../../jest/store/store.ts)

- events
- **events**

是否可选: 可选

类型: [EventsConstraint](../../src/api/RootComponent/Events/EventsConstraint.ts)

默认: {}

解释: 定义组件事件,参数e默认为基础事件类型,可(使用Detail,Dataset,Mark等泛型)自定义事件参数类型。
说明: 定义组件事件,参数e默认为基础事件类型,可(使用Detail,Dataset,Mark等泛型)自定义事件参数类型。当有子组件泛型传入时(ts),后冒泡/捕获/阻止事件提示字段

[标准示例](../../src/api/RootComponent/Events/test/normal.test.ts)

[类型错误示例](../../src/api/RootComponent/Events/test/error.test.ts)

[测试用例](../../jest/events/events.ts)

- customEvents
- **customEvents**

是否可选: 可选

类型: [CustomEventConstraint](../../src/api/RootComponent/CustomEvents/CustomEventConstraint.ts)

默认: {}

解释: 定义组件自定义事件,通过this直接触发
说明: 定义组件自定义事件,通过this直接触发。在构建页面(isPage:true)时,无此字段。

[标准示例](../../src/api/RootComponent/CustomEvents/test/normal.test.ts)

[类型错误示例](../../src/api/RootComponent/CustomEvents/test/error.test.ts)

[测试用例](../../jest/customEvents/customEvents.ts)

- watch
- **watch**

是否可选: 可选

类型: [WatchOption](../../src/api/RootComponent/Watch/WatchOption.ts)

默认: {}

解释: 功能同原生observers字段,与observers不同的是深度比较
说明: 功能同原生observers字段,与observers不同的是深度相等比较和参数有旧值

[监控properties](../../src/api/RootComponent/Watch/test/WatchProperties.test.ts)

[监控computed](../../src/api/RootComponent/Watch/test/WatchComputed.test.ts)

[监控data](../../src/api/RootComponent/Watch/test/WatchData.test.ts)

[监控注入的store](../../src/api/RootComponent/Watch/test/WtachInject.test.ts)

[类型错误示例](../../src/api/RootComponent/Watch/test/error.test.ts)

测试用例目录 `../../jest/watch`

- **pageLifetimes**

是否可选: 可选

类型: [PageLifetimesOption](../../src/api/RootComponent/PageLifetimes/PageLifetimesOption.ts)

默认: {}

说明: 构建组件(isPage不为true)时选项为[组件所在页面的生命周期](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/lifetimes.html#%E7%BB%84%E4%BB%B6%E6%89%80%E5%9C%A8%E9%A1%B5%E9%9D%A2%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F),并加入了load生命周期(要求最低基础库 3.0.0)。构建页面时字段为[写在methods中的页面生命周期](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/component.html)

[标准示例](../../src/api/RootComponent/PageLifetimes/test/normal.test.ts)

[错误示例](../../src/api/RootComponent/PageLifetimes/test/error.test.ts)

- **lifetimes**

同原生[Component] API 的lifetimes选项(新增beforeCreate生命周期)

[标准示例](../../src/api/RootComponent/Lifetimes/test/normal.test.ts)

[错误示例](../../src/api/RootComponent/Lifetimes/test/error.test.ts)

- **observers**

同原生[Component] API 的observers选项

[标准示例](../../src/api/RootComponent/Observers/test/normal.test.ts)

- **data**

同原生[Component] API 的data选项

[标准示例](../../src/api/RootComponent/Data/test/normal.test.ts)

[错误示例](../../src/api/RootComponent/Data/test/error.test.ts)

- **methods**

同原生[Component] API 的methods选项

[标准示例](../../src/api/RootComponent/Methods/test/mormal.test.ts)

[错误示例](../../src/api/RootComponent/Methods/test/error.test.ts)

- **export**

同原生[Component] API 的export选项 当包含`behaviors:['wx://component-export']` 时有效

- **externalClasses**

同原生[Component] API 的externalClasses选项。

- **options**

同原生[Component] API 的options选项。可通过[实例注入]()的方式避免每个组件重复定义相同类型。

- **relations**

同原生[Component] API 的relations选项。

- **behaviors**

同原生[Component] API 的behaviors选项。

> 源码路径`/src/api/RootComponent/`
[测试用例](../../jest/watch/watch.ts)
[Component]: https://developers.weixin.qq.com/miniprogram/dev/reference/api/Component.html
Loading

0 comments on commit 03f6452

Please sign in to comment.