整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

uni-app: 使用Vue.js需要注意哪些问题?

击右上方红色按钮关注“web秀”,让你真正秀起来

前言

uni-app 在发布到 H5 时,是支持所有 vue 的语法的。但是发布到App或者小程序时,由于各个平台等限制,无法实现全部 vue 语法,本文将详细讲解差异。

相比Web平台, Vue.js 在 uni-app 中使用差异主要集中在两个方面:

新增:uni-app除了支持Vue实例的生命周期,还支持应用启动、页面显示等生命周期

受限:相比web平台,在小程序和App端部分功能受限,具体见下。

生命周期

uni-app 在支持完整 Vue 实例的生命周期上,同时还新增 应用生命周期 及 页面生命周期。

应用生命周期包括下列函数

1、onLaunch当uni-app 初始化完成时触发(全局只触发一次)

2、onShow当 uni-app 启动,或从后台进入前台显示

3、onHide当 uni-app 从前台进入后台

4、onUniNViewMessage对 nvue 页面发送的数据进行监听

注意

(1)、应用生命周期仅可在App.vue中监听,在其它页面监听无效。

(2)、onlaunch里进行页面跳转,可能遇白屏报错,可以去官方查找解决方案。

页面生命周期

注意

(1)、onTabItemTap常用于点击当前tabitem,滚动或刷新当前页面。如果是点击不同的tabitem,一定会触发页面切换。

(2)、如果想在App端实现点击某个tabitem不跳转页面,不能使用onTabItemTap,可以使用plus.nativeObj.view放一个区块盖住原先的tabitem,并拦截点击事件。

(3)、onTabItemTap在App端,从HBuilderX 1.9 的自定义组件编译模式开始支持。

语法支持

支持的 vue 语法

1、支持过滤器 filter

2、支持比较复杂的 JavaScript 渲染表达式

3、支持在 template 内使用 methods 中的函数

4、支持 v-html (同 rich-text 的解析)

5、支持 v-slot 新语法

6、支持解构插槽 Prop 设置默认值

7、支持 slot 后备内容

8、组件支持原生事件绑定,如:@tap.native

不支持的 vue 语法

1、class不支持绑定Obejct变量(使用字符串的形式绑定)

2、不支持事件修饰符:prevent、passive(在App与小程序平台,使用stop修饰符,既可以阻止冒泡也能阻止默认行为)

3、不支持render、inline-template、X-Templates、keep-alive、transition

4、不支持使用 Vue.use 的方式注册全局组件(在main.js使用Vue.component的方式引入)

列表渲染

1、在H5平台 使用 v-for 循环整数时和其他平台存在差异,如 v-for="(ite`m, index) in 10" 中,在H5平台 item 从 1 开始,其他平台 item 从 0 开始,可使用第二个参数 index 来保持一致。

2、在非H5平台 循环对象时不支持第三个参数,如 v-for="(value, name, index) in object" 中,index 参数是不支持的。

事件处理

几乎全支持 事件处理器

// 事件映射表,左侧为 WEB 事件,右侧为 ``uni-app`` 对应事件
{
 click: 'tap',
 touchstart: 'touchstart',
 touchmove: 'touchmove',
 touchcancel: 'touchcancel',
 touchend: 'touchend',
 tap: 'tap',
 longtap: 'longtap',
 input: 'input',
 change: 'change',
 submit: 'submit',
 blur: 'blur',
 focus: 'focus',
 reset: 'reset',
 confirm: 'confirm',
 columnchange: 'columnchange',
 linechange: 'linechange',
 error: 'error',
 scrolltoupper: 'scrolltoupper',
 scrolltolower: 'scrolltolower',
 scroll: 'scroll'
}

注意:

1、为兼容各端,事件需使用 v-on 或 @ 的方式绑定,请勿使用小程序端的bind 和 catch 进行事件绑定。

2、事件修饰符

.stop:各平台均支持, 使用时会阻止事件冒泡,在非 H5 端同时也会阻止事件的默认行为

