@doubao-apps/create 0.0.28 → 0.0.29-rc.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/dist/template-empty/README.md +8 -6
- package/dist/template-empty/package.json +2 -2
- package/dist/template-empty/references/examples/common-patterns.md +4 -15
- package/dist/template-empty/references/examples/component-basics.md +34 -17
- package/dist/template-empty/references/guides/component-development.md +103 -69
- package/dist/template-empty/references/guides/performance-optimization.md +0 -2
- package/dist/template-empty/references/guides/troubleshooting.md +0 -4
- package/dist/template-empty/references/reference/framework-api-quick-ref.md +52 -39
- package/dist/template-empty/references/reference/open-api/01-/345/237/272/347/241/200-/350/264/246/345/217/267-/347/263/273/347/273/237.md +12 -2
- package/dist/template-empty/references/reference/open-api/10-/350/256/276/345/244/207-/350/256/276/345/244/207/346/226/271/345/220/221.md +34 -0
- package/dist/template-empty/references/reference/open-api/README.md +1 -1
- package/dist/template-empty/references/reference/open-api.md +91 -2
- package/dist/template-empty/references/rules/dos-and-donts.md +113 -36
- package/dist/template-starter/package.json +2 -2
- package/dist/template-starter/references/examples/common-patterns.md +4 -15
- package/dist/template-starter/references/examples/component-basics.md +34 -17
- package/dist/template-starter/references/guides/component-development.md +103 -69
- package/dist/template-starter/references/guides/performance-optimization.md +0 -2
- package/dist/template-starter/references/guides/troubleshooting.md +0 -4
- package/dist/template-starter/references/reference/framework-api-quick-ref.md +52 -39
- package/dist/template-starter/references/reference/open-api/01-/345/237/272/347/241/200-/350/264/246/345/217/267-/347/263/273/347/273/237.md +12 -2
- package/dist/template-starter/references/reference/open-api/10-/350/256/276/345/244/207-/350/256/276/345/244/207/346/226/271/345/220/221.md +34 -0
- package/dist/template-starter/references/reference/open-api/README.md +1 -1
- package/dist/template-starter/references/reference/open-api.md +91 -2
- package/dist/template-starter/references/rules/dos-and-donts.md +113 -36
- package/dist/template-starter/src/app.config.ts +3 -29
- package/package.json +1 -1
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
|
|
8
8
|
| API | 用途 | 示例 |
|
|
9
9
|
|-----|------|------|
|
|
10
|
-
| `definePage()` | 定义 Page 组件 | `definePage({
|
|
11
|
-
| `defineWidget()` | 定义 Widget 组件 | `defineWidget({
|
|
10
|
+
| `definePage()` | 定义 Page 组件 | `definePage({ render() {...} })` |
|
|
11
|
+
| `defineWidget()` | 定义 Widget 组件 | `defineWidget({ render() {...} })` |
|
|
12
12
|
| `defineApp()` | 定义 App 入口 | `defineApp({ onLaunch() {...} })` |
|
|
13
13
|
|
|
14
14
|
---
|
|
@@ -77,8 +77,8 @@ interface MyData {
|
|
|
77
77
|
title: string;
|
|
78
78
|
count: number;
|
|
79
79
|
}
|
|
80
|
-
const
|
|
81
|
-
console.log(
|
|
80
|
+
const viewData = getViewData<MyData>();
|
|
81
|
+
console.log(viewData.title, viewData.count);
|
|
82
82
|
```
|
|
83
83
|
|
|
84
84
|
**AIViewContext 类型**:
|
|
@@ -206,7 +206,7 @@ const phone = await getPhoneNumber();
|
|
|
206
206
|
|
|
207
207
|
> `close()` 已废弃,公开路由场景请优先使用 `navigateBack()`。
|
|
208
208
|
>
|
|
209
|
-
> 常规页面跳转场景下,`url` 直接使用目标页面的 `pageId
|
|
209
|
+
> 常规页面跳转场景下,`url` 直接使用目标页面的 `pageId`。显式配置时取 `src/app.config.ts` 中对应 page 的 `id`;不配置时取入口目录名,例如 `src/pages/detail/index.tsx` 默认为 `detail`。需要传参时可直接拼接 query string。
|
|
210
210
|
|
|
211
211
|
### showToast
|
|
212
212
|
|
|
@@ -461,36 +461,41 @@ const phone = await getPhoneNumber();
|
|
|
461
461
|
|
|
462
462
|
# 常用类型
|
|
463
463
|
|
|
464
|
-
|
|
465
|
-
// Page Input
|
|
466
|
-
interface PageInput {
|
|
467
|
-
[key: string]: any; // URL 参数
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
// src/app.config.ts 中的 metadata 配置
|
|
471
|
-
interface PageAIMeta {
|
|
472
|
-
id: string; // 页面唯一标识
|
|
473
|
-
title?: string; // 页面标题
|
|
474
|
-
description?: string; // 页面描述
|
|
475
|
-
}
|
|
476
|
-
|
|
477
|
-
interface WidgetAIMeta {
|
|
478
|
-
id: string; // 卡片唯一标识
|
|
479
|
-
name?: string; // 卡片名称
|
|
480
|
-
description?: string; // 卡片描述
|
|
481
|
-
boxType?: 'inbox' | 'full_box'; // 卡片类型
|
|
482
|
-
border?: boolean; // 是否显示边框
|
|
483
|
-
keywords?: string[]; // 搜索关键词
|
|
484
|
-
titleType?: 'none' | 'normal' | 'float';
|
|
485
|
-
}
|
|
464
|
+
`src/app.config.ts` 需要配置 `appId` 和 `name`。Page / Widget metadata 使用可选的 `pages`、`widgets` 数组声明:
|
|
486
465
|
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
466
|
+
```typescript
|
|
467
|
+
import { defineAppConfig } from '@doubao-apps/kit';
|
|
468
|
+
|
|
469
|
+
export default defineAppConfig({
|
|
470
|
+
appId: 'com.example.my-doubao-app',
|
|
471
|
+
name: '我的豆包应用',
|
|
472
|
+
pages: [
|
|
473
|
+
'pages/home/index',
|
|
474
|
+
{
|
|
475
|
+
entry: 'pages/account/demo/index',
|
|
476
|
+
id: 'account-demo',
|
|
477
|
+
title: '账号示例页',
|
|
478
|
+
description: '多级目录页面示例'
|
|
479
|
+
}
|
|
480
|
+
],
|
|
481
|
+
widgets: [
|
|
482
|
+
'widgets/user-card/index',
|
|
483
|
+
{
|
|
484
|
+
entry: 'widgets/order/detail/index',
|
|
485
|
+
id: 'order-detail',
|
|
486
|
+
name: '订单详情卡片',
|
|
487
|
+
description: '多级目录卡片示例',
|
|
488
|
+
boxType: 'inbox',
|
|
489
|
+
border: true,
|
|
490
|
+
keywords: ['order'],
|
|
491
|
+
titleType: 'normal'
|
|
492
|
+
}
|
|
493
|
+
]
|
|
494
|
+
});
|
|
492
495
|
```
|
|
493
496
|
|
|
497
|
+
字符串数组项只声明入口,不补 metadata;对象数组项用于同时声明入口和 metadata。
|
|
498
|
+
|
|
494
499
|
---
|
|
495
500
|
|
|
496
501
|
# 快速示例
|
|
@@ -498,17 +503,25 @@ interface WidgetViewData {
|
|
|
498
503
|
|
|
499
504
|
## 最小 App
|
|
500
505
|
|
|
506
|
+
### src/app.config.ts
|
|
507
|
+
|
|
508
|
+
```ts
|
|
509
|
+
import { defineAppConfig } from '@doubao-apps/kit';
|
|
510
|
+
|
|
511
|
+
export default defineAppConfig({
|
|
512
|
+
appId: 'com.doubao.react-lynx-template',
|
|
513
|
+
name: 'Doubao Apps SDK Template',
|
|
514
|
+
description: 'React Lynx 开发模板',
|
|
515
|
+
keywords: ['react', 'lynx', 'template', 'doubao']
|
|
516
|
+
});
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
### src/app.ts
|
|
520
|
+
|
|
501
521
|
```tsx
|
|
502
522
|
import { defineApp } from "@doubao-apps/framework";
|
|
503
523
|
|
|
504
|
-
// Define AI Metadata
|
|
505
524
|
export default defineApp({
|
|
506
|
-
aiMeta: {
|
|
507
|
-
package: "com.doubao.react-lynx-template",
|
|
508
|
-
name: "Doubao Apps SDK Template",
|
|
509
|
-
description: "React Lynx 开发模板",
|
|
510
|
-
keywords: ["react", "lynx", "template", "doubao"],
|
|
511
|
-
},
|
|
512
525
|
onLaunch() {
|
|
513
526
|
console.log("App launched");
|
|
514
527
|
},
|
|
@@ -482,7 +482,7 @@ showToast({
|
|
|
482
482
|
```ts
|
|
483
483
|
expiredWidget({
|
|
484
484
|
widgetInstanceId: 'instance_123',
|
|
485
|
-
|
|
485
|
+
url: '${pageId}?key=value'
|
|
486
486
|
});
|
|
487
487
|
```
|
|
488
488
|
|
|
@@ -1851,18 +1851,28 @@ mcp入参,如果expectedAction里预期要调用工具,需要在这里写明
|
|
|
1851
1851
|
|
|
1852
1852
|
点击失效卡要跳转的页面 detailText
|
|
1853
1853
|
|
|
1854
|
-
##### schema
|
|
1854
|
+
##### ~~schema?~~
|
|
1855
1855
|
|
|
1856
1856
|
> `optional` **schema**: `string`
|
|
1857
1857
|
|
|
1858
1858
|
点击失效卡要跳转的页面 schema,格式与 navigateTo 的 url 相同
|
|
1859
1859
|
|
|
1860
|
+
###### Deprecated
|
|
1861
|
+
|
|
1862
|
+
使用 url 字段替代 schema 字段,后续版本将移除 schema 字段,请尽快迁移到 url 字段
|
|
1863
|
+
|
|
1860
1864
|
##### title?
|
|
1861
1865
|
|
|
1862
1866
|
> `optional` **title**: `string`
|
|
1863
1867
|
|
|
1864
1868
|
点击失效卡要跳转的页面 title
|
|
1865
1869
|
|
|
1870
|
+
##### url?
|
|
1871
|
+
|
|
1872
|
+
> `optional` **url**: `string`
|
|
1873
|
+
|
|
1874
|
+
点击失效卡要跳转的页面 url 或 sslocal schema
|
|
1875
|
+
|
|
1866
1876
|
##### widgetInstanceId
|
|
1867
1877
|
|
|
1868
1878
|
> **widgetInstanceId**: `string`
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
| --- | --- |
|
|
11
11
|
| [startDeviceMotionListening](#startdevicemotionlistening) | 开始监听设备方向变化。<br><br>需配对调用 stopDeviceMotionListening。 |
|
|
12
12
|
| [stopDeviceMotionListening](#stopdevicemotionlistening) | 停止监听设备方向变化。 |
|
|
13
|
+
| [onDeviceMotionChange](#ondevicemotionchange) | 监听设备方向变化事件。<br><br>返回取消监听函数。 |
|
|
13
14
|
|
|
14
15
|
## API 详情
|
|
15
16
|
|
|
@@ -47,6 +48,39 @@
|
|
|
47
48
|
|
|
48
49
|
`Promise`\<`object`\>
|
|
49
50
|
|
|
51
|
+
<a id="ondevicemotionchange"></a>
|
|
52
|
+
### onDeviceMotionChange()
|
|
53
|
+
|
|
54
|
+
> **onDeviceMotionChange**(`handler`): () => `void`
|
|
55
|
+
|
|
56
|
+
监听设备方向变化事件。
|
|
57
|
+
|
|
58
|
+
#### Parameters
|
|
59
|
+
|
|
60
|
+
• **handler**
|
|
61
|
+
|
|
62
|
+
#### Returns
|
|
63
|
+
|
|
64
|
+
`Function`
|
|
65
|
+
|
|
66
|
+
返回取消当前监听函数的函数。
|
|
67
|
+
|
|
68
|
+
##### Returns
|
|
69
|
+
|
|
70
|
+
`void`
|
|
71
|
+
|
|
72
|
+
#### Example
|
|
73
|
+
|
|
74
|
+
```ts
|
|
75
|
+
import { onDeviceMotionChange } from '@doubao-apps/framework/api';
|
|
76
|
+
|
|
77
|
+
const off = onDeviceMotionChange(({ alpha, beta, gamma }) => {
|
|
78
|
+
console.log(alpha, beta, gamma);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
off();
|
|
82
|
+
```
|
|
83
|
+
|
|
50
84
|
## 相关类型
|
|
51
85
|
|
|
52
86
|
<a id="startdevicemotionlisteningparams"></a>
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
| 设备 / 加速度计 | 加速度计监听能力。 | 3 | [查看](./07-设备-加速度计.md) |
|
|
16
16
|
| 设备 / iBeacon | iBeacon 搜索和结果读取能力。 | 3 | [查看](./08-设备-ibeacon.md) |
|
|
17
17
|
| 设备 / 罗盘 | 罗盘监听能力。 | 3 | [查看](./09-设备-罗盘.md) |
|
|
18
|
-
| 设备 / 设备方向 | 设备方向监听能力。 |
|
|
18
|
+
| 设备 / 设备方向 | 设备方向监听能力。 | 3 | [查看](./10-设备-设备方向.md) |
|
|
19
19
|
| 设备 / 陀螺仪 | 陀螺仪监听能力。 | 3 | [查看](./11-设备-陀螺仪.md) |
|
|
20
20
|
| UI / 输入 | 键盘和输入框选区能力。 | 1 | [查看](./12-ui-输入.md) |
|
|
21
21
|
| 设备 / 网络 | 网络类型和本机局域网 IP。 | 3 | [查看](./13-设备-网络.md) |
|
|
@@ -450,7 +450,7 @@ closePage();
|
|
|
450
450
|
```ts
|
|
451
451
|
expiredWidget({
|
|
452
452
|
widgetInstanceId: 'instance_123',
|
|
453
|
-
|
|
453
|
+
url: '${pageId}?key=value'
|
|
454
454
|
});
|
|
455
455
|
```
|
|
456
456
|
|
|
@@ -1537,6 +1537,40 @@ off();
|
|
|
1537
1537
|
|
|
1538
1538
|
***
|
|
1539
1539
|
|
|
1540
|
+
### onDeviceMotionChange()
|
|
1541
|
+
|
|
1542
|
+
> **onDeviceMotionChange**(`handler`): () => `void`
|
|
1543
|
+
|
|
1544
|
+
监听设备方向变化事件。
|
|
1545
|
+
|
|
1546
|
+
#### Parameters
|
|
1547
|
+
|
|
1548
|
+
• **handler**
|
|
1549
|
+
|
|
1550
|
+
#### Returns
|
|
1551
|
+
|
|
1552
|
+
`Function`
|
|
1553
|
+
|
|
1554
|
+
返回取消当前监听函数的函数。
|
|
1555
|
+
|
|
1556
|
+
##### Returns
|
|
1557
|
+
|
|
1558
|
+
`void`
|
|
1559
|
+
|
|
1560
|
+
#### Example
|
|
1561
|
+
|
|
1562
|
+
```ts
|
|
1563
|
+
import { onDeviceMotionChange } from '@doubao-apps/framework/api';
|
|
1564
|
+
|
|
1565
|
+
const off = onDeviceMotionChange(({ alpha, beta, gamma }) => {
|
|
1566
|
+
console.log(alpha, beta, gamma);
|
|
1567
|
+
});
|
|
1568
|
+
|
|
1569
|
+
off();
|
|
1570
|
+
```
|
|
1571
|
+
|
|
1572
|
+
***
|
|
1573
|
+
|
|
1540
1574
|
### onGyroscopeChange()
|
|
1541
1575
|
|
|
1542
1576
|
> **onGyroscopeChange**(`handler`): () => `void`
|
|
@@ -3841,6 +3875,35 @@ Wi-Fi SSID。
|
|
|
3841
3875
|
|
|
3842
3876
|
***
|
|
3843
3877
|
|
|
3878
|
+
### DeviceMotionChangeEvent
|
|
3879
|
+
|
|
3880
|
+
设备方向变化事件。
|
|
3881
|
+
|
|
3882
|
+
#### Properties
|
|
3883
|
+
|
|
3884
|
+
##### alpha
|
|
3885
|
+
|
|
3886
|
+
> **alpha**: `number`
|
|
3887
|
+
|
|
3888
|
+
当手机坐标 X/Y 和地球坐标 X/Y 重合时,绕 Z 轴转动的夹角。
|
|
3889
|
+
范围为 [0, 2π),逆时针转动为正。
|
|
3890
|
+
|
|
3891
|
+
##### beta
|
|
3892
|
+
|
|
3893
|
+
> **beta**: `number`
|
|
3894
|
+
|
|
3895
|
+
当手机坐标 Y/Z 和地球坐标 Y/Z 重合时,绕 X 轴转动的夹角。
|
|
3896
|
+
范围为 [-π, π)。
|
|
3897
|
+
|
|
3898
|
+
##### gamma
|
|
3899
|
+
|
|
3900
|
+
> **gamma**: `number`
|
|
3901
|
+
|
|
3902
|
+
当手机坐标 X/Z 和地球坐标 X/Z 重合时,绕 Y 轴转动的夹角。
|
|
3903
|
+
范围为 [-π/2, π/2)。
|
|
3904
|
+
|
|
3905
|
+
***
|
|
3906
|
+
|
|
3844
3907
|
### DispatchActionDirectiveParams
|
|
3845
3908
|
|
|
3846
3909
|
下发动作指令的请求参数。
|
|
@@ -3945,18 +4008,28 @@ mcp入参,如果expectedAction里预期要调用工具,需要在这里写明
|
|
|
3945
4008
|
|
|
3946
4009
|
点击失效卡要跳转的页面 detailText
|
|
3947
4010
|
|
|
3948
|
-
##### schema
|
|
4011
|
+
##### ~~schema?~~
|
|
3949
4012
|
|
|
3950
4013
|
> `optional` **schema**: `string`
|
|
3951
4014
|
|
|
3952
4015
|
点击失效卡要跳转的页面 schema,格式与 navigateTo 的 url 相同
|
|
3953
4016
|
|
|
4017
|
+
###### Deprecated
|
|
4018
|
+
|
|
4019
|
+
使用 url 字段替代 schema 字段,后续版本将移除 schema 字段,请尽快迁移到 url 字段
|
|
4020
|
+
|
|
3954
4021
|
##### title?
|
|
3955
4022
|
|
|
3956
4023
|
> `optional` **title**: `string`
|
|
3957
4024
|
|
|
3958
4025
|
点击失效卡要跳转的页面 title
|
|
3959
4026
|
|
|
4027
|
+
##### url?
|
|
4028
|
+
|
|
4029
|
+
> `optional` **url**: `string`
|
|
4030
|
+
|
|
4031
|
+
点击失效卡要跳转的页面 url 或 sslocal schema
|
|
4032
|
+
|
|
3960
4033
|
##### widgetInstanceId
|
|
3961
4034
|
|
|
3962
4035
|
> **widgetInstanceId**: `string`
|
|
@@ -6305,6 +6378,22 @@ iBeacon 距离等级。
|
|
|
6305
6378
|
|
|
6306
6379
|
***
|
|
6307
6380
|
|
|
6381
|
+
### DeviceMotionChangeListener()
|
|
6382
|
+
|
|
6383
|
+
> **DeviceMotionChangeListener**: (`event`) => `void`
|
|
6384
|
+
|
|
6385
|
+
设备方向变化事件监听函数。
|
|
6386
|
+
|
|
6387
|
+
#### Parameters
|
|
6388
|
+
|
|
6389
|
+
• **event**: [`DeviceMotionChangeEvent`](doubao-apps-sdk-open-api.md#devicemotionchangeevent)
|
|
6390
|
+
|
|
6391
|
+
#### Returns
|
|
6392
|
+
|
|
6393
|
+
`void`
|
|
6394
|
+
|
|
6395
|
+
***
|
|
6396
|
+
|
|
6308
6397
|
### DeviceOrientation
|
|
6309
6398
|
|
|
6310
6399
|
> **DeviceOrientation**: `"portrait"` \| `"landscape"`
|
|
@@ -22,29 +22,105 @@ npm install @doubao-apps/framework
|
|
|
22
22
|
|
|
23
23
|
### 组件开发
|
|
24
24
|
|
|
25
|
-
#### ✅
|
|
26
|
-
```
|
|
25
|
+
#### ✅ 在 app.config.ts 配置 App 元信息
|
|
26
|
+
```ts
|
|
27
|
+
import { defineAppConfig } from '@doubao-apps/kit';
|
|
28
|
+
|
|
29
|
+
export default defineAppConfig({
|
|
30
|
+
appId: 'com.example.my-doubao-app',
|
|
31
|
+
name: '我的豆包应用'
|
|
32
|
+
});
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
#### ✅ 需要稳定首页时在 app.config.ts 明确入口
|
|
36
|
+
```ts
|
|
37
|
+
// ✅ pages 数组第一项会作为首页(appletEntry)
|
|
38
|
+
import { defineAppConfig } from '@doubao-apps/kit';
|
|
39
|
+
|
|
40
|
+
export default defineAppConfig({
|
|
41
|
+
appId: 'com.example.my-doubao-app',
|
|
42
|
+
name: '我的豆包应用',
|
|
43
|
+
pages: [
|
|
44
|
+
{
|
|
45
|
+
entry: 'pages/home/index',
|
|
46
|
+
id: 'home',
|
|
47
|
+
title: '首页',
|
|
48
|
+
description: '应用默认打开的页面'
|
|
49
|
+
}
|
|
50
|
+
]
|
|
51
|
+
});
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
一级页面目录不写进 `pages` 也会自动发现;如果首页不是历史默认的 `index`,或需要固定首页顺序,建议显式配置 `pages`
|
|
55
|
+
数组第一项。
|
|
56
|
+
|
|
57
|
+
#### ✅ 需要补充展示信息时在 app.config.ts 定义 metadata
|
|
58
|
+
```ts
|
|
27
59
|
// ✅ 好的做法
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
60
|
+
import { defineAppConfig } from '@doubao-apps/kit';
|
|
61
|
+
|
|
62
|
+
export default defineAppConfig({
|
|
63
|
+
appId: 'com.example.my-doubao-app',
|
|
64
|
+
name: '我的豆包应用',
|
|
65
|
+
pages: [
|
|
66
|
+
{
|
|
67
|
+
entry: 'pages/user-profile/index',
|
|
68
|
+
id: 'user-profile',
|
|
69
|
+
title: '用户资料',
|
|
70
|
+
description: '展示和编辑用户个人资料'
|
|
71
|
+
}
|
|
72
|
+
]
|
|
35
73
|
});
|
|
36
74
|
```
|
|
37
75
|
|
|
38
|
-
```
|
|
39
|
-
// ❌
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
76
|
+
```ts
|
|
77
|
+
// ❌ 不好的做法:缺少 title、description 等信息
|
|
78
|
+
import { defineAppConfig } from '@doubao-apps/kit';
|
|
79
|
+
|
|
80
|
+
export default defineAppConfig({
|
|
81
|
+
appId: 'com.example.my-doubao-app',
|
|
82
|
+
name: '我的豆包应用',
|
|
83
|
+
pages: [
|
|
84
|
+
{
|
|
85
|
+
entry: 'pages/user-profile/index',
|
|
86
|
+
id: 'page1'
|
|
87
|
+
}
|
|
88
|
+
]
|
|
89
|
+
});
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
#### ✅ 多级目录必须显式声明 entry
|
|
93
|
+
```ts
|
|
94
|
+
// src/pages/account/demo/index.tsx
|
|
95
|
+
// src/widgets/order/detail/index.tsx
|
|
96
|
+
import { defineAppConfig } from '@doubao-apps/kit';
|
|
97
|
+
|
|
98
|
+
export default defineAppConfig({
|
|
99
|
+
appId: 'com.example.my-doubao-app',
|
|
100
|
+
name: '我的豆包应用',
|
|
101
|
+
pages: [
|
|
102
|
+
// 只声明入口、不补 metadata 时,可以直接写字符串
|
|
103
|
+
'pages/account/demo/index',
|
|
104
|
+
{
|
|
105
|
+
entry: 'pages/account/settings/index',
|
|
106
|
+
id: 'account-settings',
|
|
107
|
+
title: '账号设置页'
|
|
108
|
+
}
|
|
109
|
+
],
|
|
110
|
+
widgets: [
|
|
111
|
+
'widgets/order/detail/index',
|
|
112
|
+
{
|
|
113
|
+
entry: 'widgets/order/summary/index',
|
|
114
|
+
id: 'order-summary',
|
|
115
|
+
name: '订单摘要卡片'
|
|
116
|
+
}
|
|
117
|
+
]
|
|
45
118
|
});
|
|
46
119
|
```
|
|
47
120
|
|
|
121
|
+
如果不配置 `id`,默认取入口最后一级目录名:`pages/account/demo/index` 默认为 `demo`,`widgets/order/detail/index`
|
|
122
|
+
默认为 `detail`。
|
|
123
|
+
|
|
48
124
|
#### ✅ 分离样式文件
|
|
49
125
|
```tsx
|
|
50
126
|
// ✅ 好的做法
|
|
@@ -88,8 +164,8 @@ interface UserInfo {
|
|
|
88
164
|
|
|
89
165
|
export default defineWidget({
|
|
90
166
|
render() {
|
|
91
|
-
const
|
|
92
|
-
return <view>{
|
|
167
|
+
const viewData = getViewData<UserInfo>();
|
|
168
|
+
return <view>{viewData.name}</view>;
|
|
93
169
|
}
|
|
94
170
|
});
|
|
95
171
|
```
|
|
@@ -99,13 +175,16 @@ export default defineWidget({
|
|
|
99
175
|
import { defineAppConfig } from '@doubao-apps/kit';
|
|
100
176
|
|
|
101
177
|
export default defineAppConfig({
|
|
102
|
-
|
|
103
|
-
|
|
178
|
+
appId: 'com.example.my-doubao-app',
|
|
179
|
+
name: '我的豆包应用',
|
|
180
|
+
widgets: [
|
|
181
|
+
{
|
|
182
|
+
entry: 'widgets/user-card/index',
|
|
104
183
|
id: 'user-card',
|
|
105
184
|
name: '用户卡片',
|
|
106
185
|
description: '用户信息卡片'
|
|
107
186
|
}
|
|
108
|
-
|
|
187
|
+
]
|
|
109
188
|
});
|
|
110
189
|
```
|
|
111
190
|
|
|
@@ -113,8 +192,8 @@ export default defineAppConfig({
|
|
|
113
192
|
// ❌ 不好的做法
|
|
114
193
|
export default defineWidget({
|
|
115
194
|
render() {
|
|
116
|
-
const
|
|
117
|
-
return <view>{
|
|
195
|
+
const viewData = getViewData<any>(); // 使用 any 类型,失去类型检查
|
|
196
|
+
return <view>{viewData.name}</view>;
|
|
118
197
|
}
|
|
119
198
|
});
|
|
120
199
|
```
|
|
@@ -123,8 +202,6 @@ export default defineWidget({
|
|
|
123
202
|
```tsx
|
|
124
203
|
// ✅ 好的做法
|
|
125
204
|
export default definePage({
|
|
126
|
-
aiMeta: { /* ... */ },
|
|
127
|
-
|
|
128
205
|
onShow() {
|
|
129
206
|
console.log('Page shown');
|
|
130
207
|
},
|
|
@@ -149,15 +226,15 @@ export default definePage({
|
|
|
149
226
|
// ✅ 好的做法
|
|
150
227
|
export default defineWidget({
|
|
151
228
|
render() {
|
|
152
|
-
const
|
|
229
|
+
const viewData = getViewData<{ items: string[] }>();
|
|
153
230
|
// 处理空数据
|
|
154
|
-
if (!
|
|
231
|
+
if (!viewData.items || viewData.items.length === 0) {
|
|
155
232
|
return <view>暂无数据</view>;
|
|
156
233
|
}
|
|
157
234
|
|
|
158
235
|
return (
|
|
159
236
|
<view>
|
|
160
|
-
{
|
|
237
|
+
{viewData.items.map((item, index) => (
|
|
161
238
|
<view key={index}>{item}</view>
|
|
162
239
|
))}
|
|
163
240
|
</view>
|
|
@@ -170,11 +247,11 @@ export default defineWidget({
|
|
|
170
247
|
// ❌ 不好的做法
|
|
171
248
|
export default defineWidget({
|
|
172
249
|
render() {
|
|
173
|
-
const
|
|
174
|
-
// 没有检查
|
|
250
|
+
const viewData = getViewData<any>();
|
|
251
|
+
// 没有检查 viewData.items 是否存在
|
|
175
252
|
return (
|
|
176
253
|
<view>
|
|
177
|
-
{
|
|
254
|
+
{viewData.items.map(item => <view>{item}</view>)}
|
|
178
255
|
</view>
|
|
179
256
|
);
|
|
180
257
|
}
|
|
@@ -321,24 +398,24 @@ export default definePage({
|
|
|
321
398
|
// ❌ 错误
|
|
322
399
|
export default defineWidget({
|
|
323
400
|
render() {
|
|
324
|
-
const
|
|
401
|
+
const viewData = getViewData<any>();
|
|
325
402
|
// @ts-ignore
|
|
326
|
-
return <view>{
|
|
403
|
+
return <view>{viewData.unknownProperty}</view>;
|
|
327
404
|
}
|
|
328
405
|
});
|
|
329
406
|
```
|
|
330
407
|
|
|
331
408
|
```tsx
|
|
332
409
|
// ✅ 正确
|
|
333
|
-
interface
|
|
410
|
+
interface UserInfo {
|
|
334
411
|
name: string;
|
|
335
412
|
age: number;
|
|
336
413
|
}
|
|
337
414
|
|
|
338
415
|
export default defineWidget({
|
|
339
416
|
render() {
|
|
340
|
-
const
|
|
341
|
-
return <view>{
|
|
417
|
+
const viewData = getViewData<UserInfo>();
|
|
418
|
+
return <view>{viewData.name}</view>;
|
|
342
419
|
}
|
|
343
420
|
});
|
|
344
421
|
```
|
|
@@ -6,10 +6,10 @@
|
|
|
6
6
|
"build": "doubao build"
|
|
7
7
|
},
|
|
8
8
|
"dependencies": {
|
|
9
|
-
"@doubao-apps/framework": "^0.0.
|
|
9
|
+
"@doubao-apps/framework": "^0.0.29-rc.0"
|
|
10
10
|
},
|
|
11
11
|
"devDependencies": {
|
|
12
|
-
"@doubao-apps/kit": "^0.0.
|
|
12
|
+
"@doubao-apps/kit": "^0.0.29-rc.0",
|
|
13
13
|
"typescript": "5.5.3"
|
|
14
14
|
},
|
|
15
15
|
"version": "0.0.16"
|
|
@@ -412,7 +412,8 @@ function relaunchHome() {
|
|
|
412
412
|
}
|
|
413
413
|
```
|
|
414
414
|
|
|
415
|
-
这里的 `url` 直接使用目标页面的 `pageId
|
|
415
|
+
这里的 `url` 直接使用目标页面的 `pageId`。显式配置时取 `src/app.config.ts` 中对应 page 的 `id`;不配置时取入口目录名,例如
|
|
416
|
+
`src/pages/detail/index.tsx` 默认为 `detail`。如需传参,可继续拼接 query string。
|
|
416
417
|
|
|
417
418
|
### 2. 页面间传参
|
|
418
419
|
|
|
@@ -441,20 +442,16 @@ function navigateWithParams() {
|
|
|
441
442
|
// 接收方 (detail-page)
|
|
442
443
|
import { getViewData } from '@doubao-apps/framework';
|
|
443
444
|
|
|
444
|
-
interface
|
|
445
|
+
interface DetailPageData {
|
|
445
446
|
id: string;
|
|
446
447
|
name: string;
|
|
447
448
|
price: number;
|
|
448
449
|
}
|
|
449
450
|
|
|
450
451
|
export default definePage({
|
|
451
|
-
aiMeta: {
|
|
452
|
-
id: 'detail-page',
|
|
453
|
-
title: '详情页'
|
|
454
|
-
},
|
|
455
452
|
render() {
|
|
456
453
|
// getViewData() 直接返回传入页面的最终对象
|
|
457
|
-
const { id, name, price } = getViewData<
|
|
454
|
+
const { id, name, price } = getViewData<DetailPageData>();
|
|
458
455
|
|
|
459
456
|
return (
|
|
460
457
|
<view>
|
|
@@ -497,10 +494,6 @@ function goBackTwoPages() {
|
|
|
497
494
|
|
|
498
495
|
```tsx
|
|
499
496
|
export default definePage({
|
|
500
|
-
aiMeta: {
|
|
501
|
-
id: 'my-page',
|
|
502
|
-
title: '我的页面'
|
|
503
|
-
},
|
|
504
497
|
onShow() {
|
|
505
498
|
// 页面显示时调用(包括从其他页面返回)
|
|
506
499
|
console.log('页面显示');
|
|
@@ -536,10 +529,6 @@ function openGridPage() {
|
|
|
536
529
|
|
|
537
530
|
// 九宫格页面定义
|
|
538
531
|
export default definePage({
|
|
539
|
-
aiMeta: {
|
|
540
|
-
id: 'app-grid',
|
|
541
|
-
title: '应用中心'
|
|
542
|
-
},
|
|
543
532
|
render() {
|
|
544
533
|
const apps = [
|
|
545
534
|
{ id: 'app1', name: '应用1', icon: '🎯' },
|