uni-app使用总结(1)

一、uni-app在项目中安装新插件或者升级时,经常会出现运行不了的各种错误:


## npm install 后报错:
```
1、getPlatformCopy is not a function
解决: npm update(还不行就 npm cache clean --force,npm install)
2、有时可能网络有问题,删掉node_modues多安装几次依赖(或到网络好的地方多安装几次)
```

二、跨域问题

## uni-app h5 本地跨域
```
1.右键打开Chrome桌面快捷方式(已打开的Chrome网页请先关闭),点击“属性”进入到“快捷方式”选项卡,再选中“目标”项,添加“--disable-web-security --user-data-dir”
2.添加后以后,点击“应用”→“确定”,关闭后,再启动Chrome浏览器即可!
```

三、数据实时更新问题(业务逻辑问题)

```
1、onShow函数在页面每次显示及执行
2、在onLoad uni.$on监听一个事件,通过uni.$emit 触发事件,uni.$off销毁监听。
3、在vue

四、有 input 框的页面,手机端 input 被键盘挡住等各种情况

```
1、有定位为 fixed,absolute的尽量避免这样的定位,用margin、padding等代替
2、如必须 fixed、absolute定位,则动态监听页面高度,检测键盘是否提起,相应的改变 input 的高度
```

五、框架自带上拉刷新下拉加载不好用,可以使用插件:mescroll

六、uni-app h5页面切换动画(该方法源自uni-app插件市场)


```
1、index.vue:


2、index.css:
/* #ifdef H5 */
uni-page {
	opacity: 0;
}

uni-page.animation-before {
	/* 在页面上使用 transform 会导致页面内的 fixed 定位渲染为 absolute,需要在动画完成后移除 */
	transform: translateY(20px);
}

uni-page.animation-leave {
	transition: all .3s ease;
}

uni-page.animation-enter {
	transition: all .3s ease;
}

uni-page.animation-show {
	opacity: 1;
}

uni-page.animation-after {
	/* 在页面上使用 transform 会导致页面内的 fixed 定位渲染为 absolute,需要在动画完成后移除 */
	transform: translateY(0);
}

/* #endif */

2、App.vue:
1) import pageAnimation from './components/page-animation'
2) mixins: [pageAnimation],

```

七、uni-app 时间格式问题 new Date(str) IOS系统跟Android系统不兼容

```
new Date("2019-12-12") 在IOS系统上显示是NAN。

原因是 IOS系统只识别 " / " 不识别 " - ". 

解决:var newDate = new Date(date.replace(/-/g, '/'));

 

八、组件生命周期:

在组件中,没有生命周期,比如页面a引用了组件b 在组件b中,onLoad,onShow,onReady全部失效,不过用created和mounted是生效的

九、uni-app升级

1、


## 更新需求说明
```
一、app升级采用两种方式:
1、整包升级:适用于大版本更新,runtime发生变化时(模块、配置、版本等变化)必须使用此更新方法(即下载整个安装包,重新安装)
2、应用资源升级:适用于小版本更新 。runtime不变,前端页面整体压缩包更新(即下载部分更新文件,安装替换部分文件)

二、升级步骤:
1、查询是否有新版本更新
2、下载新版本
3、安装新版本

三、相关需求说明:
1、后端返回数据结构,如下:
1)检测是否需要更新接口:
{
  "appid":"", //app id
  action: "all", // 后台设定更新方式:如 整包更新 = all ,应用资源独立升级 = sth,
	wgtUrl: '', // 应用资源独立升级下载地址
  "iOS":{
    "version: "1.0.0", // iOS新版本号,如:1.0.0"
    "note": "", // iOS新版本描述信息,多行使用\n分割
    "url": "" // Appstore路径,如:itms-apps://itunes.apple.com/cn/app/hello-h5+/id682211190?l=zh&mt=8
  },
  "Android":{
    "version": "1.0.0", //Android新版本号,如:1.0.1
    "note": "", // Android新版本描述信息,多行使用\n分割
    "url": "" // apk文件下载地址,如:http://www.dcloud.io/helloh5p/HelloH5.apk
  }
}
```
## 热更新
```
上架审核期间不要弹出热更新提示
热更新内容使用https下载,避免被三方网络劫持
不要更新违法内容、不要通过热更新破坏应用市场的利益,比如iOS的虚拟支付要老老实实给Apple分钱
```

