0. uni-app#

0. uni-app#

NOTE本文的大部分内容源于uni-app官方教程和Vue官方教程的二次整合

0. uni-app#uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、快应用等多个平台。(摘自uni-app官网的介绍)

在上手uni-app之前,推荐下载官方提供的HBuilderX以便后续开发,具体的教程可以参考uni-app 快速上手。

一个uni-app工程,默认包含如下目录及文件(源自工程简介 | uni-app官网):

┌─uniCloud 云空间目录,支付宝小程序云为uniCloud-alipay,阿里云为uniCloud-aliyun,腾讯云为uniCloud-tcb

│─components 符合vue组件规范的uni-app组件目录

│ └─comp-a.vue 可复用的a组件

├─utssdk 存放uts文件(已废弃)

├─pages 业务页面文件存放的目录

│ ├─index

│ │ └─index.vue index页面

│ └─list

│ └─list.vue list页面

├─static 存放应用引用的本地静态资源(如图片、视频等)的目录,注意:静态资源都应存放于此目录

├─uni_modules 存放uni_module

├─platforms 存放各平台专用页面的目录

├─nativeplugins App原生语言插件

├─nativeResources App端原生资源目录

│ ├─android Android原生资源目录

| └─ios iOS原生资源目录

├─hybrid App端存放本地html文件的目录

├─wxcomponents 存放微信小程序、QQ小程序组件的目录

├─mycomponents 存放支付宝小程序组件的目录

├─swancomponents 存放百度小程序组件的目录

├─ttcomponents 存放抖音小程序、飞书小程序组件的目录

├─kscomponents 存放快手小程序组件的目录

├─jdcomponents 存放京东小程序组件的目录

├─unpackage 非工程代码,一般存放运行或发行的编译结果

├─main.js Vue初始化入口文件

├─App.vue 应用配置,用来配置App全局样式以及监听 应用生命周期

├─pages.json 配置页面路由、导航条、选项卡等页面类信息

├─manifest.json 配置应用名称、appid、logo、版本等打包信息

├─AndroidManifest.xml Android原生应用清单文件

├─Info.plist iOS原生应用配置文件

└─uni.scss 内置的常用样式变量

.vue文件的结构

在对uni-app有了基本的了解之后,将开始上手学习如何编写一个uni-app程序

1. 基本组件#1.1 视图容器#1. view#view是最基本的视图容器,可以用于包裹各种元素内容。

常用属性:

属性名类型默认值说明hover-classStringnone指定按下去的样式类。当 hover-class=“none” 时,没有点击态效果hover-start-timeNumber50按住后多久出现点击态,单位毫秒hover-stay-timeNumber400手指松开后点击态保留时间,单位毫秒2. scroll-view#scroll-view为可滚动视图区域,用于区域滚动。

常用属性:

属性名类型默认值说明scroll-xBooleanfalse允许横向滚动scroll-yBooleanfalse允许纵向滚动show-scrollbarBooleanfalse控制是否出现滚动条横向滚动:

当我们希望做出横向滚动的效果时,如果只配置scroll-x会发现并不能正常生效。此时,我们还需要使用css进行额外配置,如下所示:

3. swiper#swiper是滑块视图容器,一般用于左右滑动或上下滑动,比如banner轮播图。

常用属性:

属性名类型默认值说明indicator-dotsBooleanfalse是否显示面板指示点indicator-colorColorrgba(0, 0, 0, .3)指示点颜色indicator-active-colorColor#000000当前选中的指示点颜色autoplayBooleanfalse是否自动切换intervalNumber5000自动切换时间间隔durationNumber500滑动动画时长circularBooleanfalse是否采用衔接滑动,即播放到末尾后重新回到开头verticalBooleanfalse滑动方向是否为纵向previous-marginString0px前边距,可用于露出前一项的一小部分,接受 px 和 rpx 值next-marginString0px后边距,可用于露出后一项的一小部分,接受 px 和 rpx 值当在swiper中显示内容时,可以使用swiper-item来进行显示,其宽高会自动设置为100%(相对于父组件)。

1.2 基础内容#1. text#text是文本组件,用于包裹文本内容。

常用属性:

