提交 770fe0cc 编写于 作者: fxy060608's avatar fxy060608

Merge branch 'dev' of https://github.com/dcloudio/uni-app into alpha

......@@ -24,7 +24,7 @@
`uni-app`支持通过`vue-cli`命令行、`HBuilderX`可视化界面两种方式快速创建项目:
- [vue-cli命令行方式](https://uniapp.dcloud.io/quickstart?id=_2-通过vue-cli命令行):不限IDE,适合对node熟悉的开发者,扩展阅读:[在vscode中开发uni-app](https://ask.dcloud.net.cn/article/36286)
- [vue-cli命令行方式](https://uniapp.dcloud.io/quickstart?id=_2-通过vue-cli命令行):不限IDE,适合对node熟悉的开发者,扩展阅读:[在vscode中开发uni-app](https://ask.dcloud.net.cn/article/36286)[在 WebStorm 中开发 uni-app](https://ask.dcloud.net.cn/article/36307)
- [HBuilderX可视化界面](https://uniapp.dcloud.io/quickstart?id=_1-通过-hbuilderx-可视化界面):专用IDE,内置相关环境,开箱即用,开发效率更高。
## 项目案例
......
......@@ -250,6 +250,7 @@ function async request () {
|API|说明|
|:-|:-|
|[uni.vibrate](api/system/vibrate?id=vibrate)|使手机发生振动|
|[uni.vibrateLong](api/system/vibrate?id=vibratelong)|使手机发生较长时间的振动|
|[uni.vibrateShort](api/system/vibrate?id=vibrateshort)|使手机发生较短时间的振动|
##### 手机联系人
......
* 基础
* [日志打印](api/log.md)
* [uni.base64ToArrayBuffer](api/base64ToArrayBuffer?id=base64toarraybuffer)
* [uni.arrayBufferToBase64](api/arrayBufferToBase64?id=arraybuffertobase64)
* [定时器](api/timer.md)
* [日志打印](api/log.md)
* [uni.base64ToArrayBuffer](api/base64ToArrayBuffer?id=base64toarraybuffer)
* [uni.arrayBufferToBase64](api/arrayBufferToBase64?id=arraybuffertobase64)
* [定时器](api/timer.md)
* [生命周期](api/lifetime.md)
* 网络
* [发起请求](api/request/request.md)
* [上传、下载](api/request/network-file.md)
* [WebSocket](api/request/websocket.md)
* [SocketTask](api/request/socket-task.md)
* [mDNS](api/request/mDNS.md)
* [SocketTask](api/request/socket-task.md)
* [mDNS](api/request/mDNS.md)
* [UDP 通信](api/request/UDP.md)
* 路由与页面跳转
* [uni.navigateTo](/api/router?id=navigateto)
......@@ -41,8 +41,8 @@
* [视频](api/media/video.md)
* [视频组件控制](api/media/video-context.md)
* [相机组件控制](api/media/camera-context.md)
* [直播组件控制](api/media/live-player-context.md)
* [富文本](api/media/editor-context.md)
* [直播组件控制](api/media/live-player-context.md)
* [富文本](api/media/editor-context.md)
* 设备
* [系统信息](api/system/info.md)
* [内存](api/system/memory.md)
......@@ -56,17 +56,18 @@
* [屏幕](api/system/brightness.md)
* [用户截屏事件](api/system/capture-screen.md)
* [振动](api/system/vibrate.md)
* [手机联系人](api/system/contact.md)
* [蓝牙](api/system/bluetooth.md)
* [低功耗蓝牙](api/system/ble.md)
* [iBeacon](api/system/ibeacon.md)
* [Wi-Fi](api/system/wifi.md)
* [电量](api/system/batteryInfo.md)
* [NFC](api/system/nfc.md)
* [设备方向](api/system/deviceMotion.md)
* [手机联系人](api/system/contact.md)
* [蓝牙](api/system/bluetooth.md)
* [低功耗蓝牙](api/system/ble.md)
* [iBeacon](api/system/ibeacon.md)
* [Wi-Fi](api/system/wifi.md)
* [电量](api/system/batteryInfo.md)
* [NFC](api/system/nfc.md)
* [设备方向](api/system/deviceMotion.md)
* [Worker](api/worder.md)
* 键盘
* [uni.hideKeyboard](/api/key?id=hidekeyboard)
* [uni.onKeyboardHeightChange](/api/key?id=onkeyboardheightchange)
* 界面
* [交互反馈](api/ui/prompt.md)
* [设置导航条](api/ui/navigationbar.md)
......@@ -78,22 +79,22 @@
* [字体](api/ui/font.md)
* [下拉刷新](api/ui/pulldown.md)
* [节点信息](api/ui/nodes-info.md)
* [节点布局相交状态](api/ui/intersection-observer.md)
* [自定义组件](api/ui/nextTick.md)
* [菜单](api/ui/menuButton.md)
* 页面和窗体
* [页面](api/window/window.md)
* [页面通讯](api/window/communication.md)
* [subNVue原生子窗体](api/window/subNVues.md)
* [节点布局相交状态](api/ui/intersection-observer.md)
* [自定义组件](api/ui/nextTick.md)
* [菜单](api/ui/menuButton.md)
* 页面和窗体
* [页面](api/window/window.md)
* [页面通讯](api/window/communication.md)
* [subNVue原生子窗体](api/window/subNVues.md)
* 文件
* [uni.saveFile](/api/file/file?id=savefile)
* [uni.getSavedFileList](/api/file/file?id=getSavedFileList)
* [uni.getSavedFileInfo](/api/file/file?id=getSavedFileInfo)
* [uni.removeSavedFile](/api/file/file?id=removeSavedFile)
* [uni.getFileInfo](/api/file/file?id=getFileInfo)
* [uni.openDocument](/api/file/file?id=openDocument)
* [uni.getFileSystemManager](/api/file/getFileSystemManager)
* 绘画
* [uni.openDocument](/api/file/file?id=openDocument)
* [uni.getFileSystemManager](/api/file/getFileSystemManager)
* 绘画
* [uni.createOffscreenCanvas](api/canvas/createOffscreenCanvas.md)
* [uni.createCanvasContext](api/canvas/createCanvasContext.md)
* [uni.canvasToTempFilePath](api/canvas/canvasToTempFilePath.md)
......@@ -115,16 +116,16 @@
* [设置](api/other/setting.md)
* [收货地址](api/other/choose-address.md)
* [获取发票抬头](api/other/invoice-title.md)
* [小程序跳转](api/other/open-miniprogram.md)
* [账号信息](api/other/getAccountInfoSync.md)
* [生物认证(指纹及人脸识别)](api/other/authentication.md)
* [小程序跳转](api/other/open-miniprogram.md)
* [账号信息](api/other/getAccountInfoSync.md)
* [生物认证(指纹及人脸识别)](api/other/authentication.md)
* [运动(计步器)](api/other/sport.md)
* [统计](api/other/report.md)
* [统计](api/other/report.md)
* [卡券](api/other/card.md)
* [模板消息](api/other/template.md)
* [小程序更新](api/other/update.md)
* [调试](api/other/set-enable-debug.md)
* [获取第三方平台数据](api/other/get-extconfig.md)
* [获取第三方平台数据](api/other/get-extconfig.md)
* [广告](api/other/advertisement.md)
<li></li>
<div class="contact-box">
......@@ -145,43 +146,44 @@
<div class="contact-item">
<img src="//img-cdn-qiniu.dcloud.net.cn/uniapp/doc/qq@2x.png" width="20" height="20"/>
<div class="contact-smg">
<div>官方QQ交流群</div>
<div>群26:147867597 &nbsp;<a target="_blank" href="//shang.qq.com/wpa/qunwpa?idkey=28a1a9a3e8f1866ee6a5f2b1caba05039e30d3ae1461e64b2ec31c095fcab951">点此加入</a></div>
<div>群35:713420817(2000人已满)</div>
<div>群34:530305531(2000人已满)</div>
<div>群33:498071674(2000人已满)</div>
<div>群32:166188631(500人已满)</div>
<div>群31:567471669(500人已满)</div>
<div>群30:371046920(500人已满)</div>
<div>群29:202965481(500人已满)</div>
<div>群28:166188776(2000人已满 </div>
<div>群27:811363410(2000人已满 </div>
<!-- <div>群26:147867597(2000人已满)</div> -->
<div>群25:165297000(500人已满)</div>
<div>群24:672494800(500人已满)</div>
<div>群23:599958679(500人已满)</div>
<div>群22:687186952(1000人已满)</div>
<div>群21:717019120(2000人已满)</div>
<div>群20:165796402(500人已满)</div>
<div>群19:165657124(1000人已满)</div>
<div>群18:698592271(500人已满)</div>
<div>群17:951348804(1000人已满)</div>
<div>群16:719211033(1000人已满)</div>
<div>群15:516984120(500人已满)</div>
<div>群14:465953250(500人已满)</div>
<div>群13:699478442(500人已满)</div>
<div>群12:884860657(500人已满)</div>
<div>群11:296811328(1000人已满)</div>
<div>群10:959059626(2000人已满)</div>
<div>群9:775128777(500人已满)</div>
<div>群8:695442854(500人已满)</div>
<div>群7:942061423(500人已满)</div>
<div>群6:697264024(2000人已满)</div>
<div>群5:731951419(500人已满)</div>
<div>群4:942702595(1000人已满)</div>
<div>群3:773794803(1000人已满) </div>
<div>群2:901474938(1000人已满) </div>
<div>群1:531031261(1000人已满)</div>
<div>官方QQ交流群</div>
<div>群26:147867597 &nbsp;<a target="_blank" href="//shang.qq.com/wpa/qunwpa?id
=28a1a9a3e8f1866ee6a5f2b1caba05039e30d3ae1461e64b2ec31c095fcab951">点此加入</a></div>
<div>群35:713420817(2000人已满)</div>
<div>群34:530305531(2000人已满)</div>
<div>群33:498071674(2000人已满)</div>
<div>群32:166188631(500人已满)</div>
<div>群31:567471669(500人已满)</div>
<div>群30:371046920(500人已满)</div>
<div>群29:202965481(500人已满)</div>
<div>群28:166188776(2000人已满 </div>
<div>群27:811363410(2000人已满 </div>
<!-- <div>群26:147867597(2000人已满)</div> -->
<div>群25:165297000(500人已满)</div>
<div>群24:672494800(500人已满)</div>
<div>群23:599958679(500人已满)</div>
<div>群22:687186952(1000人已满)</div>
<div>群21:717019120(2000人已满)</div>
<div>群20:165796402(500人已满)</div>
<div>群19:165657124(1000人已满)</div>
<div>群18:698592271(500人已满)</div>
<div>群17:951348804(1000人已满)</div>
<div>群16:719211033(1000人已满)</div>
<div>群15:516984120(500人已满)</div>
<div>群14:465953250(500人已满)</div>
<div>群13:699478442(500人已满)</div>
<div>群12:884860657(500人已满)</div>
<div>群11:296811328(1000人已满)</div>
<div>群10:959059626(2000人已满)</div>
<div>群9:775128777(500人已满)</div>
<div>群8:695442854(500人已满)</div>
<div>群7:942061423(500人已满)</div>
<div>群6:697264024(2000人已满)</div>
<div>群5:731951419(500人已满)</div>
<div>群4:942702595(1000人已满)</div>
<div>群3:773794803(1000人已满) </div>
<div>群2:901474938(1000人已满) </div>
<div>群1:531031261(1000人已满)</div>
</div>
</div>
<div class="contact-item">
......@@ -191,4 +193,4 @@
<img src="https://img-cdn-qiniu.dcloud.net.cn/uniapp/doc/weixin.jpg" width="90" height="90"/>
</div>
</div>
</div>
\ No newline at end of file
</div>
#### uni.hideKeyboard()
#### uni.hideKeyboard()
隐藏软键盘
隐藏软键盘
隐藏已经显示的软键盘,如果软键盘没有显示则不做任何操作。
**平台差异说明**
......@@ -10,8 +10,8 @@
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|√|x|√|√|
#### uni.onKeyboardHeightChange(CALLBACK)
#### uni.onKeyboardHeightChange(CALLBACK)
监听键盘高度变化
......@@ -19,18 +19,18 @@
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|HBuilderX 2.2.2+|x|基础库2.7+|x|x|x|√|
|HBuilderX 2.2.3+|x|基础库2.7+|x|x|x|√|
**CALLBACK 返回参数**
|参数|类型|说明|
|:-|:-|:-|
|height|Number|键盘高度|
**示例代码**
```js
uni.onKeyboardHeightChange(res => {
console.log(res.height)
})
```
|height|Number|键盘高度|
**示例代码**
```js
uni.onKeyboardHeightChange(res => {
console.log(res.height)
})
```
......@@ -67,9 +67,9 @@ uni.getLocation({
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|√|√|x|
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|√|√|x|x|
**OBJECT 参数说明**
......@@ -81,8 +81,9 @@ uni.getLocation({
|complete|Function|否|接口调用结束的回调函数(调用成功、失败都会执行)|
**注意**
- keyword参数,HBuilderX 2.1.4 以后版本支持
- 因平台差异,如果SDK配置百度地图,需要设置keyword,才能显示相关地点
- nvue下只支持高德地图,不支持百度地图
- 纯nvue项目(manifest中renderer为native),暂不支持此API。可自行基于map组件封装。
**success 返回参数说明**
......@@ -111,4 +112,3 @@ uni.chooseLocation({
- 不同端,使用地图选择时基于的底层地图引擎不一样,如微信小程序和H5是腾讯地图,App是高德地图,详见地图map组件的使用注意事项
- 微信内置浏览器中可使用微信js sdk,[详见](https://ask.dcloud.net.cn/article/35380)
- chooseLocation属于封装型API,开发者若觉得不够灵活,可自行基于原始的map组件进行封装
- HBuilderX 1.9.2的Android平台chooseLocation失效,请更新到更高版本。
\ No newline at end of file
......@@ -3,9 +3,9 @@
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|√|√|x|
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|√|√|x|x|
mapContext
......
### uni.openLocation(OBJECT)
使用应用内置地图查看位置。
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|√|√|√|x|
**OBJECT 参数说明**
|参数名|类型|必填|说明|平台差异说明|
......@@ -38,6 +44,7 @@ uni.getLocation({
- 本API是一个非原子的封装界面,开发者如有定制需求,可自己做页面实现类似功能。
- H5 端获取定位信息,需要部署在 **https** 服务上,本地预览(localhost)仍然可以使用 http 协议。
- 无 GPS 模块的 PC 设备使用 Chrome 浏览器的时候,位置信息是连接谷歌服务器获取的,国内用户可能获取位置信息失败。
- 纯nvue项目(manifest中renderer为native),App端暂不支持此API。可自行基于map组件封装。
- ``<map>`` 组件默认为国测局坐标,调用 ``uni.getLocation`` 返回结果传递给 ``<map>`` 组件时,需指定 type 为 gcj02。
- App 端使用地图组件需要向高德或百度等三方服务商申请SDK资质,获取AppKey,打包时需要在manifest的SDK配置中填写Appkey。在manifest可视化界面有详细申请指南。
- iOS端 如需使用第三方地图进行导航,需要在 manifest.json 文件内增加 ``urlschemewhitelist`` 节点,在线打包即可
......@@ -55,6 +62,6 @@ uni.getLocation({
}
}
}
```
- 点击返回也会进入 `fail` 回调中
\ No newline at end of file
```
- 点击返回也会进入 `fail` 回调中
......@@ -4,9 +4,9 @@
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|x|x|√|x|√|√|
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|x|x|√|x|√|√|√|
**OBJECT 参数说明**
......@@ -23,14 +23,16 @@
|---|---|---|---|
|scope.userInfo |[uni.getUserInfo](/api/plugins/login?id=getuserinfo) |用户信息||
|scope.userLocation|[uni.getLocation](/api/location/location?id=getlocation), [uni.chooseLocation](/api/location/location?id=chooselocation) |地理位置||
|scope.address |[uni.chooseAddress](/api/other/choose-address) |收货地址||
|scope.invoiceTitle|[uni.chooseInvoiceTitle](/api/other/invoice-title) |发票抬头||
|scope.userLocationBackground|wx.userLocationBackground|后台定位|微信小程序|
|scope.address |[uni.chooseAddress](/api/other/choose-address) |通信地址||
|scope.record |[uni.getRecorderManager](/api/media/record-manager?id=getrecordermanager) |录音功能||
|scope.writePhotosAlbum |[uni.saveImageToPhotosAlbum](/api/media/image?id=saveimagetophotosalbum), [uni.saveVideoToPhotosAlbum](/api/media/video?id=savevideotophotosalbum) |保存到相册||
|scope.camera |[``<camera />``](/component/camera) 组件 |摄像头 |微信小程序|
|scope.invoice |[wx.chooseInvoice](https://developers.weixin.qq.com/miniprogram/dev/api/wx.chooseInvoice.html) |获取发票|微信小程序|
|scope.writePhotosAlbum |[uni.saveImageToPhotosAlbum](/api/media/image?id=saveimagetophotosalbum), [uni.saveVideoToPhotosAlbum](/api/media/video?id=savevideotophotosalbum) |保存到相册|头条小程序的返回值是scope.album|
|scope.camera |[``<camera />``](/component/camera) 组件,头条下的扫码、拍照、选择相册 |摄像头 ||
|scope.invoice |[wx.chooseInvoice](https://developers.weixin.qq.com/miniprogram/dev/api/wx.chooseInvoice.html) |获取发票|微信小程序、QQ小程序|
|scope.invoiceTitle|[uni.chooseInvoiceTitle](/api/other/invoice-title) |发票抬头|微信小程序、百度小程序、QQ小程序|
|scope.werun |[wx.getWeRunData](https://developers.weixin.qq.com/miniprogram/dev/api/wx.getWeRunData.html) |微信运动步数 |微信小程序|
**代码示例**
```javascript
......@@ -40,4 +42,4 @@ uni.authorize({
uni.getLocation()
}
})
```
\ No newline at end of file
```
#### wx.getAccountInfoSync()
#### uni.getAccountInfoSync()
获取当前帐号信息,可以返回小程序的Appid。如果使用了微信小程序的云端插件,还可以反馈插件的id和版本
仅微信小程序平台支持,[规范详情](https://developers.weixin.qq.com/miniprogram/dev/api/wx.getAccountInfoSync.html)
\ No newline at end of file
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|x|x|√|x|√|x|
**返回值**
**Object**
帐号信息
| 属性 | 类型 | 说明 |
| --- | --- | --- |
| miniProgram | Object| 小程序帐号信息 |
| plugin | Object | 插件帐号信息(仅在插件中调用时包含这一项) |
| appName | string| 智能小程序名称 (仅百度小程序支持) |
| lastAppURL | string| 智能小程序最近一次打开的调起协议 (仅百度小程序支持) |
| scheme | string| 调起协议的协议头 (仅百度小程序支持) |
**miniProgram 的结构**
| 属性 | 类型 | 说明 |
| --- | --- | --- |
| appId | string | 小程序 appId |
**plugin 的结构**
| 属性 | 类型 | 说明 |
| --- | --- | --- |
| appId | string | 插件 appId (百度小程序不支持) |
| version | string | 插件版本号 |
**示例代码**
```js
const accountInfo = uni.getAccountInfoSync();
console.log(accountInfo.miniProgram.appId); // 小程序 appId
console.log(accountInfo.plugin.appId); // 插件 appId
console.log(accountInfo.plugin.version); // 插件版本号, 'a.b.c' 这样的形式
```
......@@ -4,9 +4,12 @@
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|x|x|√|√|√|x|
|App|H5|[微信小程序](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/miniprogram-navigate/wx.navigateToMiniProgram.html)|[支付宝小程序](https://docs.alipay.com/mini/api/zwi8gx)|[百度小程序](https://smartprogram.baidu.com/docs/develop/api/open_smartprogram/#swan-navigateToSmartProgram/)|[头条小程序](https://developer.toutiao.com/docs/open/navigateToMiniProgram.html)|[QQ小程序](https://q.qq.com/wiki/develop/miniprogram/API/open_port/port_change.html#qq-navigatetominiprogram)|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|x(见下)|x|√|√|√|√(1.15.0+)|√|
- App平台打开微信小程序,使用plus.share的[launchMiniProgram](https://www.html5plus.org/doc/zh_cn/share.html#plus.share.ShareService.launchMiniProgram)。注意uni-app不需要plus ready,将plus ready里的代码写到页面的onLoad生命周期即可。使用此功能需在manifest中配置微信分享SDK信息,打包后生效。
- 各小程序平台对跳转到其他小程序有一些限制和规定,需要遵守,具体见各平台文档。
**OBJECT 参数说明**
......@@ -35,15 +38,17 @@ uni.navigateToMiniProgram({
})
```
### uni.navigateBackMiniProgram(OBJECT)
跳转回上一个小程序,只有当另一个小程序跳转到当前小程序时才会能调用成功。
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|x|x|√|√|√|x|
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|x|x|√|√|√|√|√|
**OBJECT参数说明**
......@@ -63,4 +68,4 @@ uni.navigateBackMiniProgram({
// 返回成功
}
})
```
\ No newline at end of file
```
#### 统计
各平台开发方式暂未统一,使用时需注意用[条件编译](https://uniapp.dcloud.io/platform)调用不同平台的代码。
#### 统计
从uni-app 2.2.3起,支持uni统计。一张报表,掌握全端数据。业务介绍详见[https://tongji.dcloud.net.cn](https://tongji.dcloud.net.cn)
自定义事件是统计中不可获取的功能。开发者可通过本API自定义上报统计数据,如统计登录、注册、点击某个按钮,我们都可以称之为自定义事件。
##### uni.report( eventName , options)
**参数说明**
|参数 |类型 |描述 |
|--- |--- |--- |
|eventName|String |事件名称,最大长度不超过 255 个字符 |
|options |String 、 Object |事件参数 |
Tips
- eventName 为 String 类型,并且字符长度必须小于255
- options 为 String 类型时,字符长度必须小于255
- options 为 Object 类型时,该对象的值只能为 String 类型
- 字符串支持特殊字符但不包括(英文逗号 , 英文冒号 : 点 .)
- eventName 为 `title` 时为内容标题上报,用户不能自定义。此时数据会展现在uni统计的首页-内容统计及左侧导航的内容统计中。方便查看内容页数据。
- 用户在使用 `uni.login()` 会执行登录事件,不携带参数。如果如需上报携带具体参数的数据,需要手动调用 `uni.report('login',{...})`
- 用户在使用 `uni.share()` 或触发 `onShareAppMessage` 会执行分享事件,不携带参数。如果如需上报携带具体参数的数据,需要手动调用 `uni.report('share',{...})`
- 用户在使用 `uni.requestPayment()` 会执行支付事件,不携带参数。如果如需上报携带具体参数的数据,需要手动调用 `uni.report('pay_success',{...})``uni.report('pay_fail',{...})`
**示例**
```javascript
// 内容统计
// 当 eventName 为 title 时,options 只能为 String 类型
uni.report('title','首页')
// 登录
uni.report('lgoin',{
'name':'uni-app',
'age':'21',
// ...
})
// 分享
uni.report('share','分享')
// 支付成功
uni.report('pay_success','支付成功')
// or
uni.report('pay_success',{
"订单金额":'20元',
"订单名称":'鼠标',
// ...
})
// 支付失败
uni.report('pay_fail','支付失败')
// or
uni.report('pay_fail',{
"订单金额":'20元',
"订单名称":'鼠标',
// ...
})
// 注册
uni.report('register',{
'name':'uni-app',
'age':'21',
// ...
})
// 搜索
uni.report('search','搜索内容')
// or
uni.report('search',{
'内容':'搜索内容'
})
```
自定义事件上报后,在统计后台的`事件和转换`栏目中,可以看到上报的事件情况。
**TIPS:**
- 小程序平台,需将`tongji.dcloud.net.cn`配入域名白名单,[详见](https://ask.dcloud.net.cn/article/36298)
- uni统计使用教程:[https://ask.dcloud.net.cn/article/36303](https://ask.dcloud.net.cn/article/36303)
除了官方的uni统计,如果开发者还需要调用小程序平台的自定义统计,给小程序的后台上报数据,那么需使用条件编译,在各端调用此自己的API。
##### 微信小程序平台:
- 数据上报:[wx.reportMonitor](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/report/wx.reportMonitor.html)
- 数据分析:[wx.reportAnalytics](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/data-analysis/wx.reportAnalytics.html)
- 数据分析:[wx.reportAnalytics](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/data-analysis/wx.reportAnalytics.html)
##### 支付宝小程序平台:
- 自定义分析数据的上报接口:[my.reportAnalytics](https://docs.alipay.com/mini/api/report)
##### 百度小程序平台:
- 数据分析:[swan.reportAnalytics](https://smartprogram.baidu.com/docs/develop/api/data/#swan-reportAnalytics/)
##### App平台:
App平台有DCloud统计服务和友盟统计这两种。
- DCloud统计:[https://dcloud.io/unistat.html](https://dcloud.io/unistat.html)
- 友盟统计:[开发规范](http://www.html5plus.org/doc/zh_cn/statistic.html)[配置文档](https://ask.dcloud.net.cn/article/74)
\ No newline at end of file
##### 头条小程序平台:
- [reportAnalytics](https://developer.toutiao.com/docs/open/reportAnalytics.html)
##### QQ小程序平台:
- 数据上报:[qq.reportMonitor](https://q.qq.com/wiki/develop/miniprogram/API/open_port/port_dataup.html)
- 数据分析:[qq.reportAnalytics](https://q.qq.com/wiki/develop/miniprogram/API/open_port/port_dataanalysis.html#qq-reportanalytics)
##### App平台的友盟统计:
- 友盟统计:[开发规范](http://www.html5plus.org/doc/zh_cn/statistic.html)[配置文档](https://ask.dcloud.net.cn/article/74)
......@@ -4,9 +4,9 @@
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|x|x|√|√|√|√|
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|x|x|√|√|√|√|√|
|属性|类型|必填|说明|
|---|---|---|---|---|
......@@ -35,9 +35,9 @@ uni.openSetting({
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|
|:-:|:-:|:-:|:-:|:-:|
|x|x|√|√|√|
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|x|x|√|√|√|√|√|
|属性|类型|必填|说明|
|---|---|---|---|---|
......
#### sport 运动
#### sport 运动
此功能为计步器,用于获取手机用户的运动步数。
仅微信小程序平台、App平台支持,各平台开发方式暂未统一,使用时需注意用[条件编译](https://uniapp.dcloud.io/platform)调用不同平台的代码。
- 微信小程序平台:[规范详情](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/werun/wx.getWeRunData.html)
- App 平台:需使用原生插件,详见[计步器插件](https://ext.dcloud.net.cn/search?q=%E8%AE%A1%E6%AD%A5%E5%99%A8)
\ No newline at end of file
各平台开发方式暂未统一,使用时需注意用[条件编译](https://uniapp.dcloud.io/platform)调用不同平台的代码。
- App 平台:需使用原生插件,详见[计步器插件](https://ext.dcloud.net.cn/search?q=%E8%AE%A1%E6%AD%A5%E5%99%A8)
- 微信小程序平台:[规范详情](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/werun/wx.getWeRunData.html)
- 支付宝小程序平台:[规范详情](https://docs.alipay.com/mini/api/gxuu7v)
......@@ -47,29 +47,15 @@ var socketTask = uni.connectSocket({
如果没有传入 success / fail / complete 参数,则会返回封装后的 Promise 对象:[Promise 封装](/api/README?id=promise-%E5%B0%81%E8%A3%85)
**注意事项**
- 网络请求的 ``超时时间`` 可以统一在 ``manifest.json`` 中配置 [networkTimeout](/collocation/manifest?id=networktimeout)
- 目前不支持 ``ArrayBuffer`` 类型的数据收发,可以使用 [plus-websocket](http://ext.dcloud.net.cn/plugin?id=647) 插件替代。
- 自定义组件模式下是基于 `weex``v8` 引擎运行,所有 `vue` 页面的 `js` 都是在同一个 `weex``js` 环境中运行。目前 `weex` 限制一个 `js` 环境中只支持一个 `websocket` 连接,所以导致所有 `vue` 页面只能使用一个 `websocket` 连接。
**临时解决方案:**
- 回退使用非自定义组件模式(不推荐)
- 多个 websocket 在独立的 nvue 页面中使用
- 使用 [plus-websocket](http://ext.dcloud.net.cn/plugin?id=647) 插件替代
后续我们会修改 `weex` 的限制,以支持多个 `websocket` 连接
**注意事项**
- 网络请求的 ``超时时间`` 可以统一在 ``manifest.json`` 中配置 [networkTimeout](/collocation/manifest?id=networktimeout)
- App目前不支持 ``ArrayBuffer`` 类型的数据收发。可以使用 [plus-websocket](https://ext.dcloud.net.cn/plugin?id=647) 插件替代。
- 自定义组件模式下所有 `vue` 页面只能使用一个 `websocket` 连接。可以使用 [plus-websocket](https://ext.dcloud.net.cn/plugin?id=647) 插件替代。
### uni.onSocketOpen(CALLBACK)
监听WebSocket连接打开事件。
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|√|√|√|
**CALLBACK 返回参数**
|属性|类型|说明|
......@@ -91,12 +77,6 @@ uni.onSocketOpen(function (res) {
### uni.onSocketError(CALLBACK)
监听WebSocket错误。
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|√|√|√|
**示例代码**
```javascript
......@@ -114,12 +94,6 @@ uni.onSocketError(function (res) {
### uni.sendSocketMessage(OBJECT)
通过 WebSocket 连接发送数据,需要先 [uni.connectSocket](/api/request/websocket?id=connectsocket),并在 [uni.onSocketOpen](/api/request/websocket?id=onsocketopen) 回调之后才能发送。
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|√|√|√|
**OBJECT 参数说明:**
|参数名|类型|必填|说明|
......@@ -161,12 +135,6 @@ function sendSocketMessage(msg) {
### uni.onSocketMessage(CALLBACK)
监听WebSocket接受到服务器的消息事件。
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|√|√|√|
**CALLBACK 返回参数**
|参数|类型|说明|
......@@ -188,12 +156,6 @@ uni.onSocketMessage(function (res) {
### uni.closeSocket(OBJECT)
关闭 WebSocket 连接。
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|√|√|√|
**OBJECT 参数说明**
|参数名|类型|必填|说明|
......@@ -207,12 +169,6 @@ uni.onSocketMessage(function (res) {
### uni.onSocketClose(CALLBACK)
监听WebSocket关闭。
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|√|√|√|
```javascript
uni.connectSocket({
url: 'wss://www.example.com/socket'
......
......@@ -3,16 +3,16 @@
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|x|√|√|√|√|
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|√|x|√|√|√|√|√|
**OBJECT 参数说明**
|参数名|类型|必填|说明|平台差异说明|
|:-|:-|:-|:-|:-:|
|onlyFromCamera|Boolean|否|是否只能从相机扫码,不允许从相册选择图片|头条小程序不支持|
|scanType|Array|否|扫码类型,参数类型是数组,二维码是'qrCode',一维码是'barCode',DataMatrix是‘datamatrix’,pdf417是‘pdf417’。|头条小程序不支持|
|onlyFromCamera|Boolean|否|是否只能从相机扫码,不允许从相册选择图片|头条小程序不支持此参数|
|scanType|Array|否|扫码类型,参数类型是数组,二维码是'qrCode',一维码是'barCode',DataMatrix是‘datamatrix’,pdf417是‘pdf417’。|头条小程序不支持此参数,支付宝只支持条码和二维码|
|success|Function|否|接口调用成功的回调,返回内容详见返回参数说明。||
|fail|Function|否|接口调用失败的回调函数(识别失败、用户取消等情况下触发)||
|complete|Function|否|接口调用结束的回调函数(调用成功、失败都会执行)|&nbsp;|
......@@ -22,9 +22,9 @@
|参数|说明|平台差异说明|
|:-|:-|:-|
|result|所扫码的内容||
|scanType|所扫码的类型|5+App、微信小程序、百度小程序|
|charSet|所扫码的字符集|5+App、微信小程序、百度小程序|
|path|当所扫的码为当前应用的合法二维码时,会返回此字段,内容为二维码携带的 path。|5+App、微信小程序、百度小程序|
|scanType|所扫码的类型|5+App、微信小程序、百度小程序、QQ小程序|
|charSet|所扫码的字符集|5+App、微信小程序、百度小程序、QQ小程序|
|path|当所扫的码为当前应用的合法二维码时,会返回此字段,内容为二维码携带的 path。|5+App、微信小程序、百度小程序、QQ小程序|
**示例**
......@@ -44,11 +44,24 @@ uni.scanCode({
console.log('条码类型:' + res.scanType);
console.log('条码内容:' + res.result);
}
});
// 调起条码扫描
uni.scanCode({
scanType: 'barCode',
success: function (res) {
console.log('条码类型:' + res.scanType);
console.log('条码内容:' + res.result);
}
});
```
**Tip**
- App端如果想自定义扫码,可参考[uni-app中如何使用5+的原生界面控件](http://ask.dcloud.net.cn/article/35036)[plus.barcode API](https://www.html5plus.org/doc/zh_cn/barcode.html)
- 微信内嵌浏览器运行H5版时,可通过js sdk实现扫码,需要引入一个单独的js,[详见](https://ask.dcloud.net.cn/article/35380)
- 点击返回也会进入 `fail` 回调中
\ No newline at end of file
- App-vue如果想自定义扫码,可参考[uni-app中如何使用5+的原生界面控件](http://ask.dcloud.net.cn/article/35036)[plus.barcode API](https://www.html5plus.org/doc/zh_cn/barcode.html)
- App-nvue,支持barcode组件,可自定义扫码界面。[详见](https://uniapp.dcloud.io/component/barcode)
- 微信小程序自定义扫码界面,可使用camera组件。[详见](https://uniapp.dcloud.io/component/camera)
- App下纯nvue项目(manifest中renderer为native),不支持此API,请使用barcode组件来替代。
- 微信内嵌浏览器运行H5版时,可通过js sdk实现扫码,需要引入一个单独的js,[详见](https://ask.dcloud.net.cn/article/35380)
- 在扫码界面点击返回也会进入 `fail` 回调中
- 支付宝小程序不支持 `success` 回调中的 `scanType``charSet``path`
#### 电量
仅微信小程序平台支持,[规范详情](https://developers.weixin.qq.com/miniprogram/dev/api/wx.getBatteryInfoSync.html)
\ No newline at end of file
电量API暂未统一,需分平台条件编译编写。
- 微信小程序平台:[规范详情](https://developers.weixin.qq.com/miniprogram/dev/api/wx.getBatteryInfoSync.html)
- 百度小程序平台:[规范详情](https://smartprogram.baidu.com/docs/develop/api/device_battery/#swan-getBatteryInfo/)
- 支付宝小程序平台:[规范详情](https://docs.alipay.com/mini/api/nrnziy)
- QQ小程序平台:[规范详情](https://q.qq.com/wiki/develop/miniprogram/API/equipment/ibeacon_battery.html)
**低功耗蓝牙 API 平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|
|:-:|:-:|:-:|:-:|:-:|
|√|x|√|√|x|
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|√|x|√|√|x|x|x|
### uni.writeBLECharacteristicValue(OBJECT)
......@@ -436,4 +436,4 @@ uni.closeBLEConnection({
console.log(res)
}
})
```
\ No newline at end of file
```
**蓝牙 API 平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|x|√|√|x|x|
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|√|x|√|√|x|x|x|
### uni.openBluetoothAdapter(OBJECT)
......@@ -406,4 +406,4 @@ uni.closeBluetoothAdapter({
console.log(res)
}
})
```
\ No newline at end of file
```
......@@ -3,9 +3,9 @@
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|x|√|√|√|x|
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|√|x|√|√|√|x|√|
**OBJECT 参数说明**
......@@ -32,9 +32,9 @@ uni.setScreenBrightness({
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|x|√|√|√|x|
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|√|x|√|√|√|x|√|
**OBJECT 参数说明**
......@@ -65,9 +65,9 @@ uni.getScreenBrightness({
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|x|√|√|√|√|
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|√|x|√|√|√|√|√|
**OBJECT 参数说明**
......@@ -91,5 +91,5 @@ uni.getScreenBrightness({
uni.setKeepScreenOn({
keepScreenOn: true
});
```
```
......@@ -4,9 +4,9 @@
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|x|x|√|√|√|x|
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|x|x|√|√|√|x|√|
**CALLBACK返回参数:**
......@@ -18,4 +18,4 @@
uni.onUserCaptureScreen(function() {
console.log('用户截屏了')
});
```
\ No newline at end of file
```
**剪贴板 API 平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|
|:-:|:-:|:-:|:-:|:-:|
|√|x|√|√|√|
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|√|x|√|√|√|√|√|
### uni.setClipboardData(OBJECT)
设置系统剪贴板的内容。
......@@ -55,5 +55,5 @@ uni.getClipboardData({
#### **注意**
- 设置剪贴板内容后,小程序平台会自动弹出轻提示。App平台默认与小程序保持一致策略。如不希望在App平台弹出提示,可使用Native.js自行操作剪贴板,[http://ask.dcloud.net.cn/question/2034](http://ask.dcloud.net.cn/question/2034)
- H5的复制粘贴,可去插件市场搜索[剪贴板](https://ext.dcloud.net.cn/search?q=%E5%89%AA%E8%B4%B4%E6%9D%BF)
\ No newline at end of file
- 设置剪贴板内容后,小程序平台会自动弹出轻提示。App平台默认与小程序保持一致策略。如不希望在App平台弹出提示,可使用Native.js自行操作剪贴板,插件市场有封装好的示例[https://ext.dcloud.net.cn/plugin?id=712](https://ext.dcloud.net.cn/plugin?id=712)
- H5的复制粘贴,可去插件市场搜索[剪贴板](https://ext.dcloud.net.cn/search?q=%E5%89%AA%E8%B4%B4%E6%9D%BF)
......@@ -23,9 +23,9 @@ uni.onCompassChange(function (res) {
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|x|√|√|
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|x|√|√|√|
**OBJECT 参数说明**
......@@ -56,4 +56,4 @@ uni.startCompass();
```javascript
uni.stopCompass();
```
\ No newline at end of file
```
### uni.addPhoneContact(OBJECT)
调用后,用户可以选择将该表单以“新增联系人”或“添加到已有联系人”的方式(APP端目前没有选择步骤,将直接写入),写入手机系统通讯录,完成手机通讯录联系人和联系方式的增加。
App平台提供了更多通讯录相关API,详见:[https://www.html5plus.org/doc/zh_cn/contacts.html](https://www.html5plus.org/doc/zh_cn/contacts.html)
App平台提供了更多通讯录相关API,包括读取联系人,详见:[https://www.html5plus.org/doc/zh_cn/contacts.html](https://www.html5plus.org/doc/zh_cn/contacts.html)
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|x|√|√|√|x|
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|√|x|√|√|√|x|x|
**OBJECT 参数说明**
......
#### 设备方向
#### 监听设备方向变化
仅微信小程序平台支持,[规范详情](https://developers.weixin.qq.com/miniprogram/dev/api/device/motion/wx.startDeviceMotionListening.html)
在App平台,也可以通过监听窗体大小变化onResize来实现此类需求。[详见](https://uniapp.dcloud.io/collocation/frame/lifetime?id=%e9%a1%b5%e9%9d%a2%e7%94%9f%e5%91%bd%e5%91%a8%e6%9c%9f)
**iBeacon API 平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|
|:-:|:-:|:-:|:-:|:-:|
|√|x|√|√|x|
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|√|x|√|√|x|x|x|
### uni.onBeaconServiceChange(CALLBACK)
......@@ -116,4 +116,4 @@ uni.startBeaconDiscovery({
|minor|string|iBeacon 设备的次 id|
|proximity|number|表示设备距离的枚举值|
|accuracy|number|iBeacon 设备的距离|
|rssi|number|表示设备的信号强度|
\ No newline at end of file
|rssi|number|表示设备的信号强度|
......@@ -13,7 +13,7 @@
|参数|说明|平台差异说明|
|:-|:-|:-|
|brand|手机品牌|微信小程序、百度小程序、头条小程序、QQ小程序|
|brand|手机品牌|5+App、微信小程序、百度小程序、头条小程序、QQ小程序|
|model|手机型号||
|pixelRatio|设备像素比||
|screenWidth|屏幕宽度||
......@@ -91,7 +91,7 @@ uni.getSystemInfo({
|参数|说明|平台差异说明|
|:-|:-|:-|
|brand|手机品牌|微信小程序、百度小程序、头条小程序、QQ小程序|
|brand|手机品牌|5+App、微信小程序、百度小程序、头条小程序、QQ小程序|
|model|手机型号||
|pixelRatio|设备像素比||
|screenWidth|屏幕宽度||
......
......@@ -6,9 +6,9 @@
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|x|x|√|x|√|x|
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|x|x|√|x|√|x|√|
**CALLBACK返回参数:**
......@@ -30,4 +30,4 @@
uni.onMemoryWarning(function () {
console.log('onMemoryWarningReceive')
})
```
\ No newline at end of file
```
### uni.vibrate(OBJECT)
使手机发生振动。
**OBJECT 参数说明**
|参数名|类型|必填|说明|
|:-|:-|:-|:-|
|success|Function|否|接口调用成功的回调|
|fail|Function|否|接口调用失败的回调函数|
|complete|Function|否|接口调用结束的回调函数(调用成功、失败都会执行)|
**示例**
```javascript
uni.vibrate({
success: function () {
console.log('success');
}
});
```
### uni.vibrateLong(OBJECT)
使手机发生较长时间的振动(400ms)。
......@@ -42,4 +63,5 @@ uni.vibrateShort({
**注意**
- iOS上只有长震动,没有短震动
- iOS上需要手机设置“打开响铃时震动”或“静音时震动”,否则无法震动
\ No newline at end of file
- iOS上需要手机设置“打开响铃时震动”或“静音时震动”,否则无法震动
- vibrate只适用于钉钉小程序、支付宝小程序
\ No newline at end of file
#### Wi-Fi
仅微信小程序平台、App平台支持,各平台开发方式暂未统一,使用时需注意用[条件编译](https://uniapp.dcloud.io/platform)调用不同平台的代码。
仅微信小程序平台、App平台、头条小程序支持,各平台开发方式暂未统一,使用时需注意用[条件编译](https://uniapp.dcloud.io/platform)调用不同平台的代码。
微信小程序平台实现参考:[规范详情](https://developers.weixin.qq.com/miniprogram/dev/api/wx.startWifi.html)
头条小程序的wifi API参考:[规范详情](https://developer.toutiao.com/docs/api/getConnectedWifi.html)
App 平台实现参考
......@@ -11,4 +12,4 @@ App 平台实现参考
- [获取WIFI列表](https://ask.dcloud.net.cn/question/12113)
**ios:**
- [打开ios的WIFI设置页面](https://ask.dcloud.net.cn/question/7797)
\ No newline at end of file
- [打开ios的WIFI设置页面](https://ask.dcloud.net.cn/question/7797)
......@@ -15,9 +15,9 @@
|backgroundColor|String||否|窗口的背景色,必须为十六进制颜色值|
|backgroundColorTop|String||否|顶部窗口的背景色,必须为十六进制颜色值,仅 iOS 支持|
|backgroundColorBottom|String||否|底部窗口的背景色,必须为十六进制颜色值,仅 iOS 支持|
|success|Funtion||否|接口调用成功的回调函数|
|fail|Funtion||否|接口调用失败的回调函数|
|complete|Funtion||否|接口调用结束的回调函数(调用成功、失败都会执行)|
|success|Function||否|接口调用成功的回调函数|
|fail|Function||否|接口调用失败的回调函数|
|complete|Function||否|接口调用结束的回调函数(调用成功、失败都会执行)|
**代码示例**
......@@ -42,11 +42,11 @@ uni.setBackgroundColor({
**参数说明**
|属性|类型|必填|说明|
|:-|:-|:-|:-|:-|
|:-|:-|:-|:-|
|textStyle|String|是|下拉背景字体、loading 图的样式,值为:dark、light|
|success|Funtion|否|接口调用成功的回调函数|
|fail|Funtion|否|接口调用失败的回调函数|
|complete|Funtion|否|接口调用结束的回调函数(调用成功、失败都会执行)|
|success|Function|否|接口调用成功的回调函数|
|fail|Function|否|接口调用失败的回调函数|
|complete|Function|否|接口调用结束的回调函数(调用成功、失败都会执行)|
**代码示例**
......@@ -54,4 +54,4 @@ uni.setBackgroundColor({
uni.setBackgroundTextStyle({
textStyle: 'dark' // 下拉背景字体、loading 图的样式为dark
})
```
\ No newline at end of file
```
......@@ -3,12 +3,6 @@
### uni.createIntersectionObserver([this], [options])
创建并返回一个 ``IntersectionObserver`` 对象实例。
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|HBuilderX 2.0.4+|√|√|√|√|
**options 的可选参数为:**
|字段名|类型|说明|
......@@ -133,4 +127,4 @@ uni.createIntersectionObserver(this).relativeTo('.scroll',{bottom: 100}}).observ
}
</style>
```
\ No newline at end of file
```
#### getMenuButtonBoundingClientRect()
#### getMenuButtonBoundingClientRect()
在小程序平台,如果原生导航栏被隐藏,仍然在右上角会有一个悬浮按钮,微信下也被称为胶囊按钮。本API用于获取小程序下该菜单按钮的布局位置信息,方便开发者布局顶部内容时避开该按钮。
坐标信息以屏幕左上角为原点。
坐标信息以屏幕左上角为原点。
各平台开发方式暂未统一,使用时需注意用[条件编译](https://uniapp.dcloud.io/platform)调用不同平台的代码。
微信小程序:[规范详情](https://developers.weixin.qq.com/miniprogram/dev/api/wx.getMenuButtonBoundingClientRect.html)
百度小程序:[规范详情](https://smartprogram.baidu.com/docs/develop/api/menu_info/)
支付宝小程序:其逻辑与微信小程序不同,它提供了菜单点击后按钮的自定义功能,可以选择显示那些系统按钮,[规范详情](https://docs.alipay.com/mini/api/optionmenuitem)
\ No newline at end of file
- 微信小程序:[规范详情](https://developers.weixin.qq.com/miniprogram/dev/api/wx.getMenuButtonBoundingClientRect.html)
- 百度小程序:[规范详情](https://smartprogram.baidu.com/docs/develop/api/menu_info/)
- 支付宝小程序:其逻辑与微信小程序不同,它提供了菜单点击后按钮的自定义功能,可以选择显示那些系统按钮,[规范详情](https://docs.alipay.com/mini/api/optionmenuitem)
- 头条小程序:[规范详情](https://developer.toutiao.com/docs/game/ui/menu/tt.getMenuButtonBoundingClientRect.html)
- QQ小程序:[规范详情](https://q.qq.com/wiki/develop/game/API/interface/menu.html#qq-getmenubuttonboundingclientrect)
#### nextTick(function callback)
延迟一部分操作到下一个时间片再执行。(类似于 setTimeout)
仅微信小程序平台支持,[规范详情](https://developers.weixin.qq.com/miniprogram/dev/api/wx.nextTick.html)
在小程序自定义组件,如wxcomponents中使用。延迟一部分操作到下一个时间片再执行。(类似于 setTimeout) 。其他平台无此概念。
- 微信小程序:[规范详情](https://developers.weixin.qq.com/miniprogram/dev/api/wx.nextTick.html)
- 百度小程序:[规范详情](https://smartprogram.baidu.com/docs/develop/api/custom_component/#swan-nextTick/)
- QQ小程序:[规范详情](https://q.qq.com/wiki/develop/miniprogram/API/interface/interface_nexttick.html#qq-nexttick)
......@@ -7,12 +7,6 @@
### uni.startPullDownRefresh(OBJECT)
开始下拉刷新,调用后触发下拉刷新动画,效果与用户手动下拉刷新一致。
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|x|√|√|
**OBJECT 参数说明**
|参数名|类型|必填|说明|
......@@ -75,12 +69,18 @@ export default {
}
```
**注意**
- 支付宝小程序```startPullDownRefresh```在开发者工具里会提示``暂未开放,请勿使用``
- 支付宝小程序```startPullDownRefresh```请使用真机调试(非真机预览)
- 后续支付宝小程序开发工具更新可能会有所修改
### FAQ
Q:如何暂时禁用掉下拉刷新,待需要的时候再重新开启?
A:`5+App` 平台下可以处理此类场景,详细参考:[uni-app 中实现动态禁用/开启下拉刷新](http://ask.dcloud.net.cn/article/35134)
A:`5+App` 平台下可以处理此类场景,详细参考:[uni-app 中实现动态禁用/开启下拉刷新](https://ask.dcloud.net.cn/article/35134)
Q:自定义title如何让下拉刷新在title之下
A:App和H5端使用circle方式的下拉刷新,设offset在title高度之下。hello uni-app的模板-导航栏中有示例。小程序端无法实现,除非放弃原生下拉刷新,自己模拟。
A:App和H5端使用circle方式的下拉刷新,设offset在title高度之下。hello uni-app的模板-导航栏中有示例。小程序端无法实现,除非放弃原生下拉刷新,自己模拟下拉刷新,插件市场有类似插件,但性能不如原生下拉刷新
Q:如何自定义下拉刷新样式
A:小程序端的原生下拉刷新样式是固定的;App端原生的下拉刷新有2种样式可选择,下拉漏出雪花和下拉circle圈。如果使用nvue,也可以自己实现下拉刷新,都是原生渲染。如果想使用scroll-view在前端实现自定义下拉刷新,需要注意列表不可太长和太复杂,否则会有性能问题。[插件市场](https://ext.dcloud.net.cn/)搜索下拉刷新有示例。
A:小程序端的原生下拉刷新样式是固定的;App端原生的下拉刷新有2种样式可选择,下拉漏出雪花和下拉circle圈。如果使用nvue,可以使用[refresh组件](https://uniapp.dcloud.io/component/refresh)自定义下拉刷新,都是原生渲染。如果想使用scroll-view在前端实现自定义下拉刷新,需要注意列表不可太长和太复杂,否则会有性能问题。[插件市场](https://ext.dcloud.net.cn/)搜索下拉刷新有示例。
......@@ -6,7 +6,7 @@
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|x|√|x|
|√|√|√||√|x|
**OBJECT参数说明:**
......@@ -39,7 +39,7 @@ uni.setTabBarItem({
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|x|√|x|
|√|√|√||√|x|
**OBJECT参数说明:**
......@@ -72,7 +72,7 @@ uni.setTabBarStyle({
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|x|√|x|
|√|√|√||√|x|
**OBJECT参数说明:**
......@@ -91,7 +91,7 @@ uni.setTabBarStyle({
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|x|√|x|
|√|√|√||√|x|
**OBJECT参数说明:**
......@@ -109,7 +109,7 @@ uni.setTabBarStyle({
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|x|√|x|
|√|√|√||√|x|
**OBJECT参数说明:**
......@@ -137,7 +137,7 @@ uni.setTabBarBadge({
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|x|√|x|
|√|√|√||√|x|
**OBJECT参数说明:**
......@@ -155,7 +155,7 @@ uni.setTabBarBadge({
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|x|√|x|
|√|√|√||√|x|
**OBJECT参数说明:**
......@@ -173,7 +173,7 @@ uni.setTabBarBadge({
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|x|√|x|
|√|√|√||√|x|
**OBJECT参数说明:**
......
......@@ -7,7 +7,7 @@
|5+App|H5|微信小程序 |支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|x|x|x|
|√(nvue不支持)|√|√|x|x|x|
**CALLBACK 参数说明**
......@@ -24,6 +24,10 @@ uni.onWindowResize((res) => {
})
```
**TIPS**
- 如App端设置软键盘弹出方式为adjustResize ,则在键盘弹出时,会触发此事件。
- 横竖屏切换时,会触发此事件。
### uni.offWindowResize(CALLBACK)
取消监听窗口尺寸变化事件
......
......@@ -25,6 +25,7 @@ uni-app已经有几十万开发者,创建了几十万个项目,是开发者
</a>
</div>
<!--
<a href="//m3w.cn/__uni__fad3fd9" target="_blank" class="clear-style"><b>图片App模版:</b></a>使用uni-app开发的图片App模版,包含单列图、双列图,图片分类,图片轮播、预览、下载,图片分享、收藏,设置桌面背景图等功能。本项目源码在HBuilderX中新建项目可获得。
<div style="display:flex;justify-content: space-around;">
<a href="//m3w.cn/__uni__fad3fd9" target="_blank" class="clear-style barcode-view">
......@@ -32,9 +33,12 @@ uni-app已经有几十万开发者,创建了几十万个项目,是开发者
<span style="margin-top:15px;">App及H5的通用快码</span>
</a>
</div>
-->
### 第三方开发者案例
<a href="https://www.csdn.net/" target="_blank" class="clear-style"><b>CSDN:</b></a> 专业 IT 技术社区,致力于为中国软件开发者提供知识传播、在线学习、职业发展等全生命周期服务。
<div style="display:flex;justify-content: space-around;">
<a href="javascript:;" target="_blank" class="clear-style barcode-view">
......@@ -93,6 +97,14 @@ uni-app已经有几十万开发者,创建了几十万个项目,是开发者
<img src="https://img-cdn-qiniu.dcloud.net.cn/uniapp/doc/cyb-baidu.png" width="200"/>
<span style="margin-top:15px;">百度小程序码</span>
</a>
<a href="https://www.cyb520.com/" target="_blank" class="clear-style barcode-view">
<img src="https://img.cyb520.com/faceImg/2019/08/17/130C1F3F-2E93-A55D-D6B2-074BEBE1902F.png/a120" width="200"/>
<span style="margin-top:15px;">QQ小程序码</span>
</a>
<a href="https://www.cyb520.com/" target="_blank" class="clear-style barcode-view">
<img src="https://img.cyb520.com/faceImg/2019/08/17/404C2595-2B08-D471-1317-6D5375F195C5.png/a120" width="200"/>
<span style="margin-top:15px;">头条/抖音小程序码</span>
</a>
</div>
<b>垃圾分类:</b>垃圾分一分,环境美十分。参与垃圾分类,保护地球家园,共创美好世界。(作者:怎么会这样)
......@@ -114,7 +126,8 @@ uni-app已经有几十万开发者,创建了几十万个项目,是开发者
<span style="margin-top:15px;">头条小程序码</span>
</a>
</div>
<!-- <a href="//m3w.cn/__uni__4c6db6e" target="_blank" class="clear-style"><b>UniApp视频教程:</b></a>视频教育App,帮助开发者学习了解uni-app、h5+、mui等DCloud产品。开发者枫桥。
<div style="display:flex;justify-content: space-around;">
<a href="//m3w.cn/__uni__4c6db6e" target="_blank" class="clear-style barcode-view">
......@@ -164,6 +177,8 @@ uni-app已经有几十万开发者,创建了几十万个项目,是开发者
**蓝鲸鱼旧物回收:** 微信、支付宝搜索“蓝鲸鱼旧物回收”
**锦衣盒:** 专注男士形象打造,全新的智能化购物模式,解决男士购衣困扰。微信小程序中搜索“锦衣盒”,头条/抖音小程序二维码[点此](http://img.cdn.aliyun.dcloud.net.cn/guide/uniapp/case-jinyihe-toutiao.png)
**ADR之声:** 航空工业信息中心App。[Android](https://m3w.cn/__uni__937cb89)
**机场行:** 中国航信以机场为核心为旅客提供智能全行程服务应用。微信小程序搜索“机场行”,[H5](http://airporttravel.travelsky.com/weixin/)
......@@ -180,6 +195,8 @@ uni-app已经有几十万开发者,创建了几十万个项目,是开发者
**江苏公安网上政工慰问:**[H5](https://jxt.jsga.gov.cn:10006/app/njqxgzzs/zgww/#/)
**杭州智安通:*[H5](https://hzjjzat.citydo.com.cn/vehicle-test)
**深圳福田区爱福田:**[H5](https://ifutian.szft.gov.cn/masterSecond/)
**广州市南沙区企业综合服务平台:**[H5](https://qiye.gzns.gov.cn/m/#/)
......
......@@ -5,27 +5,27 @@ UniPush是DCloud推出的集成型统一推送服务,内建了苹果、华为
UniPush即降低了开发成本、又提高了push送达率,并且免费,是当前推送的最佳解决方案。
详见[http://ask.dcloud.net.cn/article/35622](http://ask.dcloud.net.cn/article/35622)
详见[https://ask.dcloud.net.cn/article/35622](https://ask.dcloud.net.cn/article/35622)
### uni统计
uni-app,自带免费统计平台。无需到处对接统计sdk,可以在一张报表里看到所有端(iOS、Android、H5及各家小程序)的运营数据。
uni统计官网地址:[https://tongji.dcloud.net.cn/](https://tongji.dcloud.net.cn/)
### 广告变现
```uni-app``` 支持DCloud的广告联盟,开发者在打包界面简单打几个勾,就可开通开屏、悬浮红包、推送等广告形式,快速实现App变现。
```uni-app``` 支持DCloud的广告联盟,开发者在打包界面简单打几个勾,就可开通开屏、悬浮红包、推送等广告形式,快速实现App变现。
更多广告联盟的介绍,参考 [广告联盟DAD](http://www.dcloud.io/dad.html)
### 运营统计
### 制作统一发行页面
开发者的应用太多,App、小程序、h5...如何在一个url里呈现,统一简单的传播到用户侧?
来看这个页面[http://m3w.cn/uniapp](http://m3w.cn/uniapp),一个页面囊括所有。
如何制作?开发一个uni-app,然后在HBuilderX的菜单工具-发行-生成统一发布页面。
DCloud开发的App,自带免费统计平台。
登录[https://dev.dcloud.net.cn](https://dev.dcloud.net.cn) 可查看 ```uni-app``` 在微信小程序、原生App不同平台的统计数据,比如新增用户、日活用户、留存等。
### 制作统一发行页面
开发者的应用太多,App、小程序、h5...如何在一个url里呈现,统一简单的传播到用户侧?
来看这个页面[http://m3w.cn/uniapp](http://m3w.cn/uniapp),一个页面囊括所有。
如何制作?开发一个uni-app,然后在HBuilderX的菜单工具-发行-生成统一发布页面。
#### 加入换量联盟
```uni-app``` 发行成原生App后,可加入DCloud换量平台,和其他开发者交叉换量、彼此推广,每日新增用户可翻倍!详情及开通方式:[http://ask.dcloud.net.cn/article/13300](http://ask.dcloud.net.cn/article/13300)
\ No newline at end of file
```uni-app``` 发行成原生App后,可加入DCloud换量平台,和其他开发者交叉换量、彼此推广,每日新增用户可翻倍!详情及开通方式:[http://ask.dcloud.net.cn/article/13300](http://ask.dcloud.net.cn/article/13300)
......@@ -87,6 +87,21 @@ export default {
}
```
### 组件生命周期
``uni-app`` 组件支持如下页面生命周期函数:
|函数名|说明|平台差异说明|最低版本|
|:-|:-|:-|:-|
|beforeCreate|在实例初始化之后被调用。[详见](https://cn.vuejs.org/v2/api/#beforeCreate)|||
|created|在实例创建完成后被立即调用。[详见](https://cn.vuejs.org/v2/api/#created)|||
|beforeMount|在挂载开始之前被调用。[详见](https://cn.vuejs.org/v2/api/#beforeMount)|||
|mounted|挂载到实例上去之后调用。[详见](https://cn.vuejs.org/v2/api/#mounted) 注意:此处并不能确定子组件被全部挂载,如果需要子组件完全挂载之后在执行操作可以使用```$nextTick```[Vue官方文档](https://cn.vuejs.org/v2/api/#Vue-nextTick)|||
|beforeUpdate|数据更新时调用,发生在虚拟 DOM 打补丁之前。[详见](https://cn.vuejs.org/v2/api/#beforeUpdate)|仅H5平台支持||
|updated|由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。[详见](https://cn.vuejs.org/v2/api/#updated)|仅H5平台支持||
|beforeDestroy|实例销毁之前调用。在这一步,实例仍然完全可用。[详见](https://cn.vuejs.org/v2/api/#beforeDestroy)|||
|destroyed|Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。[详见](https://cn.vuejs.org/v2/api/#destroyed)|||
**注意**
- nvue 页面支持的生命周期参考:[nvue 生命周期介绍](/use-weex?id=生命周期)
\ No newline at end of file
......@@ -46,8 +46,8 @@
|modules|Object|权限模块,[详见](/collocation/manifest?id=modules)||
|distribute|Object|5+App 发布信息,[详见](/collocation/manifest?id=distribute)||
|usingComponents|Boolean|是否启用自定义组件模式,默认为false,[编译模式区别详情](https://ask.dcloud.net.cn/article/35843)|1.9.0|
|nvueCompiler|String|切换 nvue 编译模式,可选值,`weex` :老编译模式,`uni-app`: 新编译模式,默认为 `weex`[编译模式区别详情](http://ask.dcloud.net.cn/article/36074)|2.0.3 Alpha|
|renderer|String|可不加载基于 webview 的运行框架,减少包体积、提升启动速度。可选值 `native`| App-nvue 2.2.0+|
|nvueCompiler|String|切换 nvue 编译模式,可选值,`weex` :老编译模式,`uni-app`: 新编译模式,默认为 `weex`[编译模式区别详情](http://ask.dcloud.net.cn/article/36074)|2.0.3 Alpha|
|renderer|String|可不加载基于 webview 的运行框架,减少包体积、提升启动速度。可选值 `native`| App-nvue 2.2.0+|
|nvue|Object|nvue 页面布局初始配置,[详见](/collocation/manifest?id=nvue)|2.0.3 Alpha|
PS:这里只列出了核心部分,更多内容请参考 [完整的 manifest.json](/collocation/manifest?id=完整-manifestjson)
......@@ -125,15 +125,15 @@ splash(启动封面)是App必然存在的、不可取消的。
|statics|Object|统计配置,目前仅支付友盟统计,[详见](http://ask.dcloud.net.cn/article/74),在uni-app中只用 [plus.statistic](http://www.html5plus.org/doc/zh_cn/statistic.html) 进行调用。|
|speech|Object|语音识别配置,支持讯飞语音、百度语音,[详见](http://ask.dcloud.net.cn/article/35059),在uni-app中只用 [plus.speech](http://www.html5plus.org/doc/zh_cn/speech.html) 进行调用。|
|maps|Object|原生地图配置,目前仅支持 [高德地图](http://lbs.amap.com/),申请方式可参考:[地图插件配置](http://ask.dcloud.net.cn/article/29)。|
#### nvue@nvue
`nvue` 页面布局初始设置
#### nvue@nvue
`nvue` 页面布局初始设置
|属性|类型|描述|
|:-|:-|:-|
|flex-direction|String| flex 成员项的排列方向,支持项,row:从左到右; row-reverse:从下到上;column:从上到下;column-reverse:与 row 相反,默认值 column。|
### h5
|属性|类型|说明|
......@@ -144,8 +144,8 @@ splash(启动封面)是App必然存在的、不可取消的。
|async|Object|参考:[async](collocation/manifest?id=h5-async)|
|devServer|Object|开发环境 server 配置,参考:[devServer](collocation/manifest?id=devserver)|
|publicPath|String|引用资源的地址前缀,仅发布时生效。参考:[publicPath](collocation/manifest?id=publicPath)|
|sdkConfigs|String|SDK配置,例如地图... 参考:[sdkConfigs](collocation/manifest?id=h5sdkconfig)|
|optimization|Object|打包优化配置(HBuilderX 2.1.5 以上支持),参考[optimization](collocation/manifest?id=optimization)|
|sdkConfigs|String|SDK配置,例如地图... 参考:[sdkConfigs](collocation/manifest?id=h5sdkconfig)|
|optimization|Object|打包优化配置(HBuilderX 2.1.5 以上支持),参考[optimization](collocation/manifest?id=optimization)|
#### 自定义模板@h5-template
......@@ -222,13 +222,13 @@ Tips:`uni-app` 中 `manifest.json->h5->devServer` 实际上对应 `webpack`
以 hello-uniapp 发布 H5 时为例
未配置 publicPath 时,发布时 index.html 中的结果:
未配置 publicPath 时,发布时 index.html 中的结果:
```html
<script src=/h5/static/js/chunk-vendors.803ce52d.js></script>
<script src=/h5/static/js/index.34e8497d.js>
```
配置 publicPath 为 `https://www.cdn.com/h5/`(无效地址仅用作示例) 后,发布时 index.html 中的结果:
配置 publicPath 为 `https://www.cdn.com/h5/`(无效地址仅用作示例) 后,发布时 index.html 中的结果:
```html
<script src=https://www.cdn.com/h5/static/js/chunk-vendors.803ce52d.js></script>
......@@ -256,30 +256,32 @@ Tips:`uni-app` 中 `manifest.json->h5->devServer` 实际上对应 `webpack`
}
```
#### optimization
|属性|类型|默认值|说明|
|:-|:-|:-|:-|
|prefetch|Boolean|false|资源预取|
|preload|Boolean|false|资源预加载|
|treeShaking|Object||摇树优化,根据项目需求,动态打包框架所需的组件及API,保持框架代码最精简化,参考[treeShaking](collocation/manifest?id=treeshaking)|
##### treeShaking
|属性|类型|默认值|说明|
|:-|:-|:-|:-|
|enable|Boolean|false|是否启用摇树优化|
**示例:**
```json
"h5": {
"optimization": {
"treeShaking": {
"enable": true
}
}
}
```
#### optimization
|属性|类型|默认值|说明|
|:-|:-|:-|:-|
|prefetch|Boolean|false|资源预取|
|preload|Boolean|false|资源预加载|
|treeShaking|Object||摇树优化,根据项目需求,动态打包框架所需的组件及API,保持框架代码最精简化,参考[treeShaking](collocation/manifest?id=treeshaking)|
##### treeShaking
|属性|类型|默认值|说明|
|:-|:-|:-|:-|
|enable|Boolean|false|是否启用摇树优化|
**示例:**
```json
"h5": {
"optimization": {
"treeShaking": {
"enable": true
}
}
}
```
Tips:关于摇树优化(treeShaking)原理及优化结果,参考:[https://ask.dcloud.net.cn/article/36279](https://ask.dcloud.net.cn/article/36279)
### mp-weixin
......@@ -293,7 +295,7 @@ Tips:`uni-app` 中 `manifest.json->h5->devServer` 实际上对应 `webpack`
|plugins|Object|使用到的插件,[详见](https://developers.weixin.qq.com/miniprogram/dev/framework/plugin/using.html)|
|resizable|Boolean|在iPad上小程序是否支持屏幕旋转,默认关闭|
|navigateToMiniProgramAppIdList|Array|需要跳转的小程序列表,[详见](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/miniprogram-navigate/wx.navigateToMiniProgram.html)|
|permission|Object|微信小程序接口权限相关设置,比如申请位置权限必须填此处[详见](https://developers.weixin.qq.com/miniprogram/dev/framework/config.html)|
|permission|Object|微信小程序接口权限相关设置,比如申请位置权限必须填此处[详见](https://developers.weixin.qq.com/miniprogram/dev/framework/config.html)|
|workers|String|Worker 代码放置的目录,**HBuilderX 2.0.0+ Alpha** 支持。 [详见](https://developers.weixin.qq.com/miniprogram/dev/framework/workers.html)|
#### setting
......@@ -306,18 +308,18 @@ Tips:`uni-app` 中 `manifest.json->h5->devServer` 实际上对应 `webpack`
|es6|Boolean|ES6 转 ES5|
|postcss|Boolean|上传代码时样式是否自动补全|
|minified|Boolean|上传代码时是否自动压缩|
### mp-alipay
|属性|类型|说明|
|:-|:-|:-|
|usingComponents|Boolean| 是否启用自定义组件模式,`v2.0+`,默认为false,[编译模式区别详情](https://ask.dcloud.net.cn/article/35843)|
### mp-alipay
|属性|类型|说明|
|:-|:-|:-|
|usingComponents|Boolean| 是否启用自定义组件模式,`v2.0+`,默认为false,[编译模式区别详情](https://ask.dcloud.net.cn/article/35843)|
### mp-baidu
|属性|类型|说明|
|:-|:-|:-|
|appid|String|百度小程序的 AppID,登录 [https://smartprogram.baidu.com/docs/introduction/enter_application/](https://smartprogram.baidu.com/docs/introduction/enter_application/) 申请|
|appid|String|百度小程序的 AppID,登录 [https://smartprogram.baidu.com/docs/introduction/enter_application/](https://smartprogram.baidu.com/docs/introduction/enter_application/) 申请|
|usingComponents|Boolean| 是否启用自定义组件模式,`v2.0+`,默认为false,[编译模式区别详情](https://ask.dcloud.net.cn/article/35843)|
### mp-toutiao
......@@ -326,6 +328,7 @@ Tips:`uni-app` 中 `manifest.json->h5->devServer` 实际上对应 `webpack`
|:-|:-|:-|
|appid|String|头条小程序的 AppID,登录 [https://developer.toutiao.com/](https://developer.toutiao.com/) 申请|
|setting|Object|头条小程序项目设置,参考[头条小程序项目设置](/collocation/manifest?id=mp-toutiao-setting)|
|usingComponents|Boolean| 是否启用自定义组件模式,`v2.0+`,默认为false,[编译模式区别详情](https://ask.dcloud.net.cn/article/35843)|
#### 头条小程序项目设置@mp-toutiao-setting
......@@ -335,13 +338,14 @@ Tips:`uni-app` 中 `manifest.json->h5->devServer` 实际上对应 `webpack`
|es6|Boolean|ES6 转 ES5|
|postcss|Boolean|上传代码时样式是否自动补全|
|minified|Boolean|上传代码时是否自动压缩|
### mp-qq
|属性|类型|说明|
|:-|:-|:-|
|appid|String|qq 小程序的 AppID,登录 [https://q.qq.com](https://q.qq.com) 申请|
|usingComponents|Boolean| 是否启用自定义组件模式,`v2.0+`,默认为false,[编译模式区别详情](https://ask.dcloud.net.cn/article/35843)。mp-qq只支持自定义组件模式|
### 完整 manifest.json
......@@ -666,4 +670,4 @@ Tips:`uni-app` 中 `manifest.json->h5->devServer` 实际上对应 `webpack`
# FAQ
Q:iOS 应用调用相机等权限时,弹出的提示语如何修改?
A:在 manifest.json 可视化界面-App模块权限配置-iOS隐私信息访问的许可描述
\ No newline at end of file
A:在 manifest.json 可视化界面-App模块权限配置-iOS隐私信息访问的许可描述
......@@ -76,10 +76,10 @@
|属性|类型|默认值|描述|平台差异说明|
|:-|:-|:-|:-||
|navigationBarBackgroundColor|HexColor|#000000|导航栏背景颜色(同状态栏背景色)||
|navigationBarBackgroundColor|HexColor|#F7F7F7|导航栏背景颜色(同状态栏背景色)|APP与H5为#F7F7F7,小程序平台请参考相应小程序文档||
|navigationBarTextStyle|String|white|导航栏标题颜色及状态栏前景颜色,仅支持 black/white||
|navigationBarTitleText|String||导航栏标题文字内容||
|navigationStyle|String|default|导航栏样式,仅支持 default/custom。custom即取消默认的原生导航栏,需看[使用注意](/collocation/pages?id=/customnav)|微信小程序 7.0+、百度小程序、H5、App(2.0.3+)|
|navigationStyle|String|default|导航栏样式,仅支持 default/custom。custom即取消默认的原生导航栏,需看[使用注意](/collocation/pages?id=customnav)|微信小程序 7.0+、百度小程序、H5、App(2.0.3+)|
|backgroundColor|HexColor|#ffffff|窗口的背景色|微信小程序|
|backgroundTextStyle|String|dark|下拉 loading 的样式,仅支持 dark / light|微信小程序|
|enablePullDownRefresh|Boolean|false|是否开启下拉刷新,详见[页面生命周期](/use?id=页面生命周期)。||
......@@ -89,6 +89,13 @@
|pageOrientation|String|portrait|屏幕旋转设置,仅支持 auto / portrait 详见 [响应显示区域变化](https://developers.weixin.qq.com/miniprogram/dev/framework/view/resizable.html)|微信小程序|
|animationType|String|pop-in|窗口显示的动画效果,详见:[窗口动画](api/router?id=animation)|App|
|animationDuration|Number|300|窗口显示动画的持续时间,单位为 ms|App|
|app-plus|Object||设置编译到 App 平台的特定样式,配置项参考下方 [app-plus](/collocation/pages?id=app-plus)|App|
|h5|Object||设置编译到 H5 平台的特定样式,配置项参考下方 [H5](/collocation/pages?id=h5)|H5|
|mp-alipay|Object||设置编译到 mp-alipay 平台的特定样式,配置项参考下方 [MP-ALIPAY](/collocation/pages?id=mp-alipay)|支付宝小程序|
|mp-weixin|Object||设置编译到 mp-weixin 平台的特定样式|微信小程序|
|mp-baidu|Object||设置编译到 mp-baidu 平台的特定样式|百度小程序|
|mp-toutiao|Object||设置编译到 mp-toutiao 平台的特定样式|字节跳动小程序|
|mp-qq|Object||设置编译到 mp-qq 平台的特定样式|QQ小程序|
|usingComponents|Object| |引用小程序组件,参考 [小程序组件](/frame?id=小程序组件支持)|微信小程序、App|
# pages
......@@ -152,7 +159,7 @@
|navigationBarTextStyle|String|white|导航栏标题颜色及状态栏前景颜色,仅支持 black/white||
|navigationBarTitleText|String||导航栏标题文字内容||
|navigationBarShadow|Object||导航栏阴影,配置参考下方 [导航栏阴影](/collocation/pages?id=navigationBarShadow)||
|navigationStyle|String|default|导航栏样式,仅支持 default/custom。custom即取消默认的原生导航栏,需看[使用注意](/collocation/pages?id=/customnav)|微信小程序 7.0+、百度小程序、H5、App(2.0.3+)|
|navigationStyle|String|default|导航栏样式,仅支持 default/custom。custom即取消默认的原生导航栏,需看[使用注意](/collocation/pages?id=customnav)|微信小程序 7.0+、百度小程序、H5、App(2.0.3+)|
|disableScroll|Boolean|false|设置为 true 则页面整体不能上下滚动(bounce效果),只在页面配置中有效,在globalStyle中设置无效|微信小程序(iOS)、百度小程序(iOS)|
|backgroundColor|HexColor|#ffffff|窗口的背景色|微信小程序、百度小程序、头条小程序|
|backgroundTextStyle|String|dark|下拉 loading 的样式,仅支持 dark/light||
......@@ -162,6 +169,11 @@
|backgroundColorBottom|HexColor|#ffffff|底部窗口的背景色。|仅 iOS 平台|
|app-plus|Object||设置编译到 App 平台的特定样式,配置项参考下方 [app-plus](/collocation/pages?id=app-plus)|App|
|h5|Object||设置编译到 H5 平台的特定样式,配置项参考下方 [H5](/collocation/pages?id=h5)|H5|
|mp-alipay|Object||设置编译到 mp-alipay 平台的特定样式,配置项参考下方 [MP-ALIPAY](/collocation/pages?id=mp-alipay)|支付宝小程序|
|mp-weixin|Object||设置编译到 mp-weixin 平台的特定样式|微信小程序|
|mp-baidu|Object||设置编译到 mp-baidu 平台的特定样式|百度小程序|
|mp-toutiao|Object||设置编译到 mp-toutiao 平台的特定样式|字节跳动小程序|
|mp-qq|Object||设置编译到 mp-qq 平台的特定样式|QQ小程序|
|usingComponents|Object||引用小程序组件,参考 [小程序组件](/frame?id=小程序组件支持)|App、微信小程序、支付宝小程序、百度小程序|
**代码示例:**
......@@ -210,7 +222,7 @@
- 前端组件在渲染速度上不如原生导航栏,原生导航可以在动画期间渲染,保证动画期间不白屏,但使用前端导航栏,在新窗体进入的动画期间可能会整页白屏,越低端的手机越明显。
- 以上讨论的是前端自定义导航栏,但在App侧,原生导航栏也提供了比小程序导航更丰富的自定义性
* titleNView:给原生导航栏提供更多配置,包括自定义按钮、滚动渐变效果、搜索框等,详见[titleNView](/collocation/pages?id=app-titleNView)
* sunNView:使用nvue原生渲染,所有布局自己开发,具备一切自定义灵活度。详见[subNVue](/collocation/pages?id=app-subNVues)
* subNView:使用nvue原生渲染,所有布局自己开发,具备一切自定义灵活度。详见[subNVue](/collocation/pages?id=app-subNVues)
- 页面禁用原生导航栏后,想要改变状态栏的前景字体样式,仍可设置页面的 navigationBarTextStyle 属性(只能设置为 black或white)。如果想单独设置状态栏颜色,App端可使用[plus.navigator.setStatusBarStyle](http://www.html5plus.org/doc/zh_cn/navigator.html#plus.navigator.setStatusBarStyle)设置。注意部分低端Android手机(4.4)自身不支持设置状态栏前景色。
鉴于以上问题,在原生导航能解决业务需求的情况下,尽量使用原生导航。甚至有时需要牺牲一些不是很重要的需求。在App和H5下,uni-app提供了灵活的处理方案:[titleNView](/collocation/pages?id=app-titleNView)[subNVue](/collocation/pages?id=app-subNVues)、或整页使用nvue。但在小程序下,因为其自身的限制,没有太好的方案。有必要的话,也可以用条件编译分端处理。
......@@ -247,7 +259,7 @@
**Tips**
- 每个页面均支持通过配置 `titleNView:false` 来禁用原生导航栏。一旦禁用原生导航,请注意阅读[自定义导航注意事项](/collocation/pages?id=/customnav)
- 每个页面均支持通过配置 `titleNView:false` 来禁用原生导航栏。一旦禁用原生导航,请注意阅读[自定义导航注意事项](/collocation/pages?id=customnav)
- `titleNView` 不能设置 `autoBackButton``homeButton`等属性
- `titleNView``type` 值为 `transparent` 时,导航栏为透明渐变导航栏
-`titleNView` 配置 `buttons` 后,监听按钮的点击事件,vue 页面参考:[onNavigationBarButtonTap](/frame?id=页面生命周期)、nvue 页面参考:[uni.onNavigationBarButtonTap](/use-weex?id=onnavigationbarbuttontap)
......@@ -585,6 +597,27 @@ h5 平台下拉刷新动画,只有 circle 类型。
|:-|:-|:-|
|colorType|String|阴影的颜色,支持:grey、blue、green、orange、red、yellow|
### mp-alipay
配置编译到 MP-ALIPAY 平台时的特定样式
|属性|类型|默认值|描述|
|:-|:-|:-|:-|
|allowsBounceVertical|String|YES|是否允许向下拉拽。支持 YES / NO|
|transparentTitle|String|none|导航栏透明设置。支持 always 一直透明 / auto 滑动自适应 / none 不透明|
|titlePenetrate|String|NO|导航栏点击穿透|
|showTitleLoading|String|NO|是否进入时显示导航栏的 loading。支持 YES / NO|
|titleImage|String||导航栏图片地址(替换当前标题),必须为https的图片链接地址|
|backgroundImageUrl|String||下拉露出显示的背景图链接|
|backgroundImageColor|HexColor||下拉露出显示的背景图底色|
|gestureBack|String|NO|iOS 用,是否支持手势返回。支持 YES / NO|
|enableScrollBar|String|YES|Android 用,是否显示 WebView 滚动条。支持 YES / NO|
**注意事项**
- ```titleImage```仅支持https地址,设置了```titleImage```会是页面```title```失效
- ```backgroundImageUrl```支持网络地址和本地地址,尽量使用绝对地址
- 部分配置可能会只在真机运行的时候生效,支付宝未来应该会改善
# FAQ
- Q:如何取消原生导航栏?或自定义导航
- A:参考[导航栏开发指南](http://ask.dcloud.net.cn/article/34921)
......
vue.config.js 是一个可选的配置文件,如果项目的根目录中存在这个文件,那么它会被自动加载,具体规范参考:[vue-config.js](https://cli.vuejs.org/zh/config/#vue-config-js)
**支持情况**
* CLI 工程
* HBuilderX 2.1.5 及以上版本
**注意事项**
部分配置项会被编译配置覆盖,例如:
* publicPath 不支持,如果需要配置,请在 manifest.json->h5->router->base 中配置,参考文档:[h5-router](collocation/manifest?id=h5-router)
* outputDir 不支持
* assetsDir 固定 static
* pages 不支持
* runtimeCompiler 固定 false
* productionSourceMap 固定 false
* css.extract H5 平台固定 false,其他平台固定 true
* parallel 固定 false
**使用示例**
**自定义静态资源目录**
```js
const path = require('path')
const CopyWebpackPlugin = require('copy-webpack-plugin')
module.exports = {
configureWebpack: {
plugins: [
new CopyWebpackPlugin([
{
from: path.join(__dirname, 'src/images'),
to: path.join(__dirname, 'dist', process.env.NODE_ENV === 'production' ? 'build' : 'dev', process.env.UNI_PLATFORM, 'images')
}
])
]
}
}
```
**注入全局依赖**
```js
const webpack = require('webpack')
vue.config.js 是一个可选的配置文件,如果项目的根目录中存在这个文件,那么它会被自动加载,一般用于配置 webpack 等编译选项,具体规范参考:[vue-config.js](https://cli.vuejs.org/zh/config/#vue-config-js)
**支持情况**
* CLI 工程
* HBuilderX 2.1.5 及以上版本
**注意事项**
部分配置项会被编译配置覆盖,例如:
* publicPath 不支持,如果需要配置,请在 manifest.json->h5->router->base 中配置,参考文档:[h5-router](collocation/manifest?id=h5-router)
* outputDir 不支持
* assetsDir 固定 static
* pages 不支持
* runtimeCompiler 固定 false
* productionSourceMap 固定 false
* css.extract H5 平台固定 false,其他平台固定 true
* parallel 固定 false
**使用示例**
**自定义静态资源目录**
```js
const path = require('path')
const CopyWebpackPlugin = require('copy-webpack-plugin')
module.exports = {
configureWebpack: {
plugins: [
new CopyWebpackPlugin([
{
from: path.join(__dirname, 'src/images'),
to: path.join(__dirname, 'dist', process.env.NODE_ENV === 'production' ? 'build' : 'dev', process.env.UNI_PLATFORM, 'images')
}
])
]
}
}
```
**注入全局依赖**
```js
const webpack = require('webpack')
module.exports = {
configureWebpack: {
plugins: [
new webpack.ProvidePlugin({
'localStorage': ['mp-storage', 'localStorage'],
'localStorage': ['mp-storage', 'localStorage'],
'window.localStorage': ['mp-storage', 'localStorage']
})
]
}
}
```
}
```
......@@ -3,11 +3,13 @@
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|x|√|x|
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|x|√|x|x|
**注意:** 微信小程序平台自基础库 1.6.0 版本开始,不再维护 audio 组件,建议在微信小程序平台使用 [uni.createInnerAudioContext](/api/media/audio-context?id=createinneraudiocontext) 替代。
**注意:** 微信小程序平台自基础库 1.6.0 版本开始,不再维护 audio 组件,推荐使用API方式而不是组件方式来播放音频。API见 [uni.createInnerAudioContext](/api/media/audio-context?id=createinneraudiocontext) 替代。
app-nvue也不支持此组件。
**属性说明**
......@@ -66,4 +68,4 @@ export default {
}
```
![uniapp](https://img-cdn-qiniu.dcloud.net.cn/uniapp/doc/img/audio.png)
\ No newline at end of file
![uniapp](https://img-cdn-qiniu.dcloud.net.cn/uniapp/doc/img/audio.png)
......@@ -2,9 +2,9 @@
app端nvue专用的扫码组件。
注意:此组件用于app端nvue页面实现内嵌到界面上的扫码。其他场景、其他平台,请使用全屏扫码API:[uni.scanCode](https://uniapp.dcloud.io/api/system/barcode)
此组件自HBuilderX 2.1.5+起支持。
- 此组件用于app端nvue页面实现内嵌到界面上的扫码。其他场景、其他平台,请使用全屏扫码API:[uni.scanCode](https://uniapp.dcloud.io/api/system/barcode)
- App下纯nvue项目(manifest中renderer为native),暂不支持uni.scanCode API,此时只能使用barcode组件来替代。
- 此组件自HBuilderX 2.1.5+起支持。
**属性说明**
设置Barcode扫码控件的属性,如扫码框、扫码条的颜色等。
......
......@@ -3,15 +3,16 @@
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|x|x|√|x|√|x|
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|x|x|√|x|√|x|√|
* 在 App 和 H5 端,可以使用API方式来调用全屏摄像头,而不是组件内嵌方式。并且App端和H5端目前无法通过cover-view覆盖摄像头,有相关需求见下方插件。
* [uni.chooseImage](/api/media/image?id=chooseimage)[uni.chooseVideo](/api/media/video?id=choosevideo) 可以拍照或录像,但它们会同时允许用户选择相册。
* 使用`plus.camera`的API可以直接调起全屏的摄像头,详见:[https://www.html5plus.org/doc/zh_cn/camera.html](http://www.html5plus.org/doc/zh_cn/camera.html) 调用原生摄像头进行相关操作。
* 如开发身份证扫描、银行卡识别等ocr识别需求,在微信小程序和百度小程序中使用本camera组件,将图片发送给服务器识别,插件市场有封装好的[模板](https://ext.dcloud.net.cn/search?q=%E5%B0%8F%E7%A8%8B%E5%BA%8F%E7%9B%B8%E6%9C%BA);在App端使用[原生插件](https://ext.dcloud.net.cn/search?q=ocr)
* 活体检测、人脸识别另见文档[生物认证](/api/other/authentication)
* app-nvue下支持barcode组件,可实现自定义扫码。[参考](https://uniapp.dcloud.io/component/barcode)
**属性说明**
......
......@@ -19,7 +19,7 @@
* canvas 标签默认宽度 300px、高度 225px,动态修改 canvas 大小后需要重新绘制。
* 同一页面中的 canvas-id 不可重复,如果使用一个已经出现过的 canvas-id,该 canvas 标签对应的画布将被隐藏并不再正常工作。
* canvas 在微信小程序、百度小程序中为原生组件,层级高于前端组件,请勿内嵌在 scroll-view、swiper、picker-view、movable-view 中使用。解决 canvas 层级过高无法覆盖,参考 [native-component](/component/native-component)
* canvas 在微信小程序、百度小程序、QQ小程序中为原生组件,层级高于前端组件,请勿内嵌在 scroll-view、swiper、picker-view、movable-view 中使用。解决 canvas 层级过高无法覆盖,参考 [native-component](/component/native-component)
* canvas 在App端 vue 页面不是原生组件,目前App端 nvue 还不支持 canvas 组件。
**示例:**
......
#### cell
app端nvue专用组件。
app端nvue专用组件。它的重要价值在于告诉原生引擎,哪些部分是可重用的。
`<cell>` Cell 必须以一级子组件的形式存在于 `list recycler waterfall` 中。
......
......@@ -5,9 +5,9 @@
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|√|√|x|
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|√|√|x|√|
支持的事件:`click`
......@@ -16,9 +16,9 @@
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|x|√|x|
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|x|√|x|√|
**属性说明**
......@@ -40,6 +40,7 @@
- linebreak
- white-space
注意:nvue的cover-view不在上述限制中,它仅支持且全部支持nvue的所有css。
**Tips**
......
......@@ -14,9 +14,9 @@
**平台差异说明**
|App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|2.0.0+ [自定义组件编译模式](https://ask.dcloud.net.cn/article/35843),不含nvue|x|基础库 2.7.0+|x|x|x|
|App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|2.0.0+ [自定义组件编译模式](https://ask.dcloud.net.cn/article/35843),不含nvue|x|基础库 2.7.0+|x|x|x|x|
本功能自HBuilderX2.0起支持。运行到微信小程序工具时,注意在微信工具里选择最新的基础库。
......
......@@ -6,7 +6,7 @@
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|√|√|√|√|
|√|√(2.2.3+)|√|√|√|√|√|
**Tips**
......
......@@ -23,7 +23,7 @@
|selection-end|Number|-1|光标结束位置,自动聚集时有效,需与selection-start搭配使用||
|adjust-position|Boolean|true|键盘弹起时,是否自动上推页面|5+App(softinputMode 为 adjustResize 时无效)、微信小程序、百度小程序、QQ小程序|
|@input|EventHandle||当键盘输入时,触发input事件,event.detail = {value}|差异见下方 Tips|
|@focus|EventHandle||输入框聚焦时触发,event.detail = { value, height },height 为键盘高度|仅微信小程序、5+App(HBuilderX 2.0+ [nvue uni-app模式](http://ask.dcloud.net.cn/article/36074)) 、QQ小程序支持 height|
|@focus|EventHandle||输入框聚焦时触发,event.detail = { value, height },height 为键盘高度|仅微信小程序、5+App(HBuilderX 2.2.3) 、QQ小程序支持 height|
|@blur|EventHandle||输入框失去焦点时触发,event.detail = {value: value}||
|@confirm|EventHandle||点击完成按钮时触发,event.detail = {value: value}|&nbsp;|
......@@ -103,7 +103,7 @@ App平台软键盘弹出有 adjustResize|adjustPan 两种模式,默认为 adju
- adjustResize:软键盘弹出时,webview窗体高度挤压。屏幕高度=webview窗体高度+软键盘高度
- adjustPan:软键盘弹出时,webview窗体高度不变,但窗体上推,以保证输入框不被软键盘盖住
配置方式,在 pages.json 中配置 style
配置方式,在 pages.json 中配置 style
```json
"app-plus": {
......@@ -114,7 +114,7 @@ App平台软键盘弹出有 adjustResize|adjustPan 两种模式,默认为 adju
App端开发聊天类应用时,目前推荐改为adjustResize模式。在hello uni-app的模板-聊天中有详细示例。
**注意**
- adjustResize模式在Android App上,弹起键盘和收回键盘时,因为要重设webview高度,可能会临时性出现灰屏或漏出下层页面内容。后续会优化
- adjustResize模式在Android App上,弹起键盘和收回键盘时,因为要重设webview窗体高度,可能会临时性出现灰屏或漏出下层页面内容。
- 小程序端在 input 聚焦期间,避免使用 css 动画。
- H5平台只能在用户交互时修改 focus 生效。
- 如果遇到 focus 属性设置不生效的问题参考:[组件属性设置不生效解决办法](/use?id=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98)
......
#### list
app端nvue专用组件。
app端nvue专用组件。在app-nvue下,如果是长列表,使用list组件的性能高于使用view或scroll-view的滚动。原因在于list在不可见部分的渲染资源回收有特殊的优化处理。
`<list>` 组件是提供垂直列表功能的核心组件,拥有平滑的滚动和高效的内存管理,非常适合用于长列表的展示。最简单的使用方法是在 `<list>` 标签内使用一组由简单数组循环生成的 `<cell>` 标签填充。
......
......@@ -6,11 +6,11 @@
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|x|x|√|x|√|x|
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|x(见下)|x|√|x|√|x|√|
- 5+App的实时音视频播放,不是使用 live-player,而是直接使用 video 组件。
- App的实时音视频播放,不是使用 live-player,而是直接使用 video 组件。
- H5 下可用 video 播放符合 HTML5 规范的流媒体,rtmp 等非 HTML5 标准的流媒体格式,仅在部分支持 flash 的国内手机浏览器上可播放。在 pc 浏览器上,需要安装 flash 插件才能播放 rtmp 等格式。
......@@ -40,6 +40,7 @@
* live-player 是原生组件,层级高于前端组件,请勿在 scroll-view、swiper、picker-view、movable-view 中使用
* 小程序下覆盖live-player需要使用cover-view。[详见](/component/native-component)
* live-player 组件相关 JS API:[createLivePlayerContext](/api/media/live-player-context)
* 小程序平台使用live-player有审核限制,请注意参考各家文档,
**状态码**
......@@ -106,4 +107,4 @@ export default {
}
}
}
```
\ No newline at end of file
```
......@@ -2,12 +2,13 @@
实时音视频录制,也称直播推流。
各平台开发方式暂未统一,使用时需注意用[条件编译](https://uniapp.dcloud.io/platform)调用不同平台的代码
目前只有App和微信小程序支持
- 微信小程序:[规范文档](https://developers.weixin.qq.com/miniprogram/dev/component/live-pusher.html)
- App平台:[业务指南](https://ask.dcloud.net.cn/article/13416)[规范文档](http://www.html5plus.org/doc/zh_cn/video.html#plus.video.LivePusher)
- App平台:nvue文件下也支持live-pusher组件,API与微信相同。如果是vue文件,则需要单独编写条件编译代码,使用plus.video.LivePusher,[业务指南](https://ask.dcloud.net.cn/article/13416)[规范文档](http://www.html5plus.org/doc/zh_cn/video.html#plus.video.LivePusher)
**注意**
* live-pusher 是原生组件,层级高于前端组件,请勿在 scroll-view、swiper、picker-view、movable-view 中使用
* 解决 live-pusher 层级过高无法覆盖,[参考](/component/native-component)
\ No newline at end of file
* live-pusher 是原生组件,在小程序端层级高于前端组件,请勿在 scroll-view、swiper、picker-view、movable-view 中使用,需使用cover-view覆盖。在App端的nvue文件中,live-pusher没有这类限制。
* App平台:使用 `<live-pusher/>` 组件,打包 App 时必须勾选 manifest.json->App 模块权限配置->LivePusher(直播推流) 模块。
......@@ -4,9 +4,9 @@
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|√|√|x|
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|√|√|x|x|
**属性说明**
......@@ -174,11 +174,12 @@ map 组件相关操作的 JS API:[uni.createMapContext](api/location/map?id=cr
**注意事项**
- 小程序和 App 中,`<map>` 组件是由引擎创建的原生组件,它的层级是最高的,不能通过 z-index 控制层级。在`<map>`上绘制内容,可使用组件自带的marker、controls等属性,也可以使用`<cover-view>`组件。App端还可以使用plus.nativeObj.view 或 subNVue 绘制原生内容。[详见](/component/native-component)
- 小程序和 App的vue文件 中,`<map>` 组件是由引擎创建的原生组件,它的层级是最高的,不能通过 z-index 控制层级。在`<map>`上绘制内容,可使用组件自带的marker、controls等属性,也可以使用`<cover-view>`组件。App端还可以使用plus.nativeObj.view 或 subNVue 绘制原生内容,[参考](/component/native-component)。另外App端nvue文件不存在层级问题。
- App端nvue文件的map和小程序拉齐度更高。vue里的map则与plus.map功能一致,和小程序的地图略有差异。
- 小程序和 App 中,请勿在 scroll-view、swiper、picker-view、movable-view 中使用 `<map>` 组件。
- 小程序和 App 中,css 动画对 `<map>` 组件无效。
- map 组件使用的经纬度是国测局坐标,调用 uni.getLocation 接口需要指定 type 为 gcj02。
- `<map>` 组件在不同平台的底层引擎是不同的:H5、微信小程序为腾讯地图;App、支付宝小程序为高德地图;百度小程序端为百度地图。App端也可以使用百度地图,在manifest的源码视图中配置,具体[参考](http://ask.dcloud.net.cn/article/29)
- `<map>` 组件在不同平台的底层引擎是不同的:H5、微信小程序为腾讯地图;App、支付宝小程序为高德地图;百度小程序端为百度地图。App端vue页面也可以使用百度地图,在manifest中配置,但nvue页面只支持高德地图。
- map 组件默认的api是参考微信小程序的,如果觉得不够用,可以用plus.map,可以通过`$getAppMap`获取原生地图对象,[详见](https://uniapp.dcloud.io/api/location/map)
- H5 端获取定位信息,需要部署在 **https** 服务上,本地预览(localhost)仍然可以使用 http 协议。
- 无 GPS 模块的 PC 设备使用 Chrome 浏览器的时候,位置信息是连接谷歌服务器获取的,国内用户可能获取位置信息失败。
......
......@@ -4,9 +4,9 @@
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|√|√|x|
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|√|√|x|√|
**属性说明**
......@@ -14,7 +14,7 @@
|:-|:-|:-|:-|
|scale-area|Boolean|false|当里面的 movable-view 设置为支持双指缩放时,设置此值可将缩放手势生效区域修改为整个 movable-area|
**注意:movable-area 必须设置 width 和 height 属性,不设置默认为 10px**
**注意:movable-area 必须设置 width 和 height 属性,不设置默认为 10px**
- movable-area app-nvue平台 暂不支持手势缩放
#### movable-view
......@@ -23,9 +23,9 @@
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|√|√|x|
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|√|√|√|√|√|x|√|
**属性说明**
......@@ -121,4 +121,4 @@ export default {
}
```
![uni](https://img-cdn-qiniu.dcloud.net.cn/uniapp/doc/img/moveable-view.png)
\ No newline at end of file
![uni](https://img-cdn-qiniu.dcloud.net.cn/uniapp/doc/img/moveable-view.png)
......@@ -4,21 +4,23 @@
**平台差异说明**
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
|x|x|√|x|√|x|
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|x|x|√|x|√|x|√|
**Tips**
该功能为微信、百度、支付宝、头条等平台提供的开放能力。App端和H5端不涉及此概念。
该功能为各小程序平台提供的开放能力。App端和H5端不涉及此概念。
支付宝和头条没有open-data组件,但提供了API方式获取相关信息。支付宝[参考](https://docs.alipay.com/mini/api/ch8chh)、头条[参考](https://developer.toutiao.com/docs/open/getUserInfo.html)
**属性说明**
|属性名|类型|默认值|说明|平台差异说明|
|:-:|:-:|:-:|:-:|:-:|
|type|String||开放数据类型||
|open-gid|String||当 type="groupName" 时生效, 群id|微信小程序|
|lang|String|en|当 type="user*" 时生效,以哪种语言展示 userInfo,有效值有:en, zh_CN, zh_TW|微信小程序|
|open-gid|String||当 type="groupName" 时生效, 群id|微信小程序、QQ小程序|
|lang|String|en|当 type="user*" 时生效,以哪种语言展示 userInfo,有效值有:en, zh_CN, zh_TW|微信小程序、QQ小程序|
**type 有效值**
......@@ -27,11 +29,11 @@
|userNickName|用户昵称||
|userAvatarUrl|用户头像||
|userGender|用户性别||
|groupName|拉取群名称|微信小程序|
|userCity|用户所在城市|微信小程序|
|userProvince|用户所在省份|微信小程序|
|userCountry|用户所在国家|微信小程序|
|userLanguage|用户的语言|微信小程序|
|groupName|拉取群名称|微信小程序、QQ小程序|
|userCity|用户所在城市|微信小程序、QQ小程序|
|userProvince|用户所在省份|微信小程序、QQ小程序|
|userCountry|用户所在国家|微信小程序、QQ小程序|
|userLanguage|用户的语言|微信小程序、QQ小程序|
**示例**
......
......@@ -26,7 +26,7 @@
|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-:|:-:|:-:|:-:|:-:|:-:|
||√|√|x|√|√|
|vue支持,nvue不支持|√|√|x|√|√|
**属性说明**
......@@ -41,7 +41,7 @@
|@cancel|EventHandle||取消选择时触发|
|disabled|Boolean|false|是否禁用|
**bug & tips**
**bug & tips**
- 由于 JavaScript 的限制 vue 不能观测如下方式设置 value:``this.value[0] = 0``[vue 注意事项](https://cn.vuejs.org/v2/guide/list.html#注意事项)),解决方式参考:[hello-uniapp 示例](https://github.com/dcloudio/hello-uniapp/commit/59264474172a591c865431d02a2a1e3583978827)
- 微信开发工具的pc模拟器有可能出现拖动数据错乱,使用真机正常
......@@ -227,4 +227,4 @@ export default {
**注意**
- 在picker内容还在滚动时或滚动回弹动画还未结束时,点确定关闭弹出的picker,数据无法及时更新。需等待一下,或手动触停滚动再点确定。所有平台均如此
- app-nvue 平台,mode 目前仅支持 ``selector`` ``time`` ``date``
\ No newline at end of file
- app-nvue 平台,mode 目前仅支持 ``selector`` ``time`` ``date``
......@@ -2,7 +2,7 @@
app端nvue专用组件。
`<recycle-list>` 是一个新的列表容器,具有回收和复用的能力,可以大幅优化内存占用和渲染性能。
`<recycle-list>` 是一个新的列表容器,具有回收和复用的能力,可以大幅优化内存占用和渲染性能。它的性能比list组件更高,但写法受限制。它除了会释放不可见区域的渲染资源,在非渲染的数据结构上也有更多优化。
此组件自HBuilderX 2.1.5+起支持。
......
......@@ -2,7 +2,7 @@
app端nvue专用组件。
`<refresh>` 为容器提供下拉刷新功能。
`<refresh>` 为容器提供下拉刷新功能。在nvue上,可通过此组件实现灵活的、自定义的、高性能的下拉刷新。
> 注意
......@@ -14,9 +14,9 @@ app端nvue专用组件。
<refresh>
<text>Refreshing...</text>
</refresh>
<div v-for="num in lists">
<view v-for="num in lists">
<text>{{num}}</text>
</div>
</view>
</scroll-view>
```
......
......@@ -7,12 +7,12 @@
|:-|:-|:-|:-|
|nodes|Array / String|[]|节点列表 / HTML String|
**注意**
**注意**
- app-nvue 平台 nodes 属性只支持使用 Array 类型
- 支付宝小程序 nodes 属性只支持使用 Array 类型。
- 支付宝小程序 nodes 属性只支持使用 Array 类型。
如果需要支持 HTML String,则需要自己将 HTML String转化为 nodes 数组,可使用 [html-parser](https://github.com/dcloudio/hello-uniapp/blob/master/common/html-parser.js) 转换。
支持默认事件,包括:click、touchstart、touchmove、touchcancel、touchend、longpress。
......@@ -136,9 +136,9 @@ export default {
**Tips**
- nodes 不推荐使用 String 类型,性能会有所下降。
- rich-text 组件内屏蔽所有节点的事件。所以如果内容中有链接、图片需要点击,则不能使用rich-text,此时可在[uni-app插件市场](https://ext.dcloud.net.cn/)搜索uparse插件使用。
- rich-text 组件内屏蔽所有节点的事件。所以如果内容中有链接、图片需要点击,则不能使用rich-text,此时可在[uni-app插件市场](https://ext.dcloud.net.cn/)搜索uparse插件使用。app-nvue的rich-text组件支持链接图片点击,且nvue下不能使用uparse等插件。
- attrs 属性不支持 id ,支持 class 。
- name 属性大小写不敏感。
- 如果使用了不受信任的HTML节点,该节点及其所有子节点将会被移除。
- img 标签仅支持网络图片。
- 如果在自定义组件中使用 rich-text 组件,那么仅自定义组件的 css 样式对 rich-text 中的 class 生效。
\ No newline at end of file
- 如果在自定义组件中使用 rich-text 组件,那么仅自定义组件的 css 样式对 rich-text 中的 class 生效。
......@@ -8,20 +8,28 @@
|:-|:-|:-|:-|:-|
|indicator-dots|Boolean|false|是否显示面板指示点||
|indicator-color|Color|rgba(0, 0, 0, .3)|指示点颜色||
|indicator-active-color|Color|#000000|当前选中的指示点颜色||
|indicator-active-color|Color|#000000|当前选中的指示点颜色||
|active-class|String||swiper-item 可见时的 class|支付宝小程序|
|changing-class|String||acceleration 设置为 {{true}} 时且处于滑动过程中,中间若干屏处于可见时的class|支付宝小程序|
|autoplay|Boolean|false|是否自动切换||
|current|Number|0|当前所在滑块的 index||
|current-item-id|String||当前所在滑块的 item-id ,不能与 current 被同时指定|微信小程序、5+App、H5、百度小程序、头条小程序|
|current-item-id|String||当前所在滑块的 item-id ,不能与 current 被同时指定|支付宝小程序不支持|
|interval|Number|5000|自动切换时间间隔||
|duration|Number|500|滑动动画时长||
|circular|Boolean|false|是否采用衔接滑动||
|vertical|Boolean|false|滑动方向是否为纵向||
|previous-margin|String|0px|前边距,可用于露出前一项的一小部分,接受 px 和 rpx 值|头条小程序不支持|
|next-margin|String|0px|后边距,可用于露出后一项的一小部分,接受 px 和 rpx 值|头条小程序不支持|
|display-multiple-items|Number|1|同时显示的滑块数量|微信小程序、5+App、H5、百度小程序、头条小程序|
|skip-hidden-item-layout|Boolean|false|是否跳过未显示的滑块布局,设为 true 可优化复杂情况下的滑动性能,但会丢失隐藏状态滑块的布局信息|微信小程序、5+App|
|@change|EventHandle||current 改变时会触发 change 事件,event.detail = {current: current, source: source}||
|@animationfinish|EventHandle||动画结束时会触发 animationfinish 事件,event.detail 同上|头条小程序不支持|
|next-margin|String|0px|后边距,可用于露出后一项的一小部分,接受 px 和 rpx 值|头条小程序不支持|
|acceleration|Boolean|false|当开启时,会根据滑动速度,连续滑动多屏|支付宝小程序|
|disable-programmatic-animation|Boolean|false|是否禁用代码变动触发 swiper 切换时使用动画。|支付宝小程序|
|display-multiple-items|Number|1|同时显示的滑块数量|支付宝小程序不支持|
|skip-hidden-item-layout|Boolean|false|是否跳过未显示的滑块布局,设为 true 可优化复杂情况下的滑动性能,但会丢失隐藏状态滑块的布局信息|5+App、微信小程序|
|disable-touch|Boolean|false|是否禁止用户 touch 操作|支付宝小程序|
|touchable|Boolean|true|是否监听用户的触摸事件|头条小程序|
|easing-function|String|default|指定 swiper 切换缓动动画类型,有效值:default、linear、easeInCubic、easeOutCubic、easeInOutCubic|微信小程序|
|@change|EventHandle||current 改变时会触发 change 事件,event.detail = {current: current, source: source}||
|@transition|EventHandle||swiper-item 的位置发生改变时会触发 transition 事件,event.detail = {dx: dx, dy: dy}|5+App、H5、微信小程序、支付宝小程序、头条小程序、QQ小程序|
|@animationfinish|EventHandle||动画结束时会触发 animationfinish 事件,event.detail = {current: current, source: source}|头条小程序不支持|
change 事件返回 detail 中包含一个 source 字段,表示导致变更的原因,可能值如下:
......
......@@ -139,7 +139,7 @@ export default {
* 其他端无法全屏后自行绘制内容
- 如何实现抖音、映客等全屏视频垂直滑动切换效果?
* 微信基础库 2.4.0 和app端nvue 2.1.5 以上,可通过在垂直的swiper中内嵌video来实现。原生导航栏设置为custom,视频长宽设为手机屏幕大小,通过cover-view覆盖视频内容。
* 微信基础库 2.4.0 和 app端nvue 2.1.5 以上,可通过在垂直的swiper中内嵌video来实现。原生导航栏设置为custom,视频长宽设为手机屏幕大小,通过cover-view覆盖视频内容。插件市场有相关[示例](https://ext.dcloud.net.cn/search?q=%E6%8A%96%E9%9F%B3)
- `<video/>` 组件在非H5端是原生组件,层级高于普通前端组件,覆盖其需要使用[cover-view](https://uniapp.dcloud.io/component/cover-view?id=cover-view)组件或plus.nativeObj.view、subNVue。微信基础库 2.4.0 起已支持 video 组件的同层渲染,也就是video在非全屏时,可以被前端元素通过调节zindex来遮挡,但video全屏时,仍需要cover-view覆盖。
- 除微信基础库 2.4.0 和app端nvue页面 2.1.5 以上,其他情况下非H5的video不能放入scroll-view和swiper。注意参考 [原生组件使用限制](/component/native-component)
......
......@@ -4,6 +4,8 @@ app端nvue专用组件。
`<waterfall>` 组件是提供瀑布流布局的核心组件。瀑布流,又称瀑布流式布局是比较流行的一种页面布局,视觉表现为参差不齐的多栏布局。随着页面滚动条向下滚动,这种布局还可以不断加载数据块并附加至当前尾部。
使用普通view做瀑布流,无法实现重用和不可见渲染资源释放。使用<waterfall>组件,指定cell后,原生引擎会自动优化性能。
```
<template>
<waterfall column-count="2" column-width="auto">
......
......@@ -14,10 +14,10 @@
**src**
|来源|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|
|:-|:-:|:-:|:-:|:-:|:-:|:-:|
|网络|√|√|√|√|√|√|
|本地|√|暂不支持|x|x|x|x|
|来源|5+App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|:-|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|网络|√|√|√|√|√|√|√|
|本地|√|暂不支持|x|x|x|x|x|
**webview-styles**
......@@ -239,4 +239,4 @@ Q:web-view 的页面怎么和应用内的页面交互?
A:调用 uni 相关的 API,就可以实现页面切换及发送消息。参考:[在 web-view 加载的 HTML 中调用 uni 的 API](https://ask.dcloud.net.cn/article/35083)
Q:web-view 加载的 HTML 中,能够调用 5+ 的能力么?
A:加载的 HTML 中是有 5+ 环境的,在 plusready 后调用即可。参考:[一个简单实用的 plusready 方法](https://ask.dcloud.net.cn/article/34922)
\ No newline at end of file
A:加载的 HTML 中是有 5+ 环境的,在 plusready 后调用即可。参考:[一个简单实用的 plusready 方法](https://ask.dcloud.net.cn/article/34922)
......@@ -348,7 +348,7 @@ uni-app 提供内置 CSS 变量
|CSS变量|描述|5+App|小程序|H5|
|:-|:-|:-|:-|:-|
|--status-bar-height|系统状态栏高度|[系统状态栏高度](http://www.html5plus.org/doc/zh_cn/navigator.html#plus.navigator.getStatusbarHeight)|25px|0|
|--status-bar-height|系统状态栏高度|[系统状态栏高度](http://www.html5plus.org/doc/zh_cn/navigator.html#plus.navigator.getStatusbarHeight)、nvue注意见下|25px|0|
|--window-top|内容区域距离顶部的距离|0|0|NavigationBar 的高度|
|--window-bottom|内容区域距离底部的距离|0|0|TabBar 的高度|
......@@ -357,14 +357,14 @@ uni-app 提供内置 CSS 变量
- ``var(--status-bar-height)`` 此变量在微信小程序环境为固定 ``25px``,在 5+App 里为手机实际状态栏高度。
- 当设置 ``"navigationStyle":"custom"`` 取消原生导航栏后,由于窗体为沉浸式,占据了状态栏位置。此时可以使用一个高度为 ``var(--status-bar-height)`` 的 view 放在页面顶部,避免页面内容出现在状态栏。
- 由于在H5端,不存在原生导航栏和tabbar,也是前端div模拟。如果设置了一个固定位置的居底view,在小程序和App端是在tabbar上方,但在H5端会与tabbar重叠。此时可使用`--window-bottom`,不管在哪个端,都是固定在tabbar上方。
- 目前 nvue 还不支持css变量
- 目前 nvue 在App端,还不支持 `--status-bar-height`变量,替代方案是在页面onLoad时通过uni.getSystemInfoSync().statusBarHeight获取状态栏高度,然后通过style绑定方式给占位view设定高度。下方提供了示例代码
**代码块**
快速书写css变量的方法是:在css中敲hei,在候选助手中即可看到3个css变量。(HBuilderX 1.9.6以上支持)
示例:
示例1 - 普通页面使用css变量
```html
<template>
......@@ -398,6 +398,28 @@ uni-app 提供内置 CSS 变量
</style>
```
示例2 - nvue页面获取状态栏高度
```html
<template>
<view class="content">
<view :style="{ height: iStatusBarHeight + 'px'}"></view>
</view>
</template>
<script>
export default {
data() {
return {
iStatusBarHeight:0
}
},
onLoad() {
this.iStatusBarHeight = uni.getSystemInfoSync().statusBarHeight
}
}
</script>
```
### 固定值
`uni-app` 中以下组件的高度是固定的,不可修改:
......@@ -913,10 +935,198 @@ slide-view.vue
详细的小程序转uni-app语法差异可参考文档[https://ask.dcloud.net.cn/article/35786](https://ask.dcloud.net.cn/article/35786)。
## WXS
WXS是微信小程序的一套脚本语言,[规范详见](https://developers.weixin.qq.com/miniprogram/dev/framework/view/wxs/)。
uni-app可以将wxs代码编译到微信小程序、QQ小程序、5+APP上(`HBuilderX 2.2.4-alpha`及以上版本)
与wxs类似,百度小程序提供了Filter、阿里小程序提供了SJS,uni-app也支持使用这些功能,并将它们编译到百度和阿里的小程序端。不过它们的功能还不如wxs强大。此外头条系小程序自身不支持类似功能。
**wxs示例**
以下是一些使用 WXS 的简单示例,要完整了解 WXS 语法,请参考[WXS 语法参考](https://developers.weixin.qq.com/miniprogram/dev/reference/wxs/)。本示例使用wxs响应touchmove事件,减少视图层与逻辑层通信,使滑动更加丝滑。
```html
<template>
<view>
<view class="area">
<view @touchstart="test.touchstart" @touchmove="test.touchmove" class="movable">{{test.msg}}</view>
</view>
</view>
</template>
<wxs module="test">
var startX = 0
var startY = 0
var lastLeft = 50; var lastTop = 50
function touchstart(event, ins) {
console.log("touchstart")
var touch = event.touches[0] || event.changedTouches[0]
startX = touch.pageX
startY = touch.pageY
}
function touchmove(event, ins) {
var touch = event.touches[0] || event.changedTouches[0]
var pageX = touch.pageX
var pageY = touch.pageY
var left = pageX - startX + lastLeft
var top = pageY - startY + lastTop
startX = pageX
startY = pageY
lastLeft = left
lastTop = top
ins.selectComponent('.movable').setStyle({
left: left + 'px',
top: top + 'px'
})
return false
}
module.exports = {
msg: 'Hello',
touchstart: touchstart,
touchmove: touchmove
}
</wxs>
<script>
export default {
data() {
return {
}
},
methods: {
}
}
</script>
<style>
.area{
position: absolute;
width: 100%;
height: 100%;
}
.movable{
position: absolute;
width: 100px;
height: 100px;
left: 50px;
top: 50px;
color: white;
text-align: center;
line-height: 100px;
background-color: red;
}
</style>
```
支付宝小程序,百度小程序官方暂未支持事件响应,不过也可以使用对应的SJS、Filter过滤器实现一些数据处理的操作,以下代码展示了一个时间格式化的小功能
index.vue
```html
<template>
<view>
<view>
{{timestr}} 是
</view>
<view>
{{utils.friendlyDate(timestamp)}}
</view>
</view>
</template>
<filter module="utils" src="./utils.filter.js"></filter>
<import-sjs module="utils" src="./utils.sjs" />
<script>
export default {
data() {
return {
timestr: '2019/08/22 10:10:10',
timestamp: 0
}
},
created() {
this.timestamp = new Date(this.timestr).getTime()
},
methods: {
}
}
</script>
```
utils.sjs 与 utils.filter.js
```js
export default {
friendlyDate: (timestamp) => {
var formats = {
'year': '%n% 年前',
'month': '%n% 月前',
'day': '%n% 天前',
'hour': '%n% 小时前',
'minute': '%n% 分钟前',
'second': '%n% 秒前',
};
var now = Date.now();
var seconds = Math.floor((now - parseInt(timestamp)) / 1000);
var minutes = Math.floor(seconds / 60);
var hours = Math.floor(minutes / 60);
var days = Math.floor(hours / 24);
var months = Math.floor(days / 30);
var years = Math.floor(months / 12);
var diffType = '';
var diffValue = 0;
if (years > 0) {
diffType = 'year';
diffValue = years;
} else {
if (months > 0) {
diffType = 'month';
diffValue = months;
} else {
if (days > 0) {
diffType = 'day';
diffValue = days;
} else {
if (hours > 0) {
diffType = 'hour';
diffValue = hours;
} else {
if (minutes > 0) {
diffType = 'minute';
diffValue = minutes;
} else {
diffType = 'second';
diffValue = seconds === 0 ? (seconds = 1) : seconds;
}
}
}
}
}
return formats[diffType].replace('%n%', diffValue);
}
}
```
**注意**
- **重要**编写wxs、sjs、filter.js 内容时必须遵循相应语法规范
- 目前各个小程序正在完善相关规范,可能会有较大改动,请务必仔细阅读相应平台的文档
- 支付宝小程序请使用sjs规范,[详见](https://docs.alipay.com/mini/framework/sjs)
- 支付宝小程序sjs只能定义在.sjs 文件中。然后使用```<import-sjs>```标签引入
- 支付宝小程序import-sjs的标签属性```name```、```from```被统一为了```module```、```src```以便后续实现多平台统一写法
- 百度小程序中请使用Filter规范,[详见](https://smartprogram.baidu.com/docs/develop/framework/view_filter/)
- 百度小程序Filter只能导出function函数
- 暂不支持在 wxs、sjs、filter.js 中调用其他同类型文件
- wxs、filter.js既能内联使用又可以外部引入,sjs只能外部引入
- mp-qq 目前对内联的 wxs 支持不好,部分写法会导致编译出错
- 在微信自定义组件中(wxcomponents)也可以使用wxs
## 致谢
```uni-app```的设计使用了 ```vue + 自定义组件``` 的模式;开发者使用```Vue```语法,了解```uni-app```的组件,就可以开发跨端App;感谢```Vue```团队!
为了照顾开发者的已有学习积累,```uni-app```的组件和api设计,基本参考了微信小程序,学过微信小程序开发,了解```vue```,就能直接上手```uni-app```;感谢微信小程序团队!
```uni-app``` 在小程序端,学习参考了[mpvue](http://mpvue.com/)[Megalo](https://megalojs.org/),感谢美团点评技术团队、网易考拉团队!
```uni-app``` 在小程序端,学习参考了[mpvue](https://mpvue.com/)[Megalo](https://megalojs.org/),感谢美团点评技术团队、网易考拉团队!
......@@ -187,3 +187,6 @@ H5没有原生组件概念问题,非H5端有原生组件并引发了原生组
* ``getSystemInfo`` 获取到的 ``windowHeight`` 在模拟器中值不正确,真机预览是正确的。
* ``v-if````v-for`` 不可在同一标签下同时使用。
* 页面中引入自定义组件时,渲染的结果中外层会有一个 ``template`` 标签,这会导致部分选择器对应的样式匹配不上。
### 各家小程序的浏览器内核不同,会造成css兼容性问题
查阅细节参考:[https://ask.dcloud.net.cn/article/1318](https://ask.dcloud.net.cn/article/1318)
......@@ -218,6 +218,8 @@ npm run build:%PLATFORM%
|mp-toutiao|头条小程序|
|mp-qq|qq 小程序|
可以自定义更多条件编译平台,比如钉钉小程序,参考[package.json文档](https://uniapp.dcloud.io/collocation/package)
**其他:**
* dev 模式编译出的各平台代码存放于根目录下的 ``/dist/dev/``目录,打开各平台开发工具选择对应平台目录即可进行预览(h5 平台不会在此目录,存在于缓存中);
......@@ -237,10 +239,10 @@ npm run build:%PLATFORM%
* ``cli``版如果想安装less、scss、ts等编译器,需自己手动npm安装。在HBuilderX的插件管理界面安装无效,那个只作用于HBuilderX创建的项目。
#### 开发工具的区别
* ``cli``创建的项目,内置了d.ts,同其他常规npm库一样,可在vscode、webstorm等支持d.ts的开发工具里正常开发并有语法提示。
* 使用HBuilderX创建的项目不带d.ts,拖到其他工具里不会有代码提示。此时可以在项目下执行 ``npm i @types/uni-app -D``,来补充d.ts
* ``cli``创建的项目,内置了d.ts,同其他常规npm库一样,可在[vscode](https://ask.dcloud.net.cn/article/36286)[webstorm](https://ask.dcloud.net.cn/article/36307)等支持d.ts的开发工具里正常开发并有语法提示。
* 使用HBuilderX创建的项目不带d.ts,此时可以在项目下执行 ``npm i @types/uni-app -D``,来补充d.ts
* 但vscode等其他开发工具,在vue或uni-app领域,开发效率比不过HBuilderX。详见:[https://ask.dcloud.net.cn/article/35451](https://ask.dcloud.net.cn/article/35451)
* 发布App时,仍然需要使用HBuilderX。其他开发工具无法发布App,但可以发布H5、各种小程序。
* 发布App时,仍然需要使用HBuilderX。其他开发工具无法发布App,但可以发布H5、各种小程序。如需开发App,可以先在HBuilderX里运行起来,然后在其他编辑器里修改保存代码,代码修改后会自动同步到手机基座。
* 如果使用``cli``创建项目,那下载HBuilderX时只需下载10M的标准版即可。因为编译器已经安装到项目下了。
*`cli` 使用有疑问,欢迎扫码加入 uni-app 微信交流群讨论:
<br/><img src="http://img.cdn.aliyun.dcloud.net.cn/guide/uniapp/wx-barcode.png" width="250"/>
......@@ -10,14 +10,43 @@
如果你已经是 weex 的开发者,具有 weex 的填坑能力,那么 nvue 是你的更优选择,能切实提升你的开发效率,降低成本。
如果你不开发App,那么你不太需要nvue。
如果你是web前端,不熟悉 weex,那么建议你仍然以使用 vue 为主,在App端某些 vue 表现不佳的场景下使用 nvue 作为强化补充:
- 左右拖动的长列表。在webview里,通过swiper+scroll-view实现左右拖动的长列表,前端模拟下拉刷新,这套方案的性能不好。此时推荐使用nvue,比如新建uni-app项目时的新闻示例模板,就是首页采用了nvue
- 为了解决 vue 页面的原生控件层级问题和原生导航栏的灵活自定义问题,uni-app 还提供了 subnvue 方案,将一个非全屏的 nvue 页面覆盖到 vue 页面上,[详见](https://ask.dcloud.net.cn/article/35948)
- 如需要将软键盘右下角按钮文字改为“发送”,则需要使用nvue
- 前端控件无法覆盖原生控件的问题。在nvue下,都是原生控件,覆盖map、video等不需要cover-view(如需要发布到小程序,仍然推荐写cover-view)
- 同样因为层级问题得到解决,nvue可以实现video内嵌到swiper中,以实现抖音式视频滑动切换,例子见[插件市场](https://ext.dcloud.net.cn/plugin?id=664);nvue的视频全屏后,仍然可以通过cover-view实现内容覆盖,比如增加文字标题、分享按钮。
- nvue下有live-pusher组件,和小程序对齐。而vue页面下使用直播,需在条件编译里单独调用plus.video的API。
- nvue下的map组件,小程序对齐。而vue页面的map组件有一些差异。
- App端实现粘性布局,比如滚动吸顶,则nvue才能保证高性能,例子见[插件市场](https://ext.dcloud.net.cn/plugin?id=715)
此外,App端,vue页面上也可以覆盖subnvue(一种非全屏的nvue页面覆盖在webview上),以解决App上的原生控件层级问题。[详见](https://ask.dcloud.net.cn/article/35948)
## 项目渲染模式
uni-app在App端,支持vue页面和nvue页面混搭、互相跳转。也支持纯nvue项目。
在manifest.json源码视图的`"app-plus"`下配置`"renderer":"native"`,即代表App端启用纯原生渲染模式。此时pages.json注册的vue页面将被忽略,vue组件中的代码也需覆盖nvue规范,并会被原生渲染。
启动纯原生渲染,可以减少App端的包体积、加快App启动速度。因为webview渲染模式的相关模块将被移除。
如果不指定该值,默认是不启动纯原生渲染的。
```json
// manifest.json
{
// ...
/* App平台特有配置 */
"app-plus": {
"renderer": "native", //App端纯原生渲染模式
}
}
```
## 编译模式差异
## nvue页面编译模式差异
uni-app 深度改进了 weex,提供了2种编译模式,一种是常规的 weex 组件模式,即编写`<div>`。另一种是 uni-app 组件模式,即编写`<view>`。后者更提供了编译为小程序和H5的能力。
uni-app 深度改进了 weex,提供了2种编译模式,一种是常规的 weex 组件模式,即编写`<div>`。另一种是 uni-app 组件模式,即编写`<view>`。后者更提供了编译为小程序和H5的能力,实现了全端输出
也可以理解为uni-app做了一个原生渲染的小程序引擎。
......@@ -31,7 +60,7 @@ uni-app 深度改进了 weex,提供了2种编译模式,一种是常规的 we
|全局样式 |手动引入 |app.vue的样式即为全局样式 |
|页面滚动 |必须给页面套<list>或<scroller>组件 |默认支持页面滚动 |
修改2种编译模式的在 manifest.json 中,`manifest.json` -> `app-plus` -> `nvueCompiler` 切换编译模式。
在 manifest.json 中修改2种编译模式,`manifest.json` -> `app-plus` -> `nvueCompiler` 切换编译模式。
`nvueCompiler` 有两个值:
- weex
......@@ -50,21 +79,19 @@ uni-app 深度改进了 weex,提供了2种编译模式,一种是常规的 we
```
* 如果没有在manifest里明确配置,默认是weex模式。这是为了向下兼容。
* 当前uni-app编译模式组件还不够完整,详细列表见 [https://ask.dcloud.net.cn/article/36074](https://ask.dcloud.net.cn/article/36074),但已经可满足常用场景。比如左右拖动的长列表场景推荐使用uni-app编译模式的nvue,其他页面仍然可使用 vue 页面。新建uni-app项目选模板`新闻/资讯模板`,这是一个nvue页面可编译到全平台的示例。
## 快速上手
### 1. 新建 nvue 页面
``uni-app`` 项目中,选中文件或文件夹,鼠标右击选择新建 ``nvue`` 文件输入文件名创建。
HBuilderX的 ``uni-app`` 项目中,新建页面,弹出界面右上角可以选择是建立vue页面还是nvue页面,或者2个同时建。
不管是vue页面还是nvue页面,都需要在pages.json中注册。
不管是vue页面还是nvue页面,都需要在pages.json中注册。如果在HBuilderX中新建页面是会自动注册的,如果使用其他编辑器,则需要自行在pages.json里注册。
如果一个页面路由下同时有vue页面和nvue页面,那么在App端,会优先使用nvue页面。
如果一个页面路由下同时有vue页面和nvue页面,即出现同名的vue和nvue文件。那么在App端,会优先使用nvue页面,同名的vue文件将不会被编译到App端。而在非App端,会优先使用vue页面。
在非app端,只有uni-app编译模式的nvue才会编译。
如果不同名,只有nvue页面,则在非app端,只有uni-app编译模式的nvue文件才会编译。
![](https://img-cdn-qiniu.dcloud.net.cn/uniapp/doc/created-nvue.png)
### 2. 开发 nvue 页面
......@@ -118,7 +145,7 @@ uni-app 深度改进了 weex,提供了2种编译模式,一种是常规的 we
### 3. 调试 nvue 页面
HBuilderX内置了更好用的weex/uni-app调试工具,[详见](https://uniapp.dcloud.io/snippet?id=%e5%85%b3%e4%ba%8e-app-%e7%9a%84%e8%b0%83%e8%af%95)
HBuilderX内置了更好用的weex/uni-app调试工具,包括审查界面元素、看log、debug打断点,[详见](https://uniapp.dcloud.io/snippet?id=%e5%85%b3%e4%ba%8e-app-%e7%9a%84%e8%b0%83%e8%af%95)
## 生命周期
......@@ -343,6 +370,7 @@ Tis:
* 使用方式可参考 [BindingX 快速开始](https://alibaba.github.io/bindingx/guide/cn_guide_start),demo示例可参考 [BindingX 示例](https://alibaba.github.io/bindingx/demos)``vue`` 的相关示例,将实验田里的 ``vue`` 代码拷贝到 ``nvue`` 文件里即可。
* 若引入 weex-bindingx 时发现不生效,检查项目路径,路径不能含有中文。
* 使用npm时如果命令行报错,需要注意看命令行的提示
**代码示例**
......@@ -556,152 +584,152 @@ App.vue
```
## nvue 里可使用的 uni-app API
`nvue` 支持大部分 uni-app API ,下面只列举目前还不支持的 API 。
**地图**
|API|说明|
|:-|:-|
|uni.createMapContext()|创建并返回 map 上下文|
**视频**
|API|说明|
|:-|:-|
|uni.createVideoContext()|创建并返回 video 上下文|
**直播推流**
|API|说明|
|:-|:-|
|uni.createLivePusherContext()|创建并返回 livePusher 上下文|
**动画**
|API|说明|
|:-|:-|
|uni.createAnimation()|创建一个动画实例|
**滚动**
|API|说明|
|:-|:-|
|uni.pageScrollTo()|将页面滚动到目标位置|
**绘画**
|API|说明|
|:-|:-|
|uni.createCanvasContext()|创建 canvas 绘图上下文|
|uni.canvasToTempFilePath()|把当前画布指定区域的内容导出生成指定大小的图片,并返回文件路径|
|uni.canvasGetImageData()|返回一个数组,用来描述 canvas 区域隐含的像素数据|
|uni.canvasPutImageData()|将像素数据绘制到画布的方法|
**下拉刷新**
|API|说明|
|:-|:-|
|uni.onPullDownRefresh()|监听该页面用户下拉刷新事件|
|uni.startPullDownRefresh()|开始下拉刷新|
|uni.stopPullDownRefresh()|停止当前页面下拉刷新|
**节点信息**
|API|说明|
|:-|:-|
|uni.createSelectorQuery()|返回一个 SelectorQuery 对象实例|
**节点布局交互**
|API|说明|
|:-|:-|
|uni.createIntersectionObserver()|创建并返回一个 IntersectionObserver 对象实例|
#### nvue的新增API
为了解决nvue的weex编译模式不支持uni-app生命周期的问题,`在nvue` 里新增了几个特殊的 API。如果是uni-app编译模式,无需使用这些API:
##### uni.onNavigationBarButtonTap(CALLBACK)@onNavigationBarButtonTap
监听原生标题栏按钮点击事件。
CALLBACK 参数说明:
|属性|类型|说明|
|---|---|---|
|index|Number|原生标题栏按钮数组的下标|
**代码示例**
```javascript
export default {
created() {
uni.onNavigationBarButtonTap((e) => {
console.log("监听到原生标题栏按钮点击事件");
console.log(e);
})
}
}
```
##### uni.onNavigationBarSearchInputChanged(CALLBACK)
监听原生标题栏搜索输入框输入内容变化事件。
CALLBACK 参数说明:
|属性|类型|说明|
|---|---|---|
|text|String|搜索输入框输入内容|
**代码示例**
```javascript
export default {
created() {
uni.onNavigationBarSearchInputChanged((e) => {
console.log("输入内容:"+ e.text);
})
}
}
```
##### uni.onNavigationBarSearchInputConfirmed()
监听原生标题栏搜索输入框搜索事件,用户点击软键盘上的“搜索”按钮时触发。
**代码示例**
```javascript
export default {
created() {
uni.onNavigationBarSearchInputConfirmed(() => {
console.log("用户点击软键盘搜索");
})
}
}
```
##### uni.onNavigationBarSearchInputClicked()
监听原生标题栏搜索输入框点击事件。
**代码示例**
```javascript
export default {
created() {
uni.onNavigationBarSearchInputClicked(() => {
console.log("点击输入框");
})
}
}
```
`nvue` 支持大部分 uni-app API ,下面只列举目前还不支持的 API 。
**地图**
|API|说明|
|:-|:-|
|uni.createMapContext()|创建并返回 map 上下文|
**视频**
|API|说明|
|:-|:-|
|uni.createVideoContext()|创建并返回 video 上下文|
**直播推流**
|API|说明|
|:-|:-|
|uni.createLivePusherContext()|创建并返回 livePusher 上下文|
**动画**
|API|说明|
|:-|:-|
|uni.createAnimation()|创建一个动画实例|
**滚动**
|API|说明|
|:-|:-|
|uni.pageScrollTo()|将页面滚动到目标位置|
**绘画**
|API|说明|
|:-|:-|
|uni.createCanvasContext()|创建 canvas 绘图上下文|
|uni.canvasToTempFilePath()|把当前画布指定区域的内容导出生成指定大小的图片,并返回文件路径|
|uni.canvasGetImageData()|返回一个数组,用来描述 canvas 区域隐含的像素数据|
|uni.canvasPutImageData()|将像素数据绘制到画布的方法|
**下拉刷新**
|API|说明|
|:-|:-|
|uni.onPullDownRefresh()|监听该页面用户下拉刷新事件|
|uni.startPullDownRefresh()|开始下拉刷新|
|uni.stopPullDownRefresh()|停止当前页面下拉刷新|
**节点信息**
|API|说明|
|:-|:-|
|uni.createSelectorQuery()|返回一个 SelectorQuery 对象实例|
**节点布局交互**
|API|说明|
|:-|:-|
|uni.createIntersectionObserver()|创建并返回一个 IntersectionObserver 对象实例|
#### nvue的新增API
为了解决nvue的weex编译模式不支持uni-app生命周期的问题,`在nvue` 里新增了几个特殊的 API。如果是uni-app编译模式,无需使用这些API:
##### uni.onNavigationBarButtonTap(CALLBACK)@onNavigationBarButtonTap
监听原生标题栏按钮点击事件。
CALLBACK 参数说明:
|属性|类型|说明|
|---|---|---|
|index|Number|原生标题栏按钮数组的下标|
**代码示例**
```javascript
export default {
created() {
uni.onNavigationBarButtonTap((e) => {
console.log("监听到原生标题栏按钮点击事件");
console.log(e);
})
}
}
```
##### uni.onNavigationBarSearchInputChanged(CALLBACK)
监听原生标题栏搜索输入框输入内容变化事件。
CALLBACK 参数说明:
|属性|类型|说明|
|---|---|---|
|text|String|搜索输入框输入内容|
**代码示例**
```javascript
export default {
created() {
uni.onNavigationBarSearchInputChanged((e) => {
console.log("输入内容:"+ e.text);
})
}
}
```
##### uni.onNavigationBarSearchInputConfirmed()
监听原生标题栏搜索输入框搜索事件,用户点击软键盘上的“搜索”按钮时触发。
**代码示例**
```javascript
export default {
created() {
uni.onNavigationBarSearchInputConfirmed(() => {
console.log("用户点击软键盘搜索");
})
}
}
```
##### uni.onNavigationBarSearchInputClicked()
监听原生标题栏搜索输入框点击事件。
**代码示例**
```javascript
export default {
created() {
uni.onNavigationBarSearchInputClicked(() => {
console.log("点击输入框");
})
}
}
```
## nvue开发与vue开发的常见区别
基于原生引擎的渲染,虽然还是前端技术栈,但和web开发肯定是有区别的。
......@@ -710,11 +738,11 @@ export default {
但仍然还有一些区别需要注意:
- nvue 页面只能使用 flex 布局,不支持其他布局方式。需要注意的是 weex 的 flex 默认为竖向排列,即 ``flex-direction: column``,这与 html 的 flex 默认为横向排列不同。在 nvue 编译为 uni-app模式时,纠正了这个问题,flex 方向默认改为横向排列。
- nvue 页面只能使用 flex 布局,不支持其他布局方式。
- weex 下,页面内容高过屏幕高度并不会自动滚动,它没有页面滚动的概念,只有区域滚动,要滚得内容需要套在<scroller>组件下。在 nvue 编译为 uni-app模式时,纠正了这个问题,页面内容过高会自动滚动。
- weex 下,px是与屏幕宽度相关的动态单位,750px代表成屏幕宽度100%,它的静态单位是wx。在 nvue 编译为 uni-app模式时,纠正了这个问题,rpx是与屏幕宽度相关的动态单位,px是静态单位。
- 页面开发前,首先想清楚这个页面的纵向内容有什么,哪些是要滚动的,然后每个纵向内容的横轴排布有什么,按 flex 布局设计好界面。
- 文字内容,必须、只能在<text>组件下。不能在<div>的text里写文字。
- 文字内容,必须、只能在<text>组件下。不能在<div><view>的text区域里直接写文字。
- 支持的css有限,不过并不影响布局出你需要的界面,flex还是非常强大的。[详见](https://weex.apache.org/zh/docs/styles/common-styles.html#%E7%9B%92%E6%A8%A1%E5%9E%8B)
- class 进行绑定时只支持数组语法。
......@@ -732,5 +760,4 @@ export default {
- nvue 切换横竖屏时可能导致样式出现问题,建议有 nvue 的页面锁定手机方向。
- 不能在 style 中引入字体文件,nvue 中字体图标的使用参考:[weex 加载自定义字体](https://weex.apache.org/zh/docs/modules/dom.html#addrule)
- 目前不支持在 nvue 页面使用 typescript/ts。
- HBuilderX 1.9.8以前,nvue 不支持运行在Android三方模拟器上。HBuilderX 2.1以前,nvue不支持less等css预编译器。
- nvue 页面 ``titleNview`` 设为 ``false``时,想要模拟状态栏,可以参考:[https://ask.dcloud.net.cn/article/35111](https://ask.dcloud.net.cn/article/35111)
\ No newline at end of file
- nvue 页面 ``titleNview`` 设为 ``false``时,想要模拟状态栏,可以参考:[https://ask.dcloud.net.cn/article/35111](https://ask.dcloud.net.cn/article/35111)
......@@ -817,6 +817,27 @@ var serviceContext = (function () {
}
const callbacks = {};
const WEB_INVOKE_APPSERVICE = 'WEB_INVOKE_APPSERVICE';
// 简单处理 view 层与 service 层的通知系统
/**
* 消费 view 层通知
*/
function consumePlusMessage (type, args) {
// 处理 web-view 组件发送的通知
if (type === WEB_INVOKE_APPSERVICE) {
publish(WEB_INVOKE_APPSERVICE, args.data, args.webviewIds);
return true
}
const callback = callbacks[type];
if (callback) {
callback(args);
if (!callback.keepAlive) {
delete callbacks[type];
}
return true
}
return false
}
/**
* 注册 view 层通知 service 层事件处理
*/
......@@ -1368,6 +1389,16 @@ var serviceContext = (function () {
publish('onKeyboardHeightChange', {
height: event.height
});
});
plus.globalEvent.addEventListener('plusMessage', function (e) {
if (process.env.NODE_ENV !== 'production') {
console.log('UNIAPP[plusMessage]:[' + Date.now() + ']' + JSON.stringify(e.data));
}
if (e.data && e.data.type) {
const type = e.data.type;
consumePlusMessage(type, e.data.args || {});
}
});
}
......@@ -4717,12 +4748,12 @@ var serviceContext = (function () {
barcode.scan(file, (type, code) => {
if (isDark) {
plus.navigator.setStatusBarStyle('isDark');
}
webview.close('auto');
result = {
type,
code
}
result = {
type,
code
};
webview.close('auto');
}, () => {
plus.nativeUI.toast('识别失败');
}, filters);
......@@ -4763,7 +4794,7 @@ var serviceContext = (function () {
});
});
webview.addEventListener('close', () => {
if (result && 'code' in result) {
if (result) {
invoke(callbackId, {
result: result.code,
scanType: SCAN_MAPS[result.type] || '',
......@@ -4771,11 +4802,12 @@ var serviceContext = (function () {
path: '',
errMsg: 'scanCode:ok'
});
} else {
invoke(callbackId, {
errMsg: 'scanCode:fail cancel'
});
} else {
invoke(callbackId, {
errMsg: 'scanCode:fail cancel'
});
}
consumePlusMessage(MESSAGE_TYPE);
});
if (isDark) { // 状态栏前景色
plus.navigator.setStatusBarStyle('light');
......@@ -4790,15 +4822,10 @@ var serviceContext = (function () {
}
});
}
// fixed by hxy 注册扫码事件
registerPlusMessage(MESSAGE_TYPE, function (res) {
if (res && !res.errMsg) {
if (res && 'code' in res) {
result = res;
} else {
const errMsg = res && res.errMsg ? ' ' + res.errMsg : '';
result = {
errMsg: 'scanCode:fail' + errMsg
};
}
}, false);
}
......@@ -4815,10 +4842,19 @@ var serviceContext = (function () {
const screenHeight = plus.screen.resolutionHeight;
// 横屏时 iOS 获取的状态栏高度错误,进行纠正
var landscape = Math.abs(plus.navigator.getOrientation()) === 90;
var statusBarHeight = plus.navigator.getStatusbarHeight();
var statusBarHeight = Math.round(plus.navigator.getStatusbarHeight());
if (ios && landscape) {
statusBarHeight = Math.min(20, statusBarHeight);
}
var safeAreaInsets;
function getSafeAreaInsets () {
return {
left: 0,
right: 0,
top: titleNView ? 0 : statusBarHeight,
bottom: 0
}
}
// 判断是否存在 titleNView
var titleNView;
var webview = getLastWebview();
......@@ -4828,7 +4864,22 @@ var serviceContext = (function () {
titleNView = style && style.titleNView;
titleNView = titleNView && titleNView.type === 'default';
}
}
safeAreaInsets = ios ? webview.getSafeAreaInsets() : getSafeAreaInsets();
} else {
safeAreaInsets = ios ? plus.navigator.getSafeAreaInsets() : getSafeAreaInsets();
}
var windowHeight = Math.min(screenHeight - (titleNView ? (statusBarHeight + TITLEBAR_HEIGHT)
: 0) - (isTabBarPage() && tabBar.visible ? TABBAR_HEIGHT : 0), screenHeight);
var windowWidth = screenWidth;
var safeArea = {
left: safeAreaInsets.left,
right: windowWidth - safeAreaInsets.right,
top: safeAreaInsets.top,
bottom: windowHeight - safeAreaInsets.bottom,
width: windowWidth - safeAreaInsets.left - safeAreaInsets.right,
height: windowHeight - safeAreaInsets.top - safeAreaInsets.bottom
};
return {
errMsg: 'getSystemInfo:ok',
brand: '',
......@@ -4836,11 +4887,8 @@ var serviceContext = (function () {
pixelRatio: plus.screen.scale,
screenWidth,
screenHeight,
// 安卓端 webview 宽度有时比屏幕多 1px,相比取最小值
// TODO screenWidth,screenHeight
windowWidth: screenWidth,
windowHeight: Math.min(screenHeight - (titleNView ? (statusBarHeight + TITLEBAR_HEIGHT)
: 0) - (isTabBarPage() && tabBar.visible ? TABBAR_HEIGHT : 0), screenHeight),
windowWidth,
windowHeight,
statusBarHeight,
language: plus.os.language,
system: plus.os.version,
......@@ -4849,7 +4897,8 @@ var serviceContext = (function () {
platform,
SDKVersion: '',
windowTop: 0,
windowBottom: 0
windowBottom: 0,
safeArea
}
}
......@@ -5056,7 +5105,9 @@ var serviceContext = (function () {
});
}
const CHOOSE_LOCATION_PATH = '_www/__uniappchooselocation.html';
const CHOOSE_LOCATION_PATH = '_www/__uniappchooselocation.html';
const MESSAGE_TYPE$1 = 'chooseLocation';
function chooseLocation$1 (params, callbackId) {
const statusBarStyle = plus.navigator.getStatusBarStyle();
......@@ -5098,27 +5149,39 @@ var serviceContext = (function () {
plus.navigator.setStatusBarStyle('light');
}
});
}
webview.show('slide-in-bottom', ANI_DURATION, () => {
webview.evalJS(`__chooseLocation__(${JSON.stringify(params)})`);
});
}
let index = 0;
let onShow = function () {
index++;
if (index === 2) {
webview.evalJS(`__chooseLocation__(${JSON.stringify(params)})`);
}
};
webview.addEventListener('loaded', onShow);
webview.show('slide-in-bottom', ANI_DURATION, onShow);
let result;
webview.addEventListener('close', () => {
if (result) {
invoke(callbackId, {
name: result.poiname,
address: result.poiaddress,
latitude: result.latlng.lat,
longitude: result.latlng.lng,
errMsg: 'chooseLocation:ok'
});
} else {
consumePlusMessage(MESSAGE_TYPE$1);
invoke(callbackId, {
errMsg: 'chooseLocation:fail cancel'
});
}
});
// fixed by hxy
registerPlusMessage('chooseLocation', function (res) {
if (res && !res.errMsg) {
invoke(callbackId, {
name: res.poiname,
address: res.poiaddress,
latitude: res.latlng.lat,
longitude: res.latlng.lng,
errMsg: 'chooseLocation:ok'
});
} else {
const errMsg = res && res.errMsg ? ' ' + res.errMsg : '';
invoke(callbackId, {
errMsg: 'chooseLocation:fail' + errMsg
});
registerPlusMessage(MESSAGE_TYPE$1, function (res) {
if (res && 'latlng' in res) {
result = res;
}
}, false);
}
......
......@@ -231,7 +231,7 @@ const promiseInterceptor = {
};
const SYNC_API_RE =
/^\$|^report|interceptors|Interceptor$|getSubNVueById|requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$|base64ToArrayBuffer|arrayBufferToBase64/;
/^\$|getMenuButtonBoundingClientRect|^report|interceptors|Interceptor$|getSubNVueById|requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$|base64ToArrayBuffer|arrayBufferToBase64/;
const CONTEXT_API_RE = /^create|Manager$/;
......@@ -1136,6 +1136,10 @@ function parseBaseApp (vm, {
if (this.mpType !== 'app') {
initRefs(this);
initMocks(this, mocks);
} else {
if (this.$options.store) { // vuex store
Vue.prototype.$store = this.$options.store;
}
}
}
});
......
......@@ -231,7 +231,7 @@ const promiseInterceptor = {
};
const SYNC_API_RE =
/^\$|^report|interceptors|Interceptor$|getSubNVueById|requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$|base64ToArrayBuffer|arrayBufferToBase64/;
/^\$|getMenuButtonBoundingClientRect|^report|interceptors|Interceptor$|getSubNVueById|requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$|base64ToArrayBuffer|arrayBufferToBase64/;
const CONTEXT_API_RE = /^create|Manager$/;
......@@ -639,9 +639,23 @@ const protocols = { // 需要做转换的 API 列表
},
scanCode: {
name: 'scan',
args: {
onlyFromCamera: 'hideAlbum',
scanType: false
args (fromArgs) {
if (fromArgs.scanType === 'qrCode') {
fromArgs.type = 'qr';
return {
onlyFromCamera: 'hideAlbum'
}
} else if (fromArgs.scanType === 'barCode') {
fromArgs.type = 'bar';
return {
onlyFromCamera: 'hideAlbum'
}
} else {
return {
scanType: false,
onlyFromCamera: 'hideAlbum'
}
}
},
returnValue: {
code: 'result'
......@@ -1523,6 +1537,10 @@ function parseBaseApp (vm, {
if (this.mpType !== 'app') {
initRefs(this);
initMocks(this, mocks);
} else {
if (this.$options.store) { // vuex store
Vue.prototype.$store = this.$options.store;
}
}
}
});
......
......@@ -231,7 +231,7 @@ const promiseInterceptor = {
};
const SYNC_API_RE =
/^\$|^report|interceptors|Interceptor$|getSubNVueById|requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$|base64ToArrayBuffer|arrayBufferToBase64/;
/^\$|getMenuButtonBoundingClientRect|^report|interceptors|Interceptor$|getSubNVueById|requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$|base64ToArrayBuffer|arrayBufferToBase64/;
const CONTEXT_API_RE = /^create|Manager$/;
......@@ -1282,6 +1282,10 @@ function parseBaseApp (vm, {
if (this.mpType !== 'app') {
initRefs(this);
initMocks(this, mocks);
} else {
if (this.$options.store) { // vuex store
Vue.prototype.$store = this.$options.store;
}
}
}
});
......
......@@ -231,7 +231,7 @@ const promiseInterceptor = {
};
const SYNC_API_RE =
/^\$|^report|interceptors|Interceptor$|getSubNVueById|requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$|base64ToArrayBuffer|arrayBufferToBase64/;
/^\$|getMenuButtonBoundingClientRect|^report|interceptors|Interceptor$|getSubNVueById|requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$|base64ToArrayBuffer|arrayBufferToBase64/;
const CONTEXT_API_RE = /^create|Manager$/;
......@@ -1200,6 +1200,10 @@ function parseBaseApp (vm, {
if (this.mpType !== 'app') {
initRefs(this);
initMocks(this, mocks);
} else {
if (this.$options.store) { // vuex store
Vue.prototype.$store = this.$options.store;
}
}
}
});
......
......@@ -231,7 +231,7 @@ const promiseInterceptor = {
};
const SYNC_API_RE =
/^\$|^report|interceptors|Interceptor$|getSubNVueById|requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$|base64ToArrayBuffer|arrayBufferToBase64/;
/^\$|getMenuButtonBoundingClientRect|^report|interceptors|Interceptor$|getSubNVueById|requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$|base64ToArrayBuffer|arrayBufferToBase64/;
const CONTEXT_API_RE = /^create|Manager$/;
......@@ -1292,6 +1292,10 @@ function parseBaseApp (vm, {
if (this.mpType !== 'app') {
initRefs(this);
initMocks(this, mocks);
} else {
if (this.$options.store) { // vuex store
Vue.prototype.$store = this.$options.store;
}
}
}
});
......
......@@ -231,7 +231,7 @@ const promiseInterceptor = {
};
const SYNC_API_RE =
/^\$|^report|interceptors|Interceptor$|getSubNVueById|requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$|base64ToArrayBuffer|arrayBufferToBase64/;
/^\$|getMenuButtonBoundingClientRect|^report|interceptors|Interceptor$|getSubNVueById|requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$|base64ToArrayBuffer|arrayBufferToBase64/;
const CONTEXT_API_RE = /^create|Manager$/;
......@@ -1140,6 +1140,10 @@ function parseBaseApp (vm, {
if (this.mpType !== 'app') {
initRefs(this);
initMocks(this, mocks);
} else {
if (this.$options.store) { // vuex store
Vue.prototype.$store = this.$options.store;
}
}
}
});
......
......@@ -555,6 +555,7 @@ function parseHTML (html, options) {
var splitRE = /\r?\n/g;
var replaceRE = /./g;
var isSpecialTag = makeMap('script,style,template', true);
var isCustomBlock = makeMap('wxs,filter,sjs', true);// fixed by xxxxxx
/**
* Parse a single-file component (*.vue) file into an SFC Descriptor Object.
......@@ -611,8 +612,8 @@ function parseComponent (
cumulated[name] = value || true;
return cumulated
}, {})
};
if (isSpecialTag(tag)) {
};// fixed by xxxxxx
if (isSpecialTag(tag) && !isCustomBlock(currentBlock.attrs.lang || '')) {
checkAttrs(currentBlock, attrs);
if (tag === 'style') {
sfc.styles.push(currentBlock);
......@@ -669,7 +670,8 @@ function parseComponent (
return content.slice(0, block.start).replace(replaceRE, ' ')
} else {
var offset = content.slice(0, block.start).split(splitRE).length;
var padChar = block.type === 'script' && !block.lang
var lang = block.attrs && block.attrs.lang; // fixed by xxxxxx
var padChar = block.type === 'script' && !block.lang && !isCustomBlock(lang || '')
? '//\n'
: '\n';
return Array(offset).join(padChar)
......@@ -2804,8 +2806,8 @@ Dep.prototype.removeSub = function removeSub (sub) {
};
Dep.prototype.depend = function depend () {
if (Dep.target) {
Dep.target.addDep(this);
if (Dep.SharedObject.target) {
Dep.SharedObject.target.addDep(this);
}
};
......@@ -2826,7 +2828,11 @@ Dep.prototype.notify = function notify () {
// The current target watcher being evaluated.
// This is globally unique because only one watcher
// can be evaluated at a time.
Dep.target = null;
// fixed by xxxxxx (nvue shared vuex)
/* eslint-disable no-undef */
Dep.SharedObject = typeof SharedObject !== 'undefined' ? SharedObject : {};
Dep.SharedObject.target = null;
Dep.SharedObject.targetStack = [];
/* */
......@@ -2945,7 +2951,9 @@ var Observer = function Observer (value) {
def(value, '__ob__', this);
if (Array.isArray(value)) {
if (hasProto) {
protoAugment(value, arrayMethods);
{
protoAugment(value, arrayMethods);
}
} else {
copyAugment(value, arrayMethods, arrayKeys);
}
......@@ -3057,7 +3065,7 @@ function defineReactive$$1 (
configurable: true,
get: function reactiveGetter () {
var value = getter ? getter.call(obj) : val;
if (Dep.target) {
if (Dep.SharedObject.target) { // fixed by xxxxxx
dep.depend();
if (childOb) {
childOb.dep.depend();
......
......@@ -35,7 +35,7 @@ module.exports = function getSplitChunks () {
if (module.resource && (
module.resource.indexOf('.vue') !== -1 ||
module.resource.indexOf('.nvue') !== -1 ||
module.resource.indexOf(mainPath) === 0 // main.js
normalizePath(module.resource).indexOf(mainPath) === 0 // main.js
)) {
return false
}
......
......@@ -711,8 +711,8 @@ Dep.prototype.removeSub = function removeSub (sub) {
};
Dep.prototype.depend = function depend () {
if (Dep.target) {
Dep.target.addDep(this);
if (Dep.SharedObject.target) {
Dep.SharedObject.target.addDep(this);
}
};
......@@ -733,17 +733,20 @@ Dep.prototype.notify = function notify () {
// The current target watcher being evaluated.
// This is globally unique because only one watcher
// can be evaluated at a time.
Dep.target = null;
var targetStack = [];
// fixed by xxxxxx (nvue shared vuex)
/* eslint-disable no-undef */
Dep.SharedObject = typeof SharedObject !== 'undefined' ? SharedObject : {};
Dep.SharedObject.target = null;
Dep.SharedObject.targetStack = [];
function pushTarget (target) {
targetStack.push(target);
Dep.target = target;
Dep.SharedObject.targetStack.push(target);
Dep.SharedObject.target = target;
}
function popTarget () {
targetStack.pop();
Dep.target = targetStack[targetStack.length - 1];
Dep.SharedObject.targetStack.pop();
Dep.SharedObject.target = Dep.SharedObject.targetStack[Dep.SharedObject.targetStack.length - 1];
}
/* */
......@@ -1028,7 +1031,7 @@ function defineReactive$$1 (
configurable: true,
get: function reactiveGetter () {
var value = getter ? getter.call(obj) : val;
if (Dep.target) {
if (Dep.SharedObject.target) { // fixed by xxxxxx
dep.depend();
if (childOb) {
childOb.dep.depend();
......@@ -4751,7 +4754,7 @@ function createComputedGetter (key) {
if (watcher.dirty) {
watcher.evaluate();
}
if (Dep.target) {
if (Dep.SharedObject.target) {// fixed by xxxxxx
watcher.depend();
}
return watcher.value
......
......@@ -8,7 +8,7 @@ import {
} from './interceptor'
const SYNC_API_RE =
/^\$|^report|interceptors|Interceptor$|getSubNVueById|requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$|base64ToArrayBuffer|arrayBufferToBase64/
/^\$|getMenuButtonBoundingClientRect|^report|interceptors|Interceptor$|getSubNVueById|requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$|base64ToArrayBuffer|arrayBufferToBase64/
const CONTEXT_API_RE = /^create|Manager$/
......
......@@ -10,7 +10,7 @@
@resize="_resize" />
</uni-image>
</template>
<script>
<script>
export default {
name: 'Image',
props: {
......@@ -122,8 +122,13 @@ export default {
},
_fixSize () {
const elWidth = this._getWidth()
if (elWidth) {
this.$el.style.height = elWidth / this.ratio + 'px'
if (elWidth) {
let height = elWidth / this.ratio
// fix: 解决 Chrome 浏览器上某些情况下导致 1px 缝隙的问题
if (typeof navigator && navigator.vendor === 'Google Inc.' && height > 10) {
height = Math.round(height / 2) * 2
}
this.$el.style.height = height + 'px'
this.sizeFixed = true
}
},
......
......@@ -371,6 +371,23 @@ export default {
slideFrame.style.transform = transform
}
this._viewportPosition = index
if (!this._transitionStart) {
if (index % 1 === 0) {
return
}
this._transitionStart = index
}
index -= Math.floor(this._transitionStart)
if (index <= -(this.items.length - 1)) {
index += this.items.length
} else if (index >= this.items.length) {
index -= this.items.length
}
index = this._transitionStart % 1 > 0.5 || this._transitionStart < 0 ? index - 1 : index
this.$trigger('transition', {}, {
dx: this.vertical ? 0 : index * slideFrame.offsetWidth,
dy: this.vertical ? index * slideFrame.offsetHeight : 0
})
},
_animateFrameFuncProto () {
if (!this._animating) {
......@@ -387,6 +404,7 @@ export default {
this._updateViewport(toPos)
this._animating = null
this._requestedAnimation = false
this._transitionStart = null
var item = this.items[this.currentSync]
if (item) {
this._itemReady(item, () => {
......
......@@ -63,7 +63,7 @@ export function getSystemInfo () {
return {
errMsg: 'getSystemInfo:ok',
brand: '',
brand: plus.device.vendor,
model: plus.device.model,
pixelRatio: plus.screen.scale,
screenWidth,
......
......@@ -287,9 +287,23 @@ const protocols = { // 需要做转换的 API 列表
},
scanCode: {
name: 'scan',
args: {
onlyFromCamera: 'hideAlbum',
scanType: false
args (fromArgs) {
if (fromArgs.scanType === 'qrCode') {
fromArgs.type = 'qr'
return {
onlyFromCamera: 'hideAlbum'
}
} else if (fromArgs.scanType === 'barCode') {
fromArgs.type = 'bar'
return {
onlyFromCamera: 'hideAlbum'
}
} else {
return {
scanType: false,
onlyFromCamera: 'hideAlbum'
}
}
},
returnValue: {
code: 'result'
......
......@@ -39,6 +39,10 @@ export default function parseBaseApp (vm, {
if (this.mpType !== 'app') {
initRefs(this)
initMocks(this, mocks)
} else {
if (this.$options.store) { // vuex store
Vue.prototype.$store = this.$options.store
}
}
}
})
......
......@@ -3450,14 +3450,14 @@ eslint-scope@^4.0.0, eslint-scope@^4.0.3:
estraverse "^4.1.1"
eslint-utils@^1.3.0, eslint-utils@^1.3.1:
version "1.4.0"
resolved "https://registry.npm.taobao.org/eslint-utils/download/eslint-utils-1.4.0.tgz#e2c3c8dba768425f897cf0f9e51fe2e241485d4c"
version "1.4.2"
resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab"
dependencies:
eslint-visitor-keys "^1.0.0"
eslint-visitor-keys@^1.0.0:
version "1.0.0"
resolved "https://registry.npm.taobao.org/eslint-visitor-keys/download/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d"
version "1.1.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2"
eslint@^4.19.1:
version "4.19.1"
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册