@doubao-apps/ai 0.0.20 → 0.0.21
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/skills/uniapp-to-doubao/SKILL.md +334 -0
- package/dist/skills/uniapp-to-doubao/assets/migration-checklist-template.md +145 -0
- package/dist/skills/uniapp-to-doubao/references/mapping/component-mapping.md +157 -0
- package/dist/skills/uniapp-to-doubao/references/mapping/core-api-mapping.md +208 -0
- package/dist/skills/uniapp-to-doubao/references/mapping/event-mapping.md +133 -0
- package/dist/skills/uniapp-to-doubao/references/mapping/lifecycle-mapping.md +152 -0
- package/dist/skills/uniapp-to-doubao/references/mapping/style-mapping.md +139 -0
- package/dist/skills/uniapp-to-doubao/references/source-framework/api-reference.md +367 -0
- package/dist/skills/uniapp-to-doubao/references/source-framework/components.md +245 -0
- package/package.json +1 -1
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
# uni-app 2.0.0 API / 配置参考
|
|
2
|
+
|
|
3
|
+
> 本文档为迁移参考,仅覆盖 `uni-app 2.0.0` 系列的常用能力。
|
|
4
|
+
> 事实优先来源为官方历史版本归档与当前仍可访问的官方文档入口,已于 `2026-04-09` 校验。
|
|
5
|
+
|
|
6
|
+
## 官方文档入口
|
|
7
|
+
|
|
8
|
+
- 历史版本归档(含 `2.0.0` 系列历史构建): `https://uniapp.dcloud.net.cn/release-archive.html`
|
|
9
|
+
- 页面与生命周期: `https://uniapp.dcloud.io/tutorial/page.html`
|
|
10
|
+
- `pages.json`: `https://uniapp.dcloud.io/collocation/pages.html`
|
|
11
|
+
- 网络请求 / `uni.request`: `https://uniapp.dcloud.io/api/request/request.html`
|
|
12
|
+
- 条件编译: `https://uniapp.dcloud.io/tutorial/platform`
|
|
13
|
+
- 组件总览入口: `https://uniapp.dcloud.io/component/`
|
|
14
|
+
|
|
15
|
+
**版本说明**:
|
|
16
|
+
|
|
17
|
+
- 以上官方文档入口当前仍在更新,因此只能作为语法与配置入口使用。
|
|
18
|
+
- 只要当前文档中涉及 `2.0.0` 系列之后新增的能力,一律不纳入本 skill 的源端能力集合。
|
|
19
|
+
- `2.0.0` 系列历史发布记录可用于确认该大版本阶段的能力边界,例如 `2.0.0.20190610` 提到了 `subNVue`、自定义组件模式、`uni.$on/$once/$off/$emit`、`editor` 组件、`navigationbarshadow` 等。
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 工程结构
|
|
24
|
+
|
|
25
|
+
典型 uni-app `2.0.0` 工程:
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
src/
|
|
29
|
+
├── main.js
|
|
30
|
+
├── App.vue
|
|
31
|
+
├── pages.json
|
|
32
|
+
├── manifest.json
|
|
33
|
+
├── pages/
|
|
34
|
+
│ └── index/index.vue
|
|
35
|
+
└── components/
|
|
36
|
+
└── card.vue
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### `main.js`
|
|
40
|
+
|
|
41
|
+
用于挂载 Vue 应用和全局插件:
|
|
42
|
+
|
|
43
|
+
```js
|
|
44
|
+
import Vue from 'vue';
|
|
45
|
+
import App from './App';
|
|
46
|
+
|
|
47
|
+
Vue.config.productionTip = false;
|
|
48
|
+
App.mpType = 'app';
|
|
49
|
+
|
|
50
|
+
const app = new Vue({
|
|
51
|
+
...App
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
app.$mount();
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**迁移**:入口逻辑重写到 `src/app.ts`,不要保留 Vue 实例化。
|
|
58
|
+
|
|
59
|
+
### `App.vue`
|
|
60
|
+
|
|
61
|
+
常见承载全局生命周期:
|
|
62
|
+
|
|
63
|
+
```vue
|
|
64
|
+
<script>
|
|
65
|
+
export default {
|
|
66
|
+
onLaunch() {},
|
|
67
|
+
onShow() {},
|
|
68
|
+
onHide() {}
|
|
69
|
+
}
|
|
70
|
+
</script>
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**迁移**:应用级逻辑转 `defineApp({ onLaunch, onForeground, onBackground, onDestroy, onError })`。
|
|
74
|
+
|
|
75
|
+
### `pages.json`
|
|
76
|
+
|
|
77
|
+
负责页面注册、首页、导航栏、下拉刷新、tabBar 等:
|
|
78
|
+
|
|
79
|
+
```json
|
|
80
|
+
{
|
|
81
|
+
"pages": [
|
|
82
|
+
{
|
|
83
|
+
"path": "pages/index/index",
|
|
84
|
+
"style": {
|
|
85
|
+
"navigationBarTitleText": "首页"
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
],
|
|
89
|
+
"globalStyle": {},
|
|
90
|
+
"tabBar": {}
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**迁移**:目标工程需按页面与宿主能力重建,不能直接复制。
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## 页面定义
|
|
99
|
+
|
|
100
|
+
uni-app `2.0.0` 页面本质上是 Vue2 单文件组件,并额外支持页面生命周期:
|
|
101
|
+
|
|
102
|
+
```vue
|
|
103
|
+
<script>
|
|
104
|
+
export default {
|
|
105
|
+
data() {
|
|
106
|
+
return {
|
|
107
|
+
list: [],
|
|
108
|
+
loading: false
|
|
109
|
+
};
|
|
110
|
+
},
|
|
111
|
+
onLoad(options) {},
|
|
112
|
+
onShow() {},
|
|
113
|
+
onReady() {},
|
|
114
|
+
onHide() {},
|
|
115
|
+
onUnload() {},
|
|
116
|
+
methods: {
|
|
117
|
+
loadList() {}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
</script>
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
**迁移**:
|
|
124
|
+
|
|
125
|
+
- 页面输出为 `definePage({ ... render() { ... } })`
|
|
126
|
+
- 页面 UI 本体转为 React 函数组件
|
|
127
|
+
- 初始化请求通常落到 `onMounted` 或组件内 `useEffect`
|
|
128
|
+
- 页面输入优先通过 `getViewData()` / `getViewContext()` 获取
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Vue2 Options API
|
|
133
|
+
|
|
134
|
+
### `data`
|
|
135
|
+
|
|
136
|
+
```js
|
|
137
|
+
data() {
|
|
138
|
+
return {
|
|
139
|
+
count: 0,
|
|
140
|
+
list: []
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
**迁移**:→ `useState`
|
|
146
|
+
|
|
147
|
+
### `props`
|
|
148
|
+
|
|
149
|
+
```js
|
|
150
|
+
export default {
|
|
151
|
+
props: {
|
|
152
|
+
title: String,
|
|
153
|
+
active: Boolean
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**迁移**:→ `FC<Props>`
|
|
159
|
+
|
|
160
|
+
### `computed`
|
|
161
|
+
|
|
162
|
+
```js
|
|
163
|
+
computed: {
|
|
164
|
+
doubled() {
|
|
165
|
+
return this.count * 2;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
**迁移**:→ `useMemo`
|
|
171
|
+
|
|
172
|
+
### `watch`
|
|
173
|
+
|
|
174
|
+
```js
|
|
175
|
+
watch: {
|
|
176
|
+
keyword(val) {
|
|
177
|
+
this.search(val);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
**迁移**:→ `useEffect`
|
|
183
|
+
|
|
184
|
+
### `methods`
|
|
185
|
+
|
|
186
|
+
```js
|
|
187
|
+
methods: {
|
|
188
|
+
handleTap(item) {},
|
|
189
|
+
fetchList() {}
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
**迁移**:→ 组件内普通函数
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## 页面生命周期
|
|
198
|
+
|
|
199
|
+
根据官方页面文档与 uni-app 传统用法,常见页面生命周期包括:
|
|
200
|
+
|
|
201
|
+
- `onLoad(options)`
|
|
202
|
+
- `onShow()`
|
|
203
|
+
- `onReady()`
|
|
204
|
+
- `onHide()`
|
|
205
|
+
- `onUnload()`
|
|
206
|
+
- `onPullDownRefresh()`
|
|
207
|
+
- `onReachBottom()`
|
|
208
|
+
- `onPageScroll(e)`
|
|
209
|
+
- `onShareAppMessage()`
|
|
210
|
+
|
|
211
|
+
**迁移判断**:
|
|
212
|
+
|
|
213
|
+
- `onShow / onHide / onUnload` 可映射到目标页面生命周期
|
|
214
|
+
- `onLoad(options)` 不要假设目标框架存在同名钩子;页面输入优先改为 `getViewData()`
|
|
215
|
+
- `onReady()` 通常转为 `onMounted` 或组件 `useEffect`
|
|
216
|
+
- `onPullDownRefresh / onReachBottom / onPageScroll` 需要结合页面容器和目标宿主能力重写
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
## 应用生命周期
|
|
221
|
+
|
|
222
|
+
`App.vue` 常见生命周期:
|
|
223
|
+
|
|
224
|
+
- `onLaunch()`
|
|
225
|
+
- `onShow()`
|
|
226
|
+
- `onHide()`
|
|
227
|
+
- `onError(err)`
|
|
228
|
+
- `onPageNotFound(res)`(部分项目会用)
|
|
229
|
+
|
|
230
|
+
**迁移判断**:
|
|
231
|
+
|
|
232
|
+
- `onLaunch()` → `defineApp.onLaunch`
|
|
233
|
+
- `onShow()` → `defineApp.onForeground`
|
|
234
|
+
- `onHide()` → `defineApp.onBackground`
|
|
235
|
+
- `onError()` → `defineApp.onError`
|
|
236
|
+
- 其他应用级钩子按目标框架真实 API 取舍,不做机械同名迁移
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## 常用 `uni.*` API
|
|
241
|
+
|
|
242
|
+
### `uni.request`
|
|
243
|
+
|
|
244
|
+
```js
|
|
245
|
+
uni.request({
|
|
246
|
+
url: 'https://api.example.com/list',
|
|
247
|
+
method: 'GET',
|
|
248
|
+
data: { page: 1 },
|
|
249
|
+
success(res) {
|
|
250
|
+
console.log(res.data);
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
**迁移**:→ `request({ url, method, data })`,返回 Promise。
|
|
256
|
+
|
|
257
|
+
### 路由
|
|
258
|
+
|
|
259
|
+
```js
|
|
260
|
+
uni.navigateTo({ url: '/pages/detail/index?id=1' });
|
|
261
|
+
uni.redirectTo({ url: '/pages/home/index' });
|
|
262
|
+
uni.navigateBack({ delta: 1 });
|
|
263
|
+
uni.switchTab({ url: '/pages/tab/index' });
|
|
264
|
+
uni.reLaunch({ url: '/pages/index/index' });
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
**迁移**:
|
|
268
|
+
|
|
269
|
+
- `navigateTo / redirectTo / navigateBack / reLaunch` 可迁到目标公开路由 API
|
|
270
|
+
- `switchTab` 不要假设目标侧存在同名公开 API;若源项目依赖 tabBar,需要在目标工程重建导航结构或记录能力缺口
|
|
271
|
+
|
|
272
|
+
### UI 交互
|
|
273
|
+
|
|
274
|
+
```js
|
|
275
|
+
uni.showToast({ title: '成功', icon: 'success' });
|
|
276
|
+
uni.showLoading({ title: '加载中' });
|
|
277
|
+
uni.hideLoading();
|
|
278
|
+
uni.showModal({ title: '提示', content: '确认删除?' });
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
**迁移**:
|
|
282
|
+
|
|
283
|
+
- `uni.showToast({ title })` → `showToast({ message })`,参数名不同,不能机械复制
|
|
284
|
+
- `showLoading / hideLoading / showModal` 当前不要假设目标公开 API 存在;优先改为页面内 loading 状态、`Dialog` / `Popup` 组件流,或记录能力缺口
|
|
285
|
+
|
|
286
|
+
### 存储
|
|
287
|
+
|
|
288
|
+
```js
|
|
289
|
+
uni.setStorageSync('token', token);
|
|
290
|
+
const token = uni.getStorageSync('token');
|
|
291
|
+
uni.removeStorageSync('token');
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
**迁移**:
|
|
295
|
+
|
|
296
|
+
- `setStorageSync('token', token)` → `setStorageSync({ key: 'token', data: token })`
|
|
297
|
+
- `getStorageSync('token')` → `getStorageSync({ key: 'token' }).data`
|
|
298
|
+
- `removeStorageSync('token')` → `removeStorageSync({ key: 'token' })`
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
## 页面通信
|
|
303
|
+
|
|
304
|
+
`2.0.0` 系列发布记录中可确认已加入:
|
|
305
|
+
|
|
306
|
+
- `uni.$on`
|
|
307
|
+
- `uni.$once`
|
|
308
|
+
- `uni.$off`
|
|
309
|
+
- `uni.$emit`
|
|
310
|
+
|
|
311
|
+
常见写法:
|
|
312
|
+
|
|
313
|
+
```js
|
|
314
|
+
onLoad() {
|
|
315
|
+
uni.$on('refresh', this.handleRefresh);
|
|
316
|
+
},
|
|
317
|
+
onUnload() {
|
|
318
|
+
uni.$off('refresh', this.handleRefresh);
|
|
319
|
+
},
|
|
320
|
+
methods: {
|
|
321
|
+
handleRefresh(payload) {}
|
|
322
|
+
}
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
**迁移建议**:
|
|
326
|
+
|
|
327
|
+
- 优先改成显式 props / 页面输入 / 本地状态提升
|
|
328
|
+
- 必须跨页面广播时,再结合目标框架能力重写
|
|
329
|
+
- 不要保留全局事件总线式写法而不做生命周期清理
|
|
330
|
+
|
|
331
|
+
---
|
|
332
|
+
|
|
333
|
+
## 条件编译
|
|
334
|
+
|
|
335
|
+
uni-app 通过 `#ifdef` / `#ifndef` / `#endif` 处理多端差异:
|
|
336
|
+
|
|
337
|
+
```js
|
|
338
|
+
// #ifdef MP-WEIXIN
|
|
339
|
+
wx.login({});
|
|
340
|
+
// #endif
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
```vue
|
|
344
|
+
<!-- #ifdef MP-WEIXIN -->
|
|
345
|
+
<official-account></official-account>
|
|
346
|
+
<!-- #endif -->
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
**迁移建议**:
|
|
350
|
+
|
|
351
|
+
- 先统计所有条件编译块
|
|
352
|
+
- 再判断哪些分支属于当前小程序版本的实际业务路径
|
|
353
|
+
- 宿主原生 API 或原生组件单独记录,不做静默删除
|
|
354
|
+
|
|
355
|
+
---
|
|
356
|
+
|
|
357
|
+
## 版本边界提醒
|
|
358
|
+
|
|
359
|
+
遇到以下能力时,默认视为 **超出 uni-app 2.0.0 范围**,必须谨慎:
|
|
360
|
+
|
|
361
|
+
- Vue3 / Composition API
|
|
362
|
+
- `<script setup>`
|
|
363
|
+
- 新版条件编译变量
|
|
364
|
+
- 后续新增平台和组件能力
|
|
365
|
+
- 只在更高基础库或更高 HBuilderX 版本中出现的 API
|
|
366
|
+
|
|
367
|
+
若源项目出现这些写法,应先标记“源项目已超出本 skill 版本假设”。
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
# uni-app 2.0.0 组件 / 模板参考
|
|
2
|
+
|
|
3
|
+
> 本文档聚焦 `uni-app 2.0.0` 系列常见模板语法和内置组件。
|
|
4
|
+
> 用于迁移时识别 Vue2 SFC 模板语义,而不是罗列所有后续版本新增能力。
|
|
5
|
+
|
|
6
|
+
## 官方文档入口
|
|
7
|
+
|
|
8
|
+
- 组件总览入口: `https://uniapp.dcloud.io/component/`
|
|
9
|
+
- 页面与模板用法: `https://uniapp.dcloud.io/tutorial/page.html`
|
|
10
|
+
- 条件编译: `https://uniapp.dcloud.io/tutorial/platform`
|
|
11
|
+
- `editor` 相关 API 入口: `https://uniapp.dcloud.io/api/media/editor-context.html`
|
|
12
|
+
- `2.0.0` 系列发布记录(例如 `2.0.0.20190610`,可用来确认 `editor` 等能力): `https://uniapp.dcloud.net.cn/release-archive.html`
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 模板语法
|
|
17
|
+
|
|
18
|
+
uni-app `2.0.0` 使用 Vue2 单文件组件模板:
|
|
19
|
+
|
|
20
|
+
```vue
|
|
21
|
+
<template>
|
|
22
|
+
<view class="page">
|
|
23
|
+
<view v-if="loading">加载中</view>
|
|
24
|
+
<view v-else>
|
|
25
|
+
<view v-for="item in list" :key="item.id" @tap="handleTap(item)">
|
|
26
|
+
<text>{{ item.title }}</text>
|
|
27
|
+
</view>
|
|
28
|
+
</view>
|
|
29
|
+
</view>
|
|
30
|
+
</template>
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### 常见指令
|
|
34
|
+
|
|
35
|
+
| uni-app 2.0.0 | 说明 |
|
|
36
|
+
|--------------|------|
|
|
37
|
+
| `{{ expr }}` | 文本插值 |
|
|
38
|
+
| `v-if` / `v-else-if` / `v-else` | 条件渲染 |
|
|
39
|
+
| `v-for="item in list"` | 列表渲染 |
|
|
40
|
+
| `:prop="expr"` | 动态绑定 |
|
|
41
|
+
| `@tap="handleTap"` / `@click="handleClick"` | 事件绑定 |
|
|
42
|
+
| `v-model` | 双向绑定 |
|
|
43
|
+
| `<template>` / `<block>` | 结构块 |
|
|
44
|
+
|
|
45
|
+
**迁移提醒**:
|
|
46
|
+
|
|
47
|
+
- 事件绑定是 Vue 模板语义,不是小程序字符串方法名
|
|
48
|
+
- `v-model` 不能机械迁移,必须改成受控组件
|
|
49
|
+
- `<template>` / `<block>` 迁移后通常变成 Fragment 或直接移除
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 基础容器
|
|
54
|
+
|
|
55
|
+
### `view`
|
|
56
|
+
|
|
57
|
+
```vue
|
|
58
|
+
<view class="card">内容</view>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**迁移**:→ `<view className="card">...</view>`
|
|
62
|
+
|
|
63
|
+
### `scroll-view`
|
|
64
|
+
|
|
65
|
+
```vue
|
|
66
|
+
<scroll-view scroll-y class="list" @scrolltolower="loadMore">
|
|
67
|
+
<view v-for="item in list" :key="item.id">{{ item.name }}</view>
|
|
68
|
+
</scroll-view>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**迁移**:→ 保留 `<scroll-view>`,重写事件和滚动方向属性。
|
|
72
|
+
|
|
73
|
+
### `swiper` / `swiper-item`
|
|
74
|
+
|
|
75
|
+
```vue
|
|
76
|
+
<swiper :autoplay="true" :indicator-dots="true">
|
|
77
|
+
<swiper-item v-for="item in banners" :key="item.id">
|
|
78
|
+
<image :src="item.image" mode="aspectFill" />
|
|
79
|
+
</swiper-item>
|
|
80
|
+
</swiper>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**迁移**:→ 优先保留 `<swiper>` / `<swiper-item>` 小写标签。
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## 文本与媒体
|
|
88
|
+
|
|
89
|
+
### `text`
|
|
90
|
+
|
|
91
|
+
```vue
|
|
92
|
+
<text>{{ title }}</text>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**迁移**:→ `<text>{title}</text>`
|
|
96
|
+
|
|
97
|
+
### `image`
|
|
98
|
+
|
|
99
|
+
```vue
|
|
100
|
+
<image :src="avatar" mode="aspectFill" />
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**迁移**:→ `<image src={avatar} mode="aspectFill" />`
|
|
104
|
+
|
|
105
|
+
### `video`
|
|
106
|
+
|
|
107
|
+
普通播放型视频可迁移;平台强绑定的视频能力需单独评估。
|
|
108
|
+
|
|
109
|
+
### `editor`
|
|
110
|
+
|
|
111
|
+
`2.0.0` 系列发布记录中可确认 `editor` 富文本编辑器组件已进入该大版本范围。
|
|
112
|
+
|
|
113
|
+
**迁移提醒**:
|
|
114
|
+
|
|
115
|
+
- 若源项目确实使用 `editor`,先确认目标工程是否存在等价编辑器能力
|
|
116
|
+
- 若没有,必须记录能力缺口,不要静默替换成普通 `textarea`
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## 表单组件
|
|
121
|
+
|
|
122
|
+
### `button`
|
|
123
|
+
|
|
124
|
+
```vue
|
|
125
|
+
<button type="primary" @tap="handleSubmit">提交</button>
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**迁移**:→ 保留 `<button>`,事件改写为目标框架事件。
|
|
129
|
+
|
|
130
|
+
### `input`
|
|
131
|
+
|
|
132
|
+
```vue
|
|
133
|
+
<input v-model="keyword" placeholder="请输入关键词" />
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
**迁移**:→ 改成受控写法:
|
|
137
|
+
|
|
138
|
+
```tsx
|
|
139
|
+
<input
|
|
140
|
+
value={keyword}
|
|
141
|
+
onInput={(e) => setKeyword(e.detail.value)}
|
|
142
|
+
placeholder="请输入关键词"
|
|
143
|
+
/>
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### `textarea`
|
|
147
|
+
|
|
148
|
+
同 `input`,改为受控多行输入。
|
|
149
|
+
|
|
150
|
+
### `picker`
|
|
151
|
+
|
|
152
|
+
uni-app 的 `picker` 常被用作弹出选择器。
|
|
153
|
+
|
|
154
|
+
**迁移提醒**:
|
|
155
|
+
|
|
156
|
+
- `mode="selector"`:通常可用 `<popup>` + 单列 `<picker-view>` / `<picker-column>` 重写
|
|
157
|
+
- `mode="multiSelector"`:可用多列 `<picker-column>` 重建
|
|
158
|
+
- `mode="time"` / `mode="date"` / `mode="region"`:先确认目标宿主是否存在等价能力;没有时记录缺口或按业务重新设计,不要静默降级成普通单列选择器
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## 导航相关
|
|
163
|
+
|
|
164
|
+
### `navigator`
|
|
165
|
+
|
|
166
|
+
```vue
|
|
167
|
+
<navigator :url="`/pages/detail/index?id=${item.id}`">
|
|
168
|
+
<view class="link">查看详情</view>
|
|
169
|
+
</navigator>
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
**迁移**:→ 改为显式路由 API,不保留 `<navigator>`。
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## 模板中的列表和条件
|
|
177
|
+
|
|
178
|
+
### `v-for`
|
|
179
|
+
|
|
180
|
+
```vue
|
|
181
|
+
<view v-for="(item, index) in list" :key="item.id">
|
|
182
|
+
<text>{{ index + 1 }}. {{ item.title }}</text>
|
|
183
|
+
</view>
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
**迁移**:→ `list.map((item, index) => ...)`
|
|
187
|
+
|
|
188
|
+
### `v-if`
|
|
189
|
+
|
|
190
|
+
```vue
|
|
191
|
+
<view v-if="loading">加载中</view>
|
|
192
|
+
<view v-else>内容</view>
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
**迁移**:→ 条件表达式或三元表达式。
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## 样式组织
|
|
200
|
+
|
|
201
|
+
uni-app `2.0.0` 常见写法:
|
|
202
|
+
|
|
203
|
+
```vue
|
|
204
|
+
<style scoped lang="scss">
|
|
205
|
+
.page {
|
|
206
|
+
padding: 24rpx;
|
|
207
|
+
}
|
|
208
|
+
</style>
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
**迁移建议**:
|
|
212
|
+
|
|
213
|
+
- 样式拆到同目录 `index.scss`
|
|
214
|
+
- `class` → `className`
|
|
215
|
+
- `scoped` 语义通过局部 class 组织保持,不依赖自动加 scope attribute
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## 条件编译中的组件
|
|
220
|
+
|
|
221
|
+
uni-app 模板可在组件层面使用条件编译:
|
|
222
|
+
|
|
223
|
+
```vue
|
|
224
|
+
<!-- #ifdef MP-WEIXIN -->
|
|
225
|
+
<official-account></official-account>
|
|
226
|
+
<!-- #endif -->
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
**迁移提醒**:
|
|
230
|
+
|
|
231
|
+
- 这是宿主平台组件,不是普通 `view`
|
|
232
|
+
- Doubao 侧若无等价能力,应记录缺口
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## 版本边界提醒
|
|
237
|
+
|
|
238
|
+
以下写法若出现在源项目中,需要先怀疑不是 `2.0.0` 的标准能力:
|
|
239
|
+
|
|
240
|
+
- Vue3 slot / setup 语法
|
|
241
|
+
- 组合式 API 组件示例
|
|
242
|
+
- 后续新增组件或属性
|
|
243
|
+
- 只在更高 HBuilderX 版本中标注支持的能力
|
|
244
|
+
|
|
245
|
+
优先按 `2.0.0` 系列发布记录和本 skill 的保守口径处理。
|