.prevent 仅在 H5 平台支持

.self:仅在 H5 平台支持

.once:仅在 H5 平台支持

.capture:仅在 H5 平台支持

.passive:仅在 H5 平台支持

3、若需要禁止蒙版下的页面滚动,可使用 @touchmove.stop.prevent="moveHandle",moveHandle 可以用来处理 touchmove 的事件,也可以是一个空函数。

<view class="mask" @touchmove.stop.prevent="moveHandle"></view>

4、按键修饰符:uni-app运行在手机端,没有键盘事件,所以不支持按键修饰符。

命名限制

在 uni-app 中以下这些作为保留关键字,不可作为组件名。

a, canvas, cell, content, countdown, datepicker, div, element, embed, header, image, img, indicator, input, link, list, loading-indicator, loading, marquee, meta, refresh, richtext, script, scrollable, scroller, select, slider-neighbor, slider, slot, span, spinner, style, svg, switch, tabbar, tabheader, template, text, textarea, timepicker, trisition-group, trisition, video, view, web

除以上列表中的名称外,标准的 HTML 及 SVG 标签名也不能作为组件名。

其他疑难杂症

1、如何获取上个页面传递的数据

在 onLoad 里得到,onLoad 的参数是其他页面打开当前页面所传递的数据。

2、如何捕获 app 的 onError

由于 onError 并不是完整意义的生命周期,所以只提供一个捕获错误的方法,在 app 的根组件上添加名为 onError 的回调函数即可。如下:

export default {
 // 只有 app 才会有 onLaunch 的生命周期
 onLaunch () {
 // ...
 },
 // 捕获 app error
 onError (err) {
 console.log(err)
 }
}

3、组件属性设置不生效解决办法

当重复设置某些属性为相同的值时,不会同步到view层。 例如:每次将scroll-view组件的scroll-top属性值设置为0,只有第一次能顺利返回顶部。 这和props的单向数据流特性有关,组件内部scroll-top的实际值改动后,其绑定的属性并不会一同变化。

解决办法有两种(以scroll-view组件为例):

(1)、监听scroll事件,记录组件内部变化的值,在设置新值之前先设置为记录的当前值

<scroll-view :scroll-top="scrollTop" scroll-y="true" @scroll="scroll">
<script>
export default {
 data() {
 return {
 scrollTop: 0,
 old: {
 scrollTop: 0
 }
 }
 },
 methods: {
 scroll: function(e) {
 this.old.scrollTop = e.detail.scrollTop
 },
 goTop: function(e) {
 this.scrollTop = this.old.scrollTop
 this.$nextTick(function() {
 this.scrollTop = 0
 });
 }
 }
}
</script>

(2)、监听scroll事件,获取组件内部变化的值,实时更新其绑定值

<scroll-view :scroll-top="scrollTop" scroll-y="true" @scroll="scroll">
<script>
export default {
 data() {
 return {
 scrollTop: 0,
 }
 },
 methods: {
 scroll: function(e) {
 this.scrollTop = e.detail.scrollTop
 },
 goTop: function(e) {
 this.scrollTop = 0
 }
 }
}
</script>

第二种解决方式在某些组件可能造成抖动,推荐第一种解决方式。

喜欢小编或者觉得小编文章对你有帮助的,可以点击一波关注哦!同时,要源码的小伙伴可以点击下方“了解更多”。

最后推荐一个专栏文章,感谢小伙伴们多多支持,谢谢大家!

时做移动开发很少接触css,最近在写uni-app要用到css所以少不了学习这方面的知识。

今天的笔记也是一些基础知识,关于盒子模型当中的一些比较不错的属性,也是常用属性。

在 CSS 盒子模型的默认定义里,你对一个元素所设置的 width 与 height 只会应用到这个元素的内容区。如果这个元素有任何的 border 或 padding ,绘制到屏幕上时的盒子宽度和高度会加上设置的边框和内边距值。这意味着当你调整一个元素的宽度和高度时需要时刻注意到这个元素的边框和内边距。当我们实现响应式布局时,这个特点尤其烦人。