2、检测并升级方法简易封装

创建一个update.js文件


/**
 * 判断应用升级模块,从url地址下载升级描述文件到本地local路径
 * [email protected]
 *
 * 升级文件为JSON格式数据,如下:
{
  "appid":"HelloH5",
  action: "all", // 整包更新 = all ,应用资源独立升级 = sth
  "iOS":{
    "version":"iOS新版本号,如:1.0.0",
    "note":"iOS新版本描述信息,多行使用\n分割",
    "url":"Appstore路径,如:itms-apps://itunes.apple.com/cn/app/hello-h5+/id682211190?l=zh&mt=8"
  },
  "Android":{
    "version":"Android新版本号,如:1.0.1",
    "note":"Android新版本描述信息,多行使用\n分割",
    "url":"apk文件下载地址,如:http://www.dcloud.io/helloh5p/HelloH5.apk"
  }
}
 */
export function checkUpdate (checkUrl, wgtUrl) {
  // 锁定屏幕方向
  plus.screen.lockOrientation('portrait-primary') // 锁定
  // 检测升级
  uni.request({
    url: checkUrl, // 检查更新的服务器地址
    data: {
      appid: plus.runtime.appid,
      version: plus.runtime.version,
      imei: plus.device.imei
    },
    success: res => {
      console.log('success', res)
      if (res.statusCode == 200 && res.data.isUpdate) {
        const openUrl = plus.os.name === 'iOS' ? res.data.iOS : res.data.Android // 下载文件地址 ios以"itms-apps://"开头,后面跟appstore上应用地址。
        // 提醒用户更新
        uni.showModal({
          title: '更新提示',
          content: res.data.note ? res.data.note : '是否选择更新',
          success: showResult => {
            if (showResult.confirm) {
              if (res.action === 'all') {
                // 整包更新
                // plus.runtime.openURL(openUrl)
                updateAppAll(openUrl.url)
              } else {
                // 应用资源独立升级
                downWgt(wgtUrl) // 下载升级包
              }
            }
          }
        })
      }
    }
  })
}

/** 整包更新 */
function updateAppAll (openUrl) {
  if (plus.os.name === 'iOS') {
    plus.runtime.openURL(openUrl)
  } else {
    var dtask = plus.downloader.createDownload(openUrl, {}, function (d, status) {
      if (status === 200) {
      // 下载成功
        var path = d.filename
        console.log(d.filename)
        plus.runtime.install(path) // 安装下载的apk文件
      } else {
      // 下载失败
        alert('Download failed: ' + status)
      }
    })
    dtask.start()
  }
}

/** App资源在线升级更新 */
// 下载wgt文件
function downWgt (wgtUrl) {
  plus.nativeUI.showWaiting('下载更新文件...')
  plus.downloader.createDownload(wgtUrl, { filename: '_doc/update/' }, function (d, status) {
    if (status == 200) {
      console.log('下载更新文件成功:' + d.filename)
      installWgt(d.filename) // 安装wgt包
    } else {
      console.log('下载更新文件失败!')
      plus.nativeUI.alert('下载更新文件失败!')
    }
    plus.nativeUI.closeWaiting()
  }).start()
}
// 更新应用资源包(wgt文件)
function installWgt (path) {
  plus.nativeUI.showWaiting('安装更新文件...')
  plus.runtime.install(path, {}, function () {
    plus.nativeUI.closeWaiting()
    console.log('安装更新文件成功!')
    plus.nativeUI.alert('应用资源更新完成!', function () {
      plus.runtime.restart()
    })
  }, function (e) {
    plus.nativeUI.closeWaiting()
    console.log('安装更新文件失败[' + e.code + ']:' + e.message)
    plus.nativeUI.alert('安装更新文件失败[' + e.code + ']:' + e.message)
  })
}

3、在App.vue中引入:import { checkUpdate } from '@/utils/update',并在onLaunch中使用:

 // #ifdef APP-PLUS
    checkUpdate(this.checkUrl)  // checkUrl = 检测是否需要升级的接口
 // #endif

 

你可能感兴趣的:(uni-app)