属性名类型默认值说明平台差异说明selectableBooleanfalse文本是否可选user-selectBooleanfalse文本是否可选微信小程序spaceString显示连续空格钉钉小程序不支持decodeBooleanfalse是否解码百度、钉钉小程序不支持space 值说明

值说明ensp中文字符空格一半大小emsp中文字符空格大小nbsp根据字体设置的空格大小1.3 表单组件#1. button#button为按钮组件。

常用属性:

属性名类型默认值说明sizeStringdefault按钮的大小(default:默认大小;mini:小尺寸)typeStringdefault按钮的样式类型plainBooleanfalse按钮是否镂空,背景色透明disabledBooleanfalse是否禁用loadingBooleanfalse名称前是否带 loading 图标hover-classStringbutton-hover指定按钮按下去的样式类。当 hover-class=“none” 时,没有点击态效果hover-start-timeNumber20按住后多久出现点击态,单位毫秒hover-stay-timeNumber70手指松开后点击态保留时间,单位毫秒2. input#input是单行输入框。

常用属性:

属性名类型默认值说明valueString输入框的初始内容typeStringtextinput 的类型 有效值passwordBooleanfalse是否是密码类型placeholderString输入框为空时占位符disabledBooleanfalse是否禁用maxlengthNumber140最大输入长度,设置为 -1 的时候不限制最大长度@focusEventHandle输入框聚焦时触发,event.detail = { value, height },height 为键盘高度@blurEventHandle输入框失去焦点时触发,event.detail = {value: value}@confirmEventHandle点击完成按钮时触发(电脑端敲回车),event.detail = {value: value}type 有效值

值说明平台差异说明text文本输入键盘number数字输入键盘均支持,App平台、H5平台 3.1.22 以下版本 vue 页面在 iOS 平台显示的键盘包含负数和小数。idcard身份证输入键盘微信、支付宝、百度、QQ小程序、快手小程序、京东小程序digit带小数点的数字键盘均支持,App平台、H5平台 vue 页面在 iOS 平台显示的键盘包含负数(原生键盘不支持负号)。tel电话输入键盘safe-password密码安全输入键盘微信小程序nickname昵称输入键盘微信小程序3. switch#switch是开关选择器。

常用属性:

属性名类型默认值说明checkedBooleanfalse是否选中disabledBooleanfalse是否禁用typeStringswitch样式,有效值:switch, checkboxcolorColorswitch 的颜色,同 css 的 color@changeEventHandlechecked 改变时触发 change 事件,event.detail={ value}4. checkbox#checkbox-group为多选框组,用于包裹一组checkbox

常用属性:

属性名类型说明@changeEventHandle中选中项发生改变是触发 change 事件,detail = {value:[选中的checkbox的value的数组]}checkbox为多选项。在1组check-group中可选择多个

常用属性:

属性名类型默认值说明valueString 标识,选中时触发 的 change 事件,并携带 的 value。disabledBooleanfalse是否禁用checkedBooleanfalse当前是否选中,可用来设置默认选中使用案例:

1.4 路由与页面跳转#1. navigator#navigator用于页面跳转,该组件类似HTML中的组件,但只能跳转本地页面。目标页面必须在pages.json中注册。

属性说明

属性名类型默认值说明urlString应用内的跳转链接,值为相对路径或绝对路径,如:”../first/first”,“/pages/first/first”,注意不能加 .vue 后缀open-typeStringnavigate跳转方式deltaNumber当 open-type 为 ‘navigateBack’ 时有效,表示回退的层数hover-classStringnavigator-hover指定点击时的样式类,当hover-class=“none”时,没有点击态效果open-type 有效值

值说明平台差异说明navigate对应 uni.navigateTo 的功能redirect对应 uni.redirectTo 的功能switchTab对应 uni.switchTab 的功能reLaunch对应 uni.reLaunch 的功能抖音小程序与飞书小程序不支持navigateBack对应 uni.navigateBack 的功能exit退出小程序,target=“miniProgram”时生效微信2.1.0+、百度2.5.2+、QQ1.4.7+1.5 媒体组件#1. image#imgae为图片组件,用于显示图片。

常用属性:

