uni-app是一个使用Vue.js开发所有前端应用的框架,开发者编写一套代码。可发布到iOS、Android、H5、以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉)等多个平台。
即使不跨端。uni-app同时也是更好的小程序开发框架。
为什么要去学习uni-app?
相对开发者来说,减少了学习成本,因为只学会uni-app之后,即可开发出iOS、Android、H5、以及各种小程序的应用,不需要再去学习开发其他应用的框架。相对公司而言,也大大减少了开发成本。
安装编辑器hbuilderX 下载地址
HBuilderX是通用的前端开发工具,但为uni-app做了特别强化。
下载APP开发版,可开箱即用
安装微信开发者工具 下载地址 根据电脑配置下载
点击HbuilderX菜单栏 :文件>新建>项目
选择uni-app,填些项目名称,项目创建的目录
为了实现多端兼容,综合考虑编译速度、运行性能等因素,uni-app 约定了如下开发规范:
通过globalStyle进行全局配置
用于设置应用的状态栏、导航条、标题、窗口背景色等。详细文档
官网pages链接
pages数组数组中第一项表示应用启动页
"pages": [ 、 { "path":"pages/message/message" //启动页 }, { "path": "pages/index/index", "style": { "navigationBarTitleText": "uni-app" //导航栏标题 } } ]
通过style修改页面的标题和导航栏背景色,并且设置h5下拉刷新的特有样式
{ "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages { "path": "pages/message/message", "style":{ "navigationBarTitleText":"信息页", "navigationBarBackgroundColor":"#007AFF", "h5":{ "pullToRefresh":{ "color":"#7D26CD" } } } }, { "path": "pages/index/index" } ]
如果应用是一个多 tab 应用,可以通过 tabBar 配置项指定 tab 栏的表现,以及 tab 切换时显示的对应页。
Tips
属性说明:
其中 list 接收一个数组,数组中的每个项都是一个对象,其属性值如下:
案例代码:
"tabBar":{ "color":"#a0522d", "selectedColor":"#B3EE3A", "backgroundColor":"#FFFFFF", "borderStyle":"white", "position":"bottom", "list":[ { "text":"首页", "pagePath":"pages/index/index", "iconPath":"static/tabs/home.png", "selectedIconPath":"static/tabs/home-active.png" }, { "text":"信息", "pagePath":"pages/message/message", "iconPath":"static/tabs/message.png", "selectedIconPath":"static/tabs/message-active.png" }, { "text":"信息", "pagePath":"pages/contact/contact", "iconPath":"static/tabs/contact.png", "selectedIconPath":"static/tabs/contact-active.png" } ] }
启动模式配置,仅开发期间生效,用于模拟直达页面的场景,如:小程序转发后,用户点击所打开的页面。
属性说明:
属性 | 类型 | 是否必填 | 描述 |
---|---|---|---|
current | Number | 是 | 当前激活的模式,list节点的索引值 |
list | Array | 是 | 启动模式列表 |
list说明:
属性 | 类型 | 是否必填 | 描述 |
---|---|---|---|
name | String | 是 | 启动模式名称 |
path | String | 是 | 启动页面路径 |
query | String | 否 | 启动参数,可在页面的 onLoad 函数里获得 |
案例:
"condition":{ "current":0, "list":[ { "name":"详情页", "path":"pages/detail/detail", "query":"id=80" } ] }
uni-app提供了丰富的基础组件给开发者,开发者可以像搭积木一样,组合各种组件拼接成自己的应用
uni-app中的组件,就像html中的div、p、span等标签的作用一样,用于搭建页面的基础结构
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
selectable | boolean | false | 否 | 文本是否可选 |
space | string | . | 否 | 显示连续空格,可选参数:ensp、emsp、nbsp |
decode | boolean | false | 否 | 是否解码 |
space值说明
值 | 说明 |
---|---|
ensp | 中文字符空格一半大小 |
emsp | 中文字符空格大小 |
nbsp | 根据字体设置的空格大小 |
Tips
<text>
组件内只支持嵌套 <text>
,不支持其它组件或自定义组件,否则会引发在不同平台的渲染差异。<text>
才能包裹文本内容。无法在<view>
组件包裹文本。
<
>
&
'
 
 
。\n
方式换行。<span>
组件编译时会被转换为 <text>。
View视图容器,类似于HTML中的div
官网链接
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
size | String | default | 按钮的大小 |
type | String | default | 按钮的样式类型 |
plain | Boolean | false | 按钮是否镂空,背景色透明 |
disabled | Boolean | false | 是否按钮 |
loading | Boolean | false | 名称是否带loading图标 |
size有效值
值 | 说明 |
---|---|
default | 默认大小 |
mini | 小尺寸 |
type有效值
值 | 说明 |
---|---|
primary | 微信小程序、360小程序为绿色,App、H5、百度小程序、支付宝小程序、快应用为蓝色,字节跳动小程序为红色,QQ小程序为浅蓝色。如想在多端统一颜色,请改用default,然后自行写样式 |
default | 白色 |
war n | 红色 |
官网链接
图片
Tips
<image>
组件默认宽度 300px、高度 225px;app-nvue平台,暂时默认为屏幕宽度
src
仅支持相对路径、绝对路径,支持 base64 码;image{will-change: transform}
,可优化此问题。<image>
时,若 src
使用相对路径可能出现路径查找失败的情况,故建议使用绝对路径。mode有效值:
mode 有 13 种模式,其中 4 种是缩放模式,9 种是裁剪模式。最常用的有两种是aspectFit
和aspectFill
。
@import
语句可以导入外联样式表,@import
后跟需要导入的外联样式表的相对路径,用;
表示语句结束uni-app
中不能使用 *
选择器。page
相当于 body
节点uni-app
支持使用字体图标,使用方式与普通 web
项目相同,需要注意以下几点:
uni-app
会自动将其转化为 base64 格式;@font-face { font-family: test1-icon; src: url('~@/static/iconfont.ttf'); }
在页面中需要定义数据,和我们之前的vue一模一样,直接在data中定义数据即可
export default{ data(){ return{ msg:'hello' } } }
<view>{{msg}}</view>
<view>{{flag?'我是真的':'我是假的'}}</view>
<view>{{1+1}}</view>
在data中定义了一张图片,我们希望把这张图片渲染到页面上
export default { data() { return { img: 'https://img2.baidu.com/it/u=2937803703,3095540904&fm=11&fmt=auto&gp=0.jpg' } } }
利用v-bind进行渲染
<image v-bind:src="img"></image>
还可以缩写成:
<image :src="img"></image>
data中定以一个数组,最终将数组渲染到页面上
data(){ return{ arr:[ {name:'刘能',age:29}, {name:'赵四',age:39}, {name:'宋小宝',age:49}, {name:'小沈阳',age:59} ] } }
利用v-for进行循环
<view v-for="(item,i) in arr" :key="i">名字:{{item.name}}---年龄:{{item.age}}</view>
事件绑定
在uni中事件绑定和vue中是一样的,通过v-on进行事件的绑定,也可以简写为@
<button type="default" @:click="tapHandle">按钮</button>
事件函数定义在methods中
methods:{ tapHandle(){ console.log('真的点我了') } }
事件传参
//template <button type="default" @:click="tapHandle">点我啊</button> //script methods:{ tapHandle(e){ console.log(e) } }
//template <button type="default" @:click="tapHandle(20)">点我啊</button> //script methods:{ tapHandle(num){ console.log(num) //20 } }
如果既想传递参数又想拿到事件对象,在传递参数的时候使用$event
可以把事件对象传递过去
//template <button type="default" @:click="tapHandle(20,$event)">点我啊</button> //script methods:{ tapHandle(num,e){ console.log(num,e) } }
生命周期的概念:一个对象从创建、运行、销毁的整个过程被称为生命周期。
生命周期函数:在生命周期中每个阶段会伴随着每一个函数的触发,这些函数被称为生命周期函数。
uni-app支持如下应用生命周期函数:前四个是常用的
uni-app支持如下页面生命周期函数:第二个到第六个是常用的
在uni-app中有两种方式开启下拉刷新
pages.json
里,找到的当前页面的pages节点,并在 style
选项中开启enablePullDownRefresh
。uni.startPullDownRefresh()
方法来开启下拉刷新通过配置文件开启
创建list页面进行演示
//template <template> <view> <view v-for="item in list" :key="item"> {{item}} </view> </view> </template> //script <script> export default{ data(){ return{ list:['前端','JAVA','UI','测试'] } } } </script>
通过pages.json文件中找到当前页面的pages节点,并在style
选项中开启enablePullDownRefresh
{ "path":"pages/list/list", "style":{ "enablePullDownRefresh":true } }
通过onPullDownRefresh
可以监听到下拉刷新的动作
export default{ data(){ return{ list:['前端','JAVA','UI','测试'] } }, onPullDownRefresh() { console.log('触发了下拉刷新') }, methods:{ pullDown(){ uni.startPullDownRefresh() } } }
uni.stopPullDownRefresh()
停止当前页面下拉刷新
案例演示:
<template> <view> <view> 这是列表页 </view> <view v-for="item in list" :key="item"> {{item}} </view> <button type="default" @click="pullDown">下拉刷新</button> </view> </template> <script> export default{ data(){ return{ list:['前端','JAVA','UI','测试'] } }, onPullDownRefresh() { console.log('触发了下拉刷新') setTimeout(()=>{ this.list=['UI','测试','前端','JAVA'] uni.stopPullDownRefresh() },2000) }, methods:{ pullDown(){ uni.startPullDownRefresh() } } } </script>
onReachBottom
页面滚动到底部的事件(不是scroll-view滚到底),常用于下拉下一页数据
onReachBottom() { console.log('页面触底了') }
在pages.json中的pages中的style配置项中的onReachBottomDistance
是用来配置页面上拉触底事件触发时距页面底部距离,单位只支持px。
例如:
{ "path":"pages/list/list", "style":{ "enablePullDownRefresh":true, "onReachBottomDistance":200 } }
上拉加载更多
onReachBottom() { console.log('页面触底了') this.list=[...this.list,...['测试','前端','JAVA','UI','测试']] }
在uni中可以调用uni.request方法进行请求网络请求
需要注意的是:在小程序中网络相关的API在使用前需要配置域名白名单
<template> <view> <button type="default" @click="get">发送get请求</button> <view> </template> <script> export default{ methods:{ get(){ uni.request({ url:"https://api-hmugo-web.itheima.net/api/public/v1/home/swiperdata", method:"get", //默认为get,不写也可以 success(res){ console.log(res) } }) } } } </script>
官方文档
将数据存储在本地缓存中指定的key中,会覆盖掉原来该key对应的内容,这是一个异步接口。
OBJECT参数说明
代码演示
//template <button type="primary" @click="setStorage">存储数据</button> //script setStorage(){ uni.setStorage({ key:'id', data:80, success() { console.log('存储成功') } }) }
将 data 存储在本地缓存中指定的 key 中,会覆盖掉原来该 key 对应的内容,这是一个同步接口。
参数说明
代码演示
//template <button type="primary" @click="setStorageSync">存储数据</button> //script setStorageSync(){ uni.setStorageSync('id',100) }
从本地缓存中异步获取指定 key 对应的内容。
OBJECT 参数说明
success 返回参数说明
代码演示
//template <button type="primary" @click="getStorage">获取数据</button> //script getStorage(){ uni.getStorage({ key:'id', success(res){ console.log('获取成功',res) } }) }
从本地缓存中同步获取指定 key 对应的内容。
参数说明
代码演示
//template <button type="primary" @click="getStorageSync">获取数据</button> //script getStorageSync(){ const res=uni.getStorageSync('id') console.log(res) }
从本地缓存中异步移除指定 key。
OBJECT 参数说明
代码演示
//template <button type="primary" @click="removeId">移除id</button> //script removeId(){ uni.removeStorage({ key:'id', success() { console.log('删除成功') } }) }
从本地缓存中同步移除指定 key。
参数说明
代码演示
//template <button type="primary" @click="removeId">移除id</button> //script removeId(){ uni.removeStorageSync('id') }
uni.chooseImage(OBJECT)方法从本地相册选择图片或使用相机拍照。
OBJECT 参数说明
Tips
input
的capture
属性,设置为['album']
无效,依然可以使用相机。注:文件的临时路径,在应用本次启动期间可以正常使用,如需持久保存,需在主动调用 uni.saveFile,在应用下次启动时才能访问得到。
success返回参数说明
File 对象结构如下
案例:
<template> <view> <button type="primary" @click="chooseImg">上传图片</button> <image v-for="item in imgArr" :src="item"></image> </view> </template> <script> export default{ data(){ return{ imgArr:[] } }, methods:{ chooseImg(){ uni.chooseImage({ count:5, success:res=> { this.imgArr=res.tempFilePaths } }) } } } </script>
uni.previewImage(OBJECT)方法预览图片。
OBJECT 参数说明
current 参数说明
1.9.5+ 支持传图片在 urls 中的索引值
current 为当前显示图片的链接/索引值,不填或填写的值无效则为 urls 的第一张。App平台在 1.9.5至1.9.8之间,current为必填。不填会报错
注意,当 urls 中有重复的图片链接时:
longPressActions 参数说明
success 返回参数说明
案例:
<template> <view> <button type="primary" @click="chooseImg">上传图片</button> <image v-for="item in imgArr" :src="item" @click="previewImg(item)"></image> </view> </template> <script> export default{ data(){ return{ imgArr:[] } }, methods:{ chooseImg(){ uni.chooseImage({ count:5, success:res=> { this.imgArr=res.tempFilePaths } }) }, previewImg(current){ uni.previewImage({ current:current, urls:this.imgArr, loop:true, indicator:'default' }) } } } </script>
TIPS
uni-app 已将常用的组件、JS API 封装到框架中,开发者按照 uni-app 规范开发即可保证多平台兼容,大部分业务均可直接满足。
但每个平台有自己的一些特性,因此会存在一些无法跨平台的情况。
在 C 语言中,通过 #ifdef、#ifndef 的方式,为 windows、mac 等不同 os 编译不同的代码。 uni-app 参考这个思路,为 uni-app 提供了条件编译手段,在一个工程里优雅的完成了平台个性化实现。
条件编译是用特殊的注释作为标记,在编译时根据这些特殊的注释,将注释里面的代码编译到不同平台。
写法:以 #ifdef 或 #ifndef 加 %PLATFORM% 开头,以 #endif 结尾。
%PLATFORM% 可取值如下:
支持的文件
注意:
// 注释
、css 使用 /* 注释 */
、vue/nvue 模板里使用 <!-- 注释 -->
;编译前
和编译后
文件的正确性,比如json文件中不能有多余的逗号;