【重点突破】—— UniApp 微信小程序开发官网学习Two
一、使用Vue.js注意事项
- Vue.js在uni-app中使用的差异:
- 新增:uni-app除了支持Vue实例的生命周期,还支持应用启动、页面显示等生命周期
- 受限:发布到H5时支持所有vue的语法, 在小程序和App端部分功能受限
- 生命周期:Vue实例生命周期+应用生命周期+页面生命周期
- 使用uni-app的onReady : 代替vue的mounted
- 使用uni-app的onLoad : 代替vue的created
- 注意:不要在选项属性或回调上使用箭头函数,比如 created: () => console.log(this.a) 或 vm.$watch('a', newValue => this.myMethod())。因为箭头函数是和父级上下文绑定在一起的,this 不会是如你做预期的 Vue 实例,且 this.a 或 this.myMethod 也会是未定义的
- 模板语法:uni-app完整支持Vue模板语法
- data属性: 必须声明为函数,返回一个初始数据对象【否则:页面关闭时,数据不会自动销毁,再次打开该页面时,会显示上次数据】
data() { //使用函数返回对象
return {
title: 'Hello'
}
} - 全局变量:实现全局变量的方式——遵循Vue单文件模式的开发规范http://ask.dcloud.net.cn/article/35021
- 公用模块缺点:
// 在 uni-app 项目根目录下创建 common 目录,
// 然后在 common 目录下新建 helper.js 用于定义公用的方法。
export default { …… } // 在 pages/index/index.vue 中引用该模块
import helper from '../../common/helper.js';缺点:每次都需要引用
- 挂载Vue.prototype:将一些使用频率较高的常量或者方法,直接扩展到 Vue.prototype 上,每个 Vue 对象都会“继承”下来。
// 在main.js中挂载属性/方法
Vue.prototype.now = Date.now || function () {
return new Date().getTime();
}; // 在 pages/index/index.vue 中调用
export default {
data() {
return {};
},
onLoad(){
console.log('now:' + this.now());
},
}注意: 每个页面中不要在出现重复的属性或方法名。在 Vue.prototype 上挂载的属性或方法,可以加一个统一的前缀。比如 $url、global_url 这样
globalData:不是标准Vue语法,是兼容小程序的方式。小程序中可以在App上声明全局变量。uni-app中在App.vue可以定义在globalData属性上,也可以使用API读写这个值。
// 定义App.vue
<script>
export default {
globalData: {
text: 'text' //全局变量
},
onLaunch: function() {
console.log('App Launch')
},
onShow: function() {
console.log('App Show')
},
onHide: function() {
console.log('App Hide')
}
}
</script> // 使用API赋值和取值 —— getApp().globalData.XXX 赋值:getApp().globalData.text = 'test'
取值:console.log(getApp().globalData.text) // 'test'Vuex:更适合处理全局的并且值会发生变化的情况
// 在 uni-app 项目根目录下新建 store 目录,在 store 目录下创建 index.js 定义状态值 const store = new Vuex.Store({
state: {
login: false,
token: '',
avatarUrl: '',
userName: ''
},
mutations: {
login(state, provider) {
console.log(state)
console.log(provider)
state.login = true;
state.token = provider.token;
state.userName = provider.userName;
state.avatarUrl = provider.avatarUrl;
},
logout(state) {
state.login = false;
state.token = '';
state.userName = '';
state.avatarUrl = '';
}
}
}) // main.js中挂载Vuex —— store import store from './store'
Vue.prototype.$store = store // 在 pages/index/index.vue 使用 import {
mapState,
mapMutations
} from 'vuex'; export default {
computed: {
...mapState(['avatarUrl', 'login', 'userName'])
},
methods: {
...mapMutations(['logout'])
}
}
二、Class与Style绑定
- Class 与 Style 的表达式通过 compiler 硬编码到 uni-app 中
- 不支持:classObject 和 styleObject 语法
<view :class="[activeClass]" :style="[baseStyles,overridingStyles]"></view> data() {
return {
activeClass: {
'active': true,
'text-danger': false
},
baseStyles: {
color: 'green',
fontSize: '30px'
},
overridingStyles: {
'font-weight': 'bold'
}
}
}非H5端暂不支持在自定义组件上使用 Class 与 Style 绑定
- 可以用 computed 方法生成 class 或者 style 字符串,插入到页面中
- 注意:以:style=""这样的方式设置px像素值,其值为实际像素,不会被编译器转换。
四、计算属性、条件渲染、列表渲染 —— 完整支持Vue语法
- key
- 动态列表:需要使用 :key 来指定列表中项目的唯一的标识符
- 两种形式: v-for循环array中的item,或item具有唯一性的property
五、事件处理器
// 事件映射表,左侧为 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'
}
- tap和click的区别:
- 两者都会在点击时触发,但是在web手机端,clikc会有200-300ms的延时,所以要用tap代替click作为点击事件,singleTap和doubleTap分别作为单次点击和双击,但是使用tap会带来点透事件(事件穿透)。
- tap:手指触摸后马上离开;longtap: 手指触摸后,超过350ms再离开(推荐使用longpress事件代替)
- 微信小程序的bind事件、catch事件触发机制 —— 事件绑定和冒泡
- 事件绑定的写法同组件的属性,key: value的形式
- key以bind或catch开头,然后跟上事件的类型,如bindtap、catchtouchstart
- 基础库版本1.5.0起, bind和catch后可以紧跟一个冒号,含义不变,如bind: tap
- value是一个字符串,需要在对应的Page中定义同名的函数。否则触发事件会报错。
- 区别:bind事件绑定不会阻止冒泡事件向上冒泡,catch事件绑定可以阻止冒泡事件向上冒泡
- 注意:其他组件自定义事件如无特殊声明都是非冒泡事件
- 如<form/>的submit事件,<input/>的input事件,<scroll-view/>的scroll事件
- uni-app的事件处理器 注意:
- 为兼容各端,事件需使用 v-on 或 @ 的方式绑定,请勿使用小程序端的bind 和 catch 进行事件绑定
- 若需要禁止蒙版下的页面滚动,可使用 @touchmove.stop.prevent="moveHandle",moveHandle 可以用来处理 touchmove 的事件,也可以是一个空函数
- 事件修饰符 ----- .stop:各平台均支持, 使用时会阻止事件冒泡,在非 H5 端同时也会阻止事件的默认行为,其它事件修饰符,仅支持H5端,手机端没有键盘事件,不支持按键修饰符
六、表单控件绑定
- 直接使用uni-app:表单组件 https://uniapp.dcloud.io/component/button
- v-html指令:非H5端,不支持v-html
七、组件
- Vue组件
- 有且只能使用单文件组件(.vue 组件)的形式进行支持。(支持v-if)
- 不支持:动态组件、异步组件、组件里使用 slot 嵌套的其他组件时不支持 v-for、
- click等原生事件、v-show、class style样式属性、Slot、keep-alive、transition
- uni-app组件
- UI组件: https://uniapp.dcloud.io/component/
- 注意:原生组件上的事件绑定,需要以 vue 的事件绑定语法来绑定,如 bindchange="eventName" 事件,需要写成 @change="eventName"
- 全局组件
- 在 main.js 里进行全局注册,注册后就可在所有页面里使用该组件
- 注意:Vue.component 的第一个参数必须是静态的字符串
// main.js 注册全局组件
import Vue from 'vue'
import pageHead from './components/page-head.vue'
Vue.component('page-head',pageHead) // index.vue里使用page-head全局组件
<template>
<view>
<page-head></page-head>
</view>
</template>
八、区别于传统Web开发的注意
- JS注意
非H5端,不能使用浏览器自带对象,比如document、window、localstorage、cookie等,更不能使用jquery等依赖这些浏览器对象的框架。因为各家小程序快应用都不支持这些对象
- Tag注意
uni-app的tag同小程序的tag,和HTML的tag不一样。比如div要改成view,span要改成text、a要改成navigator
- CSS注意
推荐使用flex布局模型,单位默认是upx,rpx只兼容微信和APP端
- 工程目录注意
每个要显示的页面,都要放到pages目录下,新建一个页面所在的目录,然后放同名目录的vue文件,比如project/pages/lista/lista.vue,并且在pages.json里配置。这与小程序的策略相同。
- 自定义组件,放到component目录
静态资源如图片,固定放到static目录下。这是webpack、mpvue的规则
九、其他开发注意事项
- 组件内(页面除外)不支持onLoad生命周期。
- 组件遵守Vue规范:
- 不要修改props的值;
- 组件最外层template节点下不允许包含多个节点
- 编译后遇到异常,要看浏览器的控制,而不是HBuilderX的控制台。浏览器的控制台会有错误提示
- 如果你遇到了白屏或网络不给力的提示,一般是跨域问题: 解决方法有两种。
- 服务器打开跨域限制;
- 本地浏览器安装跨域插件
正式发行时,部署在同域名的服务器上,就不会有跨域报警了,如果部署在不同域名下,仍然需要服务器调整实现接口的跨域访问
- CSS內使用vh单位的时候注意100vh包含导航栏,使用时需要减去导航栏和tabBar高度,部分浏览器还包含浏览器操作栏高度
- fixed定位的组件有可能遮挡框架内置UI组件,如果不希望遮挡可以分平台判断,在H5平台避开内置UI
- 如果你的界面大幅变形,估计是因为单位使用了px。需改用upx,upx才是全端均通用的单位
- 使用罗盘、地理位置、加速计等相关接口需要使用https协议,本地预览(localhost)可以使用 http 协议
- 为避免和内置组件冲突,自定义组件请加上前缀(但不能是u和uni)。另外微信小程序下自定义组件名称不能以wx开头。
- 在tabBar页面,如果page高度设置为100%时,页面超出滚动会导致底部被tabbar遮挡,可在tabbar页面去掉height:100%或者改用min-height:100%
十、uni-app生态
- uni-app插件市场(ui库和模块):https://ext.dcloud.net.cn
- uni-app内置组件(常用,与微信内置组件相同):https://uniapp.dcloud.io/component/README
- uni-app扩展组件(uni ui, 可单下或整体引入):https://uniapp.dcloud.io/component/README?id=uniui
- 原作者直接维护的成套收费UI库graceUI :https://ask.dcloud.net.cn/article/35381
- 开源UI库colorUI :http://ext.dcloud.net.cn/plugin?id=239
- github地址:https://github.com/weilanwl/ColorUI/
- 如果确定只开发微信小程序和App,也可以使用微信的自定义组件ui
- vant weapp集成示例:http://ext.dcloud.net.cn/plugin?id=302
- 注意:开发时首先用基础组件,基础组件不满足的地方,再通过扩展组件补充。
- 不要把整个项目全部都构建在某个ui框架下
- uni-app体系和web开发体系不同,uni-ui库全部都是扩展组件,不含基础组件
- 请开发者务必牢记基础组件的作用,基础组件的性能是高于扩展组件的。
注:以上内容来自UniApp官网
【重点突破】—— UniApp 微信小程序开发官网学习Two的更多相关文章
- 【重点突破】—— UniApp 微信小程序开发官网学习One
一.初步认识 uni-app官网:https://uniapp.dcloud.io/component/README HBuilderX官方IDE下载地址: http://www.dcloud.io/ ...
- 【重点突破】—— UniApp微信小程序开发教程学习Three
一.实战 HBuilderX:在微信小程序中运行页面,需要设置->安全 开启微信小程序服务端口,HBuilder工具->设置->配置程序路径 网络请求.模板语法.打开页面.页面传参 ...
- uni-app微信小程序开发之引入腾讯视频小程序播放插件
登录微信小程序管理后台添加腾讯视频播放插件: 正式开始使用腾讯视频小程序插件之前需先在微信公众平台 -> 第三方设置 -> 插件管理处添加插件,如下图所示: 在uni-app中引入插件代码 ...
- 微信小程序开发官方文档解读
创建页面 在这个教程里,我们有两个页面,index 页面和 logs 页面,即欢迎页和小程序启动日志的展示页,他们都在 pages 目录下.微信小程序中的每一个页面的[路径+页面名]都需要写在 app ...
- 微信小程序开发调试阶段不校验请求域名
在微信小程序开发官网上有说明: 在开发者工具的右上角有详情选项,可以勾选不校验合法域名,之后就可以与本地ip进行通信了!
- 剖析简易计算器带你入门微信小程序开发
写在前面,但是重点在后面 这是教程,也不是教程. 可以先看Demo的操作动图,看看是个什么玩意儿,GitHub地址(https://github.com/dunizb/wxapp-sCalc) 自从微 ...
- 微信小程序开发中的二三事之网易云信IMSDK DEMO
本文由作者邹永胜授权网易云社区发布. 简介 为了更好的展示我们即时通讯SDK强悍的能力,网易云信IM SDK微信小程序DEMO的开发就提上了日程.用产品的话说就是: 云信 IM 小程序 SDK 的能力 ...
- 微信小程序开发-蓝牙功能开发
0. 前言 这两天刚好了解了一下微信小程序的蓝牙功能.主要用于配网功能.发现微信的小程序蓝牙API已经封装的很好了.编程起来很方便.什么蓝牙知识都不懂的情况下,不到两天就晚上数据的收发了,剩下的就是数 ...
- 微信小程序开发(一)开发工具推荐VSCode
虽然微信小程序官方开发工具非常优秀,但用的时间久了,会发现一些问题,比如代码编辑区小,自定义能力差,不支持插件,有时还会出现莫名其妙的bug,最不能忍的是编辑器代码提示功能不健全,这对于新手来说,很不 ...
随机推荐
- 【网络安全】window 快速搭建 ftp 及 多种访问方式
在局域网里面使用ftp传输文件比使用qq等软件传输速度快很多,但是搭建ftp很多时候需要下载相应的支持软件,其实不必下载相关的软件,因为window自带ftp功能. 演示操作系统:windows10 ...
- java 导出自定义样式excel
由于项目需要 要求导出一个这样的表格 然而 正常导出的表格都是这样婶儿地 这种格式网上demo有很多就不详细说了 ,主要说说上面三行是怎么画的. 第一行大标题,是9行合并成的一行,而且字体大小需要单独 ...
- 从零开始学MySQL(一)
如果您浏览过许多IT类的招聘职位,那么掌握数据库技能的重要性便不言自明了.因JAVA常常与MySQL所挂钩,因此兴起了写博客记载学习的念头,盼与君共勉.然,在进行MySQL语法的学习之前,我们无不面临 ...
- init_module - 初始化一条可加载模块的记录.
总览 #include <linux/module.h> int init_module(const char *name, struct module *image); 描述 init_ ...
- nginx的简单介绍
nginx简单介绍 Nginx的负载均衡策略可以分两大类:内置策略和扩展侧略: 内置策略包括:轮询,加权轮询,IP hash 扩展策略是:url hash ,fair nginx.conf文件结构 1 ...
- cdn工作原理
cdn工作原理 1.用户向浏览器输入www.web.com这个域名,浏览器第一次发现本地没有dns缓存,则向网站的DNS服务器请求: 2.网站的DNS域名解析器设置了CNAME,指向了www.web. ...
- 总结下Nginx的功能模块
nginx-1.10.3]# ./configure \ --prefix=/usr/local/nginx \ #指定安装路径 --user=nginx --group=ngin ...
- 主流NoSQL数据库的分析与选择
一因为新的数据项目的数据量级较大,因此考虑将mysql替换更高性能的数据库. 介绍一下NoSQL(不仅仅是关系型数据库)的不同种类和其擅长的业务. NoSQL的一个比较明显的特点是适用于现代大数据的存 ...
- 009-通过jmx监控tomcat
前言想理解怎么监控tomcat,必需识下图(图片源出网络) zabbix-Web前端界面,它通过数据库里数据展示.和其它组件不直接关联zabbix-server运行在10051端口,Zabbix-se ...
- python之同步IO和异步IO
linux操作系统基础知识 用户空间和内核空间 操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限.为了保证用户进程不能直接操作内核保证内核的安全,操 ...