box-sizing 两个取值如下:

  • content-box 是默认值。如果你设置一个元素的宽为100px,那么这个元素的内容区会有100px 宽,并且任何边框和内边距的宽度都会被增加到最后绘制出来的元素宽度中。
  • border-box 告诉浏览器:你想要设置的边框和内边距的值是包含在width内的。也就是说,如果你将一个元素的width设为100px,那么这100px会包含它的border和padding,内容区的实际宽度是width减去(border + padding)的值。大多数情况下,这使得我们更容易地设定一个元素的宽高。
<html>
   <head>
      <style>
         .div1 {
            width: 300px;
            height: 100px;
            border: 1px solid blue;
            box-sizing: border-box;
         }
         .div2 {
            width: 300px;
            height: 100px;
            padding: 50px;
            border: 1px solid red;
            box-sizing: border-box;
         }
      </style>
   </head>

   <body>
      <div class = "div1">TutorialsPoint.com</div><br />
      <div class = "div2">TutorialsPoint.com</div>
   </body>
</html>

上面代码对呀的效果如下:

发环境

1、Android Studio下载地址:https://developer.android.google.cn/studio/index.html

2、HBuilderX(开发工具,地址https://www.dcloud.io/hbuilderx.html)

3、App离线SDK下载:最新android平台SDK下载

(https://nativesupport.dcloud.net.cn/AppDocs/download/android)

注意:HBuilderX版本要跟SDK版本一致。


SDK目录说明

    |-- HBuilder-Hello                App离线打包演示应用
    |-- HBuilder-Integrate-AS         集成uni-app或5+ app的最简示例
    |-- SDK                           SDK库文件目录
    |-- Feature-Android.xls           Android平台各扩展Feature API对应的详细配置
    |-- readme                        版本说明文件及注意事项
    |-- UniPlugin-Hello-AS            uni原生插件开发示例


准备工程

1、安装android Studio并解压SDK下载包;

2、运行android studio,选择导入项目HBuilder-Hello;

3、导入项目后,按提示安装所需即可;安装完成后,项目会重新rebuild,等待结束,运行项目到测试机,可以看到传感器,音频,二维码等应用示例;

4、打开 HBuilderX 写好的项目,点击 发行 > 原生app-本地打包 > 生成本地打包资源,打包完成后,HBuilderX 控制台会输出打包信息和打包路径;

5、打开 android studio 切换项目到project目录,依次打开 HBuilder-Hello > app > src > main > assets,能看到 apps.HelloH5.www 和 data 两个文件夹;

6、删除 android studio 的 apps 文件夹内容后,将 HBuilderX 刚才打包路径下的 resources 文件夹内容替换;

7、复制 www > manifest.json 中的id,替换 data > dcloud_control.xml 中的 appid;

8、点击运行项目,如果运行后测试机所显示的内容和HBuilderX项目中所展示一致,则表示替换成功;

补充一些打包过程遇到问题的解决方法:

1)运行APP提示“当前运行环境无法运行启用“自定义组件模式”的uni-app引用”,只需要在“app-libs”引入文件“ uniapp-release.aar”(该文件在SDK下载包的路径“SDK\libs”下)即可解决);

2)报错“Entry name 'assets/SDK_Default_Route_Texture_Gray_Arrow.png' collided”,删除文件“HBuilder-Hello\app\build”下的所有数据,重新生成就没问题;

3)uniApp引入“vconsole.min.js”会导致打包运行后,只显示底部菜单,内容区域显示空白;

4)工程增加package.json,并执行“npm install”后,打包App运行后会导致引用组件的页面无法跳转;

5)uniapp调用接口使用了Promise,打包App运行后会导致打开调用接口的页面一直加载中。


发布版本

1、android studio > build > Generate Signed Bundle / APK,创建新的 jks文件或选择原有jks,一路下一步,直至完成;

2、把文件app-debug.apk发送到手机,安装并使用。