属性名类型默认值说明平台差异说明srcString图片资源地址modeString’scaleToFill’图片裁剪、缩放的模式lazy-loadBooleanfalse图片懒加载。只针对page与scroll-view下的image有效微信小程序、百度小程序、抖音小程序、飞书小程序webpbooleanfalse在系统不支持webp的情况下是否单独启用webp。默认false,只支持网络资源。webp支持详见下面说明微信小程序2.9.0mode 有效值

mode 有 14 种模式,其中 5 种是缩放模式,9 种是裁剪模式。

模式值说明缩放scaleToFill不保持纵横比缩放图片,使图片的宽高完全拉伸至填满 image 元素缩放aspectFit保持纵横比缩放图片,使图片的长边能完全显示出来。也就是说,可以完整地将图片显示出来。缩放aspectFill保持纵横比缩放图片,只保证图片的短边能完全显示出来。也就是说,图片通常只在水平或垂直方向是完整的,另一个方向将会发生截取。缩放widthFix宽度不变,高度自动变化,保持原图宽高比不变缩放heightFix高度不变,宽度自动变化,保持原图宽高比不变裁剪top不缩放图片,只显示图片的顶部区域裁剪bottom不缩放图片,只显示图片的底部区域裁剪center不缩放图片,只显示图片的中间区域裁剪left不缩放图片,只显示图片的左边区域裁剪right不缩放图片,只显示图片的右边区域裁剪top left不缩放图片,只显示图片的左上边区域裁剪top right不缩放图片,只显示图片的右上边区域裁剪bottom left不缩放图片,只显示图片的左下边区域裁剪bottom right不缩放图片,只显示图片的右下边区域2. vue3 语法#此部分内容基于Vue 官方文档整合

2.1 模板语法#1. 插值表达式#最基本的数据绑定形式是插值表达式,用于在视图中动态地显示变量、表达式或计算结果。插值表达式通过双大括号 {{}} 的形式嵌入在模板中。

插值表达式支持以下内容:

简单变量

{{ message }}

复杂表达式

{{ number1 + number2 }}

三元运算符

{{ condition ? '是' : '否' }}

方法调用

{{ greet('小明') }}

2. Attribute 绑定#双大括号不能在 HTML attributes 中使用。想要响应式地绑定一个 attribute,应该使用v-bind 指令。

因为 v-bind 非常常用,因此官方提供了特定的简写语法:

使用举例:

2.2 响应式基础#1. ref#在组合式 API 中,推荐使用ref()函数来声明响应式状态。值通过 .value 访问或修改。在模板中使用时会自动拆箱,不需要使用.value。

示例:

2.3 class与style绑定#1. 绑定HTML class#通过绑定绑定HTML class,我们可以实现动态渲染。并且,:class 指令也可以和一般的 class attribute 共存。举例来说,下面这样的状态:

const isActive = ref(true)

const hasError = ref(false)

配合以下模板:

class="static"

:class="{ active: isActive, 'text-danger': hasError }"

>

渲染的结果会是:

当 isActive 或者 hasError 改变时,class 列表会随之更新。举例来说,如果 hasError 变为 true,class 列表也会变成 "static active text-danger"。

2. 绑定内联样式#:style 支持绑定 JavaScript 对象值,对应的是HTML元素的 style 属性:

尽管推荐使用 camelCase,但 :style 也支持 kebab-cased 形式的 CSS 属性 key (对应其 CSS 中的实际名称),例如:

为了使代码更加简洁,可可以直接绑定一个样式对象

2.4 事件处理#我们可以使用 v-on 指令 (简写为 @) 来监听 DOM 事件,并在事件触发时执行对应的 JavaScript。用法:v-on:click="handler" 或 @click="handler"。

下面给出一个结合多个组件的事件处理案例:

2.5 条件渲染#v-if 指令用于条件性地渲染一块内容。这块内容只会在指令的表达式返回真值时才被渲染。v-else-if 提供的是相应于 v-if 的else if区块。v-else则是对应的else区块。

使用案例:

A

B

C

Not A/B/C

因为 v-if 是一个指令,他必须依附于某个元素。但如果我们想要切换不止一个元素呢?在这种情况下我们可以在一个