uniapp框架基础,一文搞定uniapp(全集)

UNI-App框架基础部分

文章目录

    • 一、全局配置和页面配置
      • 1.globalStyle全局外观配置
      • 2.page配置
      • 3.tabbar配置
      • 4.condition启动模式配置
    • 二、组件的基本使用
      • 1.text组件文本组件
      • 2.view组件
      • 3.Bottom组件
      • 4.image组件
    • 三、uni-app中的样式
    • 四、数据绑定
      • 1.插值
      • 2.v-bind
      • 3.v-for
    • 五、uni中的事件
      • 1.v-on事件绑定
    • 六、uniapp生命周期
      • 1.应用的生命周期
      • 2.页面的生命周期
    • 七、下拉刷新
      • 1.onPullDownRefresh
      • 2.onReachBottom
    • 八、网络请求
      • 1.发送get请求
    • 九、数据缓存
      • 1.uni.setStorage(OBJECT)
      • 2.[#](https://uniapp.dcloud.net.cn/api/storage/storage.html#setstoragesync)uni.setStorageSync(KEY,DATA)
      • 3.[#](https://uniapp.dcloud.net.cn/api/storage/storage.html#getstorage)uni.getStorage(OBJECT)
      • 4.[#](https://uniapp.dcloud.net.cn/api/storage/storage.html#getstoragesync)uni.getStorageSync(KEY)
      • 5.[#](https://uniapp.dcloud.net.cn/api/storage/storage.html#removestorage)uni.removeStorage(OBJECT)
      • 6.[#](https://uniapp.dcloud.net.cn/api/storage/storage.html#removestoragesync)uni.removeStorageSync(KEY)
    • 十、上传预览
      • 1.上传图片
      • 2.预览图片
    • 十一、条件注释/跨端兼容
      • 条件编译处理多端差异
      • 1.组件中条件编译
      • 2.API条件编译
    • 十二、导航跳转
      • 1.navigator进行跳转
      • 2.利用编程试导航进行跳转
      • 3.导航跳转传递参数
    • 十三、组件的创建
      • 1.组件的生命周期函数
    • 十四、组件的通讯
      • 1.父组件给子组件传值
      • 2.子组件给父组件传值
      • 3.兄弟组件通讯

项目结构介绍

pages -------- 存放页面

static ------- 存放静态资源

unpackage -------- 存放打包文件

App.vue -------- 项目的跟组件,所有页面都是在App.vue下进行切换的,页面的入口文件

main.js -------- 项目的入口文件

manifest.json -------- 配置应用打包的

pages.json -------- 设置项目页面的存放路径,项目全局外观

uni.scss -------- 存放一些常用的样式变量

开发规范:

  • 页面遵循Vue单文件组件(SFC)规范
  • 组件标签靠近小程序规范,详见uni-app组件规范
  • 接口能力(JS API)靠近微信小程序规范,但需将前缀wx替换为uni,详见uni-app接口规范
  • 数据绑定及时间处理同Vue.js规范马桶是补充了App及页面的生命周期
  • 为兼容多端运行梦见一使用flex布局进行开发

一、全局配置和页面配置

1.globalStyle全局外观配置

**【官方文档】**用于设置应用的状态栏、导航条、标题、窗口背景色等。

属性 类型 默认值 描述 平台差异说明
navigationBarBackgroundColor HexColor #F8F8F8 导航栏背景颜色(同状态栏背景色) APP与H5为#F8F8F8,小程序平台请参考相应小程序文档
navigationBarTextStyle String black 导航栏标题颜色及状态栏前景颜色,仅支持 black/white 支付宝小程序不支持,请使用 my.setNavigationBar
navigationBarTitleText String 导航栏标题文字内容
navigationStyle String default 导航栏样式,仅支持 default/custom。custom即取消默认的原生导航栏,需看使用注意 微信小程序 7.0+、百度小程序、H5、App(2.0.3+)
backgroundColor HexColor #ffffff 下拉显示出来的窗口的背景色 微信小程序
backgroundTextStyle String dark 下拉 loading 的样式,仅支持 dark / light 微信小程序
enablePullDownRefresh Boolean false 是否开启下拉刷新,详见页面生命周期。
onReachBottomDistance Number 50 页面上拉触底事件触发时距页面底部距离,单位只支持px,详见页面生命周期
backgroundColorTop HexColor #ffffff 顶部窗口的背景色(bounce回弹区域) 仅 iOS 平台
backgroundColorBottom HexColor #ffffff 底部窗口的背景色(bounce回弹区域) 仅 iOS 平台
titleImage String 导航栏图片地址(替换当前文字标题),支付宝小程序内必须使用https的图片链接地址 支付宝小程序、H5、APP
transparentTitle String none 导航栏整体(前景、背景)透明设置。支持 always 一直透明 / auto 滑动自适应 / none 不透明 支付宝小程序、H5、APP
titlePenetrate String NO 导航栏点击穿透 支付宝小程序、H5
pageOrientation String portrait 横屏配置,屏幕旋转设置,仅支持 auto / portrait / landscape 详见 响应显示区域变化 App 2.4.7+、微信小程序、QQ小程序
animationType String pop-in 窗口显示的动画效果,详见:窗口动画 App
animationDuration Number 300 窗口显示动画的持续时间,单位为 ms App
app-plus Object 设置编译到 App 平台的特定样式,配置项参考下方 app-plus App
h5 Object 设置编译到 H5 平台的特定样式,配置项参考下方 H5 H5
mp-alipay Object 设置编译到 mp-alipay 平台的特定样式,配置项参考下方 MP-ALIPAY 支付宝小程序
mp-weixin Object 设置编译到 mp-weixin 平台的特定样式,配置项参考下方 MP-WEIXIN 微信小程序
mp-baidu Object 设置编译到 mp-baidu 平台的特定样式,配置项参考下方 MP-BAIDU 百度小程序
mp-toutiao Object 设置编译到 mp-toutiao 平台的特定样式 抖音小程序
mp-lark Object 设置编译到 mp-lark 平台的特定样式 飞书小程序
mp-qq Object 设置编译到 mp-qq 平台的特定样式 QQ小程序
mp-kuaishou Object 设置编译到 mp-kuaishou 平台的特定样式 快手小程序
mp-jd Object 设置编译到 mp-jd 平台的特定样式 京东小程序
usingComponents Object 引用小程序组件,参考 小程序组件
renderingMode String 同层渲染,webrtc(实时音视频) 无法正常时尝试配置 seperated 强制关掉同层 微信小程序
leftWindow Boolean true 当存在 leftWindow 时,默认是否显示 leftWindow H5
topWindow Boolean true 当存在 topWindow 时,默认是否显示 topWindow H5
rightWindow Boolean true 当存在 rightWindow 时,默认是否显示 rightWindow H5
rpxCalcMaxDeviceWidth Number 960 rpx 计算所支持的最大设备宽度,单位 px App(vue2 且不含 nvue)、H5(2.8.12+)
rpxCalcBaseDeviceWidth Number 375 rpx 计算使用的基准设备宽度,设备实际宽度超出 rpx 计算所支持的最大设备宽度时将按基准宽度计算,单位 px App(vue2 且不含 nvue)、H5(2.8.12+)
rpxCalcIncludeWidth Number 750 rpx 计算特殊处理的值,始终按实际的设备宽度计算,单位 rpx App(vue2 且不含 nvue)、H5(2.8.12+)
dynamicRpx Boolean false 动态 rpx,屏幕大小变化会重新渲染 rpx App-nvue(vue3 固定值为 true) 3.2.13+
maxWidth Number 单位px,当浏览器可见区域宽度大于maxWidth时,两侧留白,当小于等于maxWidth时,页面铺满;不同页面支持配置不同的maxWidth;maxWidth = leftWindow(可选)+page(页面主体)+rightWindow(可选) H5(2.9.9+)

注意

  • 支付宝小程序使用titleImage时必须使用https的图片链接地址,需要真机调试才能看到效果,支付宝开发者工具内无效果
  • globalStyle中设置的titleImage也会覆盖掉pages->style内的设置文字标题
  • 使用 maxWidth 时,页面内fixed元素需要使用–window-left,–window-right来保证布局位置正确
  • dynamicRpx vue3 nvue页面已移除此配置,升级为横竖屏切换自动rpx,如果不需要可以使用 px

示例:

	"globalStyle": {
		"navigationBarTextStyle": "white", //标题颜色
		"navigationBarTitleText": "绿帽子", // 标题文字(全局的)
		"navigationBarBackgroundColor": "#00ff00", //导航栏背景颜色 
		"backgroundColor": "#aaaa00", // 下拉区域背景颜色
		"enablePullDownRefresh": true, //是否开启下拉刷新
		"backgroundTextStyle": "light" ,// 下拉loding的演示,仅支持dark/light
	}

2.page配置

uni-app 通过 pages 节点配置应用由哪些页面组成,pages 节点接收一个数组,数组每个项都是一个对象,其属性值如下:

属性 类型 默认值 描述
path String 配置页面路径
style Object 配置页面窗口表现,配置项参考下方 pageStyle
needLogin Boolean false 是否需要登录才可访问

Tips:

  • pages节点的第一项为应用入口页(即首页)
  • 应用中新增/减少页面,都需要对 pages 数组进行修改
  • 文件名不需要写后缀,框架会自动寻找路径下的页面资源

style

用于设置每个页面的状态栏、导航条、标题、窗口背景色等。

页面中配置项会覆盖 globalStyle 中相同的配置项

注意

  • 使用 maxWidth 时,页面内fixed元素需要使用–window-left,–window-right来保证布局位置正确
{
			"path": "pages/index/index",
			"style": {
				"navigationBarTitleText": "主页",
				"navigationBarBackgroundColor": "#00ff7f", //导航栏背景颜色
				"h5": { //配置在H5页面编译的样式
					"titleNView": {
						"titleColor": "write"
					}
				}
			}

		}

3.tabbar配置

如果应用是一个多 tab 应用,可以通过 tabBar 配置项指定一级导航栏,以及 tab 切换时显示的对应页。

Tips

  • 当设置 position 为 top 时,将不会显示 icon
  • tabBar 中的 list 是一个数组,只能配置最少2个、最多5个 tab,tab 按数组的顺序排序。
  • tabbar 切换第一次加载时可能渲染不及时,可以在每个tabbar页面的onLoad生命周期里先弹出一个等待雪花(hello uni-app使用了此方式)
  • tabbar 的页面展现过一次后就保留在内存中,再次切换 tabbar 页面,只会触发每个页面的onShow,不会再触发onLoad。
  • 顶部的 tabbar 目前仅微信小程序上支持。需要用到顶部选项卡的话,建议不使用 tabbar 的顶部设置,而是自己做顶部选项卡,可参考 hello uni-app->模板->顶部选项卡。

属性说明:

属性 类型 必填 默认值 描述 平台差异说明
color HexColor tab 上的文字默认颜色
selectedColor HexColor tab 上的文字选中时的颜色
backgroundColor HexColor tab 的背景色
borderStyle String black tabbar 上边框的颜色,可选值 black/white,也支持其他颜色值 App 2.3.4+ 、H5 3.0.0+
blurEffect String none iOS 高斯模糊效果,可选值 dark/extralight/light/none(参考:使用说明) App 2.4.0+ 支持、H5 3.0.0+(只有最新版浏览器才支持)
list Array tab 的列表,详见 list 属性说明,最少2个、最多5个 tab
position String bottom 可选值 bottom、top top 值仅微信小程序支持
fontSize String 10px 文字默认大小 App 2.3.4+、H5 3.0.0+
iconWidth String 24px 图标默认宽度(高度等比例缩放) App 2.3.4+、H5 3.0.0+
spacing String 3px 图标和文字的间距 App 2.3.4+、H5 3.0.0+
height String 50px tabBar 默认高度 App 2.3.4+、H5 3.0.0+
midButton Object 中间按钮 仅在 list 项为偶数时有效 App 2.3.4+、H5 3.0.0+
iconfontSrc String list设置 iconfont 属性时,需要指定字体文件路径 App 3.4.4+、H5 3.5.3+
backgroundImage String 设置背景图片,优先级高于 backgroundColor App
backgroundRepeat String 设置标题栏的背景图平铺方式,可取值:“repeat” - 背景图片在垂直方向和水平方向平铺;“repeat-x” - 背景图片在水平方向平铺,垂直方向拉伸;“repeat-y” - 背景图片在垂直方向平铺,水平方向拉伸;“no-repeat” - 背景图片在垂直方向和水平方向都拉伸。 默认使用 “no-repeat” App
redDotColor String tabbar上红点颜色 App

其中 list 接收一个数组,数组中的每个项都是一个对象,其属性值如下:

属性 类型 必填 说明 平台差异
pagePath String 页面路径,必须在 pages 中先定义
text String tab 上按钮文字,在 App 和 H5 平台为非必填。例如中间可放一个没有文字的+号图标
iconPath String 图片路径,icon 大小限制为40kb,建议尺寸为 81px * 81px,当 position 为 top 时,此参数无效,不支持网络图片,不支持字体图标
selectedIconPath String 选中时的图片路径,icon 大小限制为40kb,建议尺寸为 81px * 81px ,当 position 为 top 时,此参数无效
visible Boolean 该项是否显示,默认显示 App (3.2.10+)、H5 (3.2.10+)
iconfont Object 字体图标,优先级高于 iconPath App(3.4.4+)、H5 (3.5.3+)

midButton 属性说明

属性 类型 必填 默认值 描述
width String 80px 中间按钮的宽度,tabBar 其它项为减去此宽度后平分,默认值为与其它项平分宽度
height String 50px 中间按钮的高度,可以大于 tabBar 高度,达到中间凸起的效果
text String 中间按钮的文字
iconPath String 中间按钮的图片路径
iconWidth String 24px 图片宽度(高度等比例缩放)
backgroundImage String 中间按钮的背景图片路径
iconfont Object 字体图标,优先级高于 iconPath App(3.4.4+)

代码示例

"tabBar": {
		"color": "#A0522D", //未选中的文字颜色
		"selectedColor": "#B3EE3A", // 选中的文字颜色
		"backgroundColor": "#FFFFFF", // 按钮背景色、
		"borderStyle": "black", //上边框的颜色
		"position": "bottom", // 底部信息栏或者顶部信息栏位置 
		//只有bottom 和top 设置top时候图标不显示,只在小程序中生效
		"list": [{
				"text": "首页", //文字
				"pagePath": "pages/index/index", //页面路径
				"iconPath": "static/tabs/home.png", //默认没选中的
				"selectedIconPath": "static/tabs/home-active.png" //选中的
			},
			{
				"text": "信息", //文字
				"pagePath": "pages/massage/massage", //页面路径
				"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" //选中的
			}
		]
	}

4.condition启动模式配置

启动模式配置,仅开发期间生效,用于模拟直达页面的场景,如:小程序转发后,用户点击所打开的页面。

属性说明:

属性 类型 是否必填 描述
current Number 当前激活的模式,list节点的索引值
list Array 启动模式列表

list说明:

属性 类型 是否必填 描述
name String 启动模式名称
path String 启动页面路径
query String 启动参数,可在页面的 onLoad 函数里获得

注意: 在 App 里真机运行可直接打开配置的页面,微信开发者工具里需要手动改变编译模式,如下图:

示例代码:

"condition": { // 在微信开发者工具中添加了编译模式
		"current": 0,
		"list": [{
			"name": "详情页", // 编译名称
			"path": "pages/detail/detail", // 编译页面路径
			"query": "id=80" //编译参数
		}]
	}

二、组件的基本使用

1.text组件文本组件

文本组件。用于包裹文本内容。

在app-uvue和app-nvue中,文本只能写在text中,而不能写在view的text区域。

虽然app-uvue中写在view的text区域的文字,也会被编译器自动包裹一层text组件,看起来也可以使用。但这样会造成无法修改该text文字的样式,详见uvue的样式不继承章节

#属性说明

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

space 值说明

说明
ensp 中文字符空格一半大小
emsp 中文字符空格大小
nbsp 根据字体设置的空格大小

#子组件

text组件在web浏览器渲染(含浏览器、小程序webview渲染模式、app-vue)和uvue中,可以并只能嵌套text组件。

在nvue中,text组件不能嵌套。

#Tips

  • 支持 \n 方式换行。
  • 在app-nvue下,只有才能包裹文本内容。无法在组件包裹文本。
  • decode 可以解析的有 < > & '
  • 各个操作系统的空格标准并不一致。
  • 除了文本节点以外的其他节点都无法长按选中。
  • 如果使用 组件编译时会被转换为
  • nvue 样式 word-wrap 在 Android 平台暂不支持

示例代码

	<view>
		<view>
			<text>唱歌跳舞篮球text>
		view>
		<view>
			<text selectable>唱歌跳舞篮球text>
		view>
		<view>
			<text space="ensp">唱歌 篮球 中文字符空格一半大小text>
		view>
		<view>
			<text space="emsp">唱歌 篮球 中文字符空格大小text>
		view>
		<view>
			<text space="nbsp">唱歌 篮球 根据字体设置的空格大小text>
		view>
		<view>
			<text decode="true"> text>
		view>
	view>

2.view组件

视图容器。

它类似于传统html中的div,用于包裹各种元素内容。

如果使用nvue,则需注意,包裹文字应该使用组件。

属性说明

属性名 类型 默认值 说明
hover-class String none 指定按下去的样式类。当 hover-class=“none” 时,没有点击态效果
hover-stop-propagation Boolean false 指定是否阻止本节点的祖先节点出现点击态,App、H5、支付宝小程序、百度小程序不支持(支付宝小程序、百度小程序文档中都有此属性,实测未支持)
hover-start-time Number 50 按住后多久出现点击态,单位毫秒
hover-stay-time Number 400 手指松开后点击态保留时间,单位毫秒

示例代码

		<view class="box2" hover-class="box2-active">
			<view class="box" :hover-stay-time="2000" :hover-start-time="2000" hover-class="box-active"
				hover-stop-propagation="true">view>
		view>

3.Bottom组件

属性说明

属性名 类型 默认值 说明 生效时机 平台差异说明
size String default 按钮的大小
type String default 按钮的样式类型
plain Boolean false 按钮是否镂空,背景色透明
disabled Boolean false 是否禁用
loading Boolean false 名称前是否带 loading 图标 H5、App(App-nvue 平台,在 ios 上为雪花,Android上为圆圈)
form-type String 用于
组件,点击分别会触发 组件的 submit/reset 事件
open-type String 开放能力
hover-class String button-hover 指定按钮按下去的样式类。当 hover-class=“none” 时,没有点击态效果 App-nvue 平台暂不支持
hover-start-time Number 20 按住后多久出现点击态,单位毫秒
hover-stay-time Number 70 手指松开后点击态保留时间,单位毫秒
app-parameter String 打开 APP 时,向 APP 传递的参数,open-type=launchApp时有效 微信小程序、QQ小程序
hover-stop-propagation boolean false 指定是否阻止本节点的祖先节点出现点击态 微信小程序
lang string ‘en’ 指定返回用户信息的语言,zh_CN 简体中文,zh_TW 繁体中文,en 英文。 微信小程序
session-from string 会话来源,open-type="contact"时有效 微信小程序
send-message-title string 当前标题 会话内消息卡片标题,open-type="contact"时有效 微信小程序
send-message-path string 当前分享路径 会话内消息卡片点击跳转小程序路径,open-type="contact"时有效 微信小程序
send-message-img string 截图 会话内消息卡片图片,open-type="contact"时有效 微信小程序
show-message-card boolean false 是否显示会话内消息卡片,设置此参数为 true,用户进入客服会话会在右下角显示"可能要发送的小程序"提示,用户点击后可以快速发送小程序消息,open-type="contact"时有效 微信小程序
group-id String 打开群资料卡时,传递的群号 open-type=“openGroupProfile” QQ小程序
guild-id String 打开频道页面时,传递的频道号 open-type=“openGuildProfile” QQ小程序
public-id String 打开公众号资料卡时,传递的号码 open-type=“openPublicProfile” QQ小程序
data-im-id String 客服的抖音号 open-type=“im” 抖音小程序2.68.0版本+
data-im-type String IM卡片类型 open-type=“im” 抖音小程序2.80.0版本+
data-goods-id String 商品的id,仅支持泛知识课程库和生活服务商品库中的商品 open-type=“im” 抖音小程序2.80.0版本+
data-order-id String 订单的id,仅支持交易2.0订单 open-type=“im” 抖音小程序2.80.0版本+
data-biz-line String 商品类型,“1”代表生活服务,“2”代表泛知识。 open-type=“im” 抖音小程序2.80.0版本+
@getphonenumber Handler 获取用户手机号回调 open-type=“getPhoneNumber” 微信、支付宝、百度、抖音、快手、京东小程序
@getuserinfo Handler 用户点击该按钮时,会返回获取到的用户信息,从返回参数的detail中获取到的值同uni.getUserInfo open-type=“getUserInfo” 微信、QQ、百度、快手、京东小程序
@error Handler 当使用开放能力时,发生错误的回调 open-type=“launchApp” 微信、QQ、快手、京东小程序
@opensetting Handler 在打开授权设置页并关闭后回调 open-type=“openSetting” 微信、QQ、百度、快手、京东小程序
@launchapp Handler 从小程序打开 App 成功的回调 open-type=“launchApp” 微信、QQ、快手、京东小程序
@contact Handler 客服消息回调 open-type=“contact” 微信、QQ、百度、快手小程序
@chooseavatar Handler 获取用户头像回调 open-type=“chooseAvatar” 微信小程序
@agreeprivacyauthorization Handler 用户同意隐私协议事件回调,open-type="agreePrivacyAuthorization"时有效 open-type=“agreeprivacyauthorization” 微信小程序2.33.0
@addgroupapp Handler 添加群应用的回调 open-type=“addGroupApp” QQ小程序
@chooseaddress Handler 调起用户编辑并选择收货地址的回调 open-type=“chooseAddress” 百度小程序
@chooseinvoicetitle Handler 用户选择发票抬头的回调 open-type=“chooseInvoiceTitle” 百度小程序
@subscribe Handler 订阅消息授权回调 open-type=“subscribe” 百度小程序
@login Handler 登录回调 open-type=“login” 百度小程序
@im Handler 监听跳转IM的成功回调 open-type=“im” 抖音小程序2.68.0版本+
  • 注1:button-hover 默认为 {background-color: rgba(0, 0, 0, 0.1); opacity: 0.7;}
  • open-type="launchApp"时需要调起的APP接入微信OpenSDK详见
  • 微信小程序、Web、App平台 button组件的默认边框宽度为0.5px,不会占据实际的渲染宽高;当type属性为plain时,边框宽度是1px,如果未指定元素的宽高,此时边框宽度会占据实际渲染宽高。

#size 有效值

说明
default 默认大小
mini 小尺寸

button组件也支持style中通过css定义文字大小。见下

#type 有效值

说明
primary 微信小程序、360小程序为绿色,App、H5、百度小程序、支付宝小程序、飞书小程序、快应用为蓝色,抖音小程序为红色,QQ小程序为浅蓝色。如想在多端统一颜色,请改用default,然后自行写样式
default 白色
warn 红色

button组件也支持style中通过css定义颜色。

代码示例

<button size="mini">按钮button>
<button>按钮button>
<button type="primary">绿色button>
<button type="warn">红色button>
<button plain type="primary">镂空button>
<button disabled>禁用button>
<button loading>加载button>

4.image组件

图片组件。

属性名 类型 默认值 说明 平台差异说明
src String 图片资源地址
mode String ‘scaleToFill’ 图片裁剪、缩放的模式
lazy-load Boolean false 图片懒加载。只针对page与scroll-view下的image有效 微信小程序、百度小程序、抖音小程序、飞书小程序
fade-show Boolean true 图片显示动画效果 仅App-nvue 2.3.4+ Android有效
webp boolean false 在系统不支持webp的情况下是否单独启用webp。默认false,只支持网络资源。webp支持详见下面说明 微信小程序2.9.0
show-menu-by-longpress boolean false 开启长按图片显示识别小程序码菜单 微信小程序2.7.0
draggable boolean true 是否能拖动图片 H5 3.1.1+、App(iOS15+)
@error HandleEvent 当错误发生时,发布到 AppService 的事件名,事件对象event.detail = {errMsg: ‘something wrong’}
@load HandleEvent 当图片载入完毕时,发布到 AppService 的事件名,事件对象event.detail = {height:‘图片高度px’, width:‘图片宽度px’}

#图片格式说明:

  • 当使用浏览器/webview渲染时,支持哪些图片格式由webview决定,详见
  • 当使用uvue原生渲染时支持的格式如下
    • bmp
    • gif
    • ico
    • jpg
    • png
    • webp
    • heic(Android10+支持)
    • avif
    • tif
    • svg
  • 可以通过插件来扩展app平台nvue/uvue的图片支持,比如插件市场搜索svg插件
  • 小程序上只支持网络地址的svg图
  • webp图片支持详解
    • Android4以上(含)、iOS14以上(含)系统内置支持webp,此时,不管web、小程序、app,也不管vue/nvue/uvue都可以直接使用webp;
    • iOS14以下,app-vue下,iOS不支持;app-nvue/uvue下,iOS支持;微信小程序2.9.0起,配置属性webp为true时iOS支持;
    • pc浏览器上,webp在不同浏览器的支持详见:https://caniuse.com/?search=webp

Tips

  • 组件未设置宽高时,默认宽度320px、高度240px。尤其注意当图片加载失败时,widthFix模式指定宽度的图片,虽然图片空白,但其高度会变成240px;app-nvue平台,暂时默认为屏幕宽度、高度 240px;
  • src 仅支持相对路径、绝对路径,支持 base64 码;
  • 页面结构复杂,css样式太多的情况,使用 image 可能导致样式生效较慢,出现 “闪一下” 的情况,此时设置 image{will-change: transform},可优化此问题。
  • 自定义组件里面使用 时,若 src 使用相对路径可能出现路径查找失败的情况,故建议使用绝对路径。

#mode 有效值

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

模式 说明
缩放 scaleToFill 不保持纵横比缩放图片,使图片的宽高完全拉伸至填满 image 元素
缩放 aspectFit 保持纵横比缩放图片,使图片的长边能完全显示出来。也就是说,可以完整地将图片显示出来。
缩放 aspectFill 保持纵横比缩放图片,只保证图片的短边能完全显示出来。也就是说,图片通常只在水平或垂直方向是完整的,另一个方向将会发生截取。
缩放 widthFix 宽度不变,高度自动变化,保持原图宽高比不变
缩放 heightFix 高度不变,宽度自动变化,保持原图宽高比不变 App 和 H5 平台 HBuilderX 2.9.3+ 支持、微信小程序需要基础库 2.10.3
裁剪 top 不缩放图片,只显示图片的顶部区域
裁剪 bottom 不缩放图片,只显示图片的底部区域
裁剪 center 不缩放图片,只显示图片的中间区域
裁剪 left 不缩放图片,只显示图片的左边区域
裁剪 right 不缩放图片,只显示图片的右边区域
裁剪 top left 不缩放图片,只显示图片的左上边区域
裁剪 top right 不缩放图片,只显示图片的右上边区域
裁剪 bottom left 不缩放图片,只显示图片的左下边区域
裁剪 bottom right 不缩放图片,只显示图片的右下边区域

示例代码


<image src="https://pic.ibaotu.com/01/41/88/888piC1R888piCwD7.jpg-0.jpg!cg845">image>

<image mode="aspectFill" src="https://pic.ibaotu.com/01/41/88/888piC1R888piCwD7.jpg-0.jpg!cg845">image>

<image mode="aspectFit" src="https://pic.ibaotu.com/01/41/88/888piC1R888piCwD7.jpg-0.jpg!cg845">image>

三、uni-app中的样式

uni-app 支持less、sass、scss、stylus等预处理器。

尺寸单位

uni-app 支持的通用 css 单位包括 px、rpx

  • px 即屏幕像素
  • rpx 即响应式 px,一种根据屏幕宽度自适应的动态单位。以 750 宽的屏幕为基准,**750rpx 恰好为屏幕宽度。**屏幕变宽,rpx 实际显示效果会等比放大,但在 App(vue2 不含 nvue) 端和 H5(vue2) 端屏幕宽度达到 960px 时,默认将按照 375px 的屏幕宽度进行计算,具体配置参考:rpx 计算配置 。

vue 页面支持下面这些普通 H5 单位,但在 nvue 里不支持:

  • rem 根字体大小可以通过 page-meta 配置抖音小程序和飞书小程序:屏幕宽度/20、百度小程序:16px、支付宝小程序:50px
  • vh viewpoint height,视窗高度,1vh 等于视窗高度的 1%
  • vw viewpoint width,视窗宽度,1vw 等于视窗宽度的 1%

四、数据绑定

1.插值

数据绑定最常见的形式就是文本插值:

<template>
	<view>
		<view>Message: {{ msg }}view>
	view>
template>
<script>
	export default {
		data() {
			return {
				msg: 'Hello Vue!'
			}
		}
	}
script>

复制代码

里的内容将会被替代为对应数据对象上msg的值。无论何时,绑定的数据对象上msg发生了改变,插值处的内容都会更新。

#使用 JavaScript 表达式

迄今为止,在我们的模板中,我们一直都只绑定简单的 property 键值。但实际上,对于所有的数据绑定,Vue.js 都提供了完全的 JavaScript 表达式支持。

<template>
    <view>
      <view>{{ number + 1 }}view>
      <view>{{ ok ? 'YES' : 'NO' }}view>
      
      <view>{{ message.split('').reverse().join('') }}view>
    view>
template>
<script>
  export default {
    data() {
      return {
        number:1,
        ok:true,
        message: 'Hello Vue!'
      }
    }
  }
script>
<template>
  <view>
      <view v-for="(item,index) in 10">
      
      <view :class="'list-' + index%2">{{index%2}}view>
    view>
  view>
template>
<script>
  export default {
    data() {
      return { }
    }
  }
script>
<style>
  .list-0{
    background-color: #aaaaff;
  }
  .list-1{
    background-color: #ffaa7f;
  }
style>

这些表达式会在所属 Vue 实例的数据作用域下作为 JavaScript 被解析。有个限制就是,每个绑定都只能包含单个表达式,所以下面的例子都不会生效。

2.v-bind

动态地绑定一个或多个属性,或一个组件 prop 到表达式。

  • v-bind缩写为‘ : ’
  • 在绑定 prop 时,prop 必须在子组件中声明。
  • 可以用修饰符指定不同的绑定类型。
	<image v-bind:src="imgUrl">image>
	
	<image :src="imgUrl">image>
	
	<my-component :prop="someThing">my-component>
	<button v-bind:disabled="isButtonDisabled">Buttonbutton>

复制代码

如果 isButtonDisabled 的值是 nullundefinedfalse ,则 disabled 甚至不会被包含在渲染出来的 button 元素中。

#v-on

v-on 指令,它用于监听 DOM 事件。v-on缩写为‘ @ ’,下文简称为 @事件

	
	<view v-on:click="doSomething">点击view>
	
	<view @click="doSomething">点击view>

3.v-for

在 v-for 里使用数组

v-for 指令可以实现基于一个数组来渲染一个列表。

  • v-for
    

    指令需要使用

    item in items
    

    形式的特殊语法,其中

    items
    

    是源数据数组,而

    item
    

    则是被迭代的数组元素的别名。

    • 第一个参数 item 则是被迭代的数组元素的别名。
    • 第二个参数,即当前项的索引 index ,是可选的。
	<template>
		<view>
			<view v-for="(item, index) in items">
				{{ index }} - {{ item.message }}
			view>
		view>
	template>
	<script>
		export default {
			data() {
				return {
					items: [
						{ message: 'Foo' },
						{ message: 'Bar' }
					]
				}
			}
		}
	script>

结果:

	0 - Foo
	1 - Bar

#在 v-for 里使用对象

你也可以用 v-for 来遍历一个对象的 property

  • 第一个参数 value 是被迭代的对象元素的属性值。
  • 第二个参数为 property 名称 (也就是键名)。
  • 第三个参数作为索引。
	<template>
		<view>
			<view v-for="(value, name, index) in object">
				 {{ index }}. {{ name }}: {{ value }}
			view>
		view>
	template>
	<script>
		export default {
			data() {
				return {
					object: {
						title: 'How to do lists in Vue',
						author: 'Jane Doe',
						publishedAt: '2020-04-10'
					}
				}
			}
		}
	script>

结果:

	0.title: How to do lists in Vue,
	1.author: Jane Doe,
	2.publishedAt: 2020-04-10

#列表渲染分组

类似于 v-if,你也可以利用带有 v-fortemplate 来循环渲染一段包含多个元素的内容。比如:

	<template v-for="item in items">
		<view>{{ item.message }}view>
		<view class="divider" role="presentation">view>
	template>

复制代码

#key

当 Vue 正在更新使用 v-for 渲染的元素列表时,它默认使用“就地更新”的策略。如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序,而是就地更新每个元素,并且确保它们在每个索引位置正确渲染。

如果列表中项目的位置会动态改变或者有新的项目添加到列表中,并且希望列表中的项目保持自己的特征和状态(如 input 中的输入内容,switch 的选中状态),需要使用 :key 来指定列表中项目的唯一的标识符。

:key 的值以两种形式提供

  • 使用 v-for 循环 arrayitem 的某个 property,该 property 的值需要是列表中唯一的字符串或数字,且不能动态改变。
  • 使用 v-for 循环中 item 本身,这时需要 item 本身是一个唯一的字符串或者数字

当数据改变触发渲染层重新渲染的时候,会校正带有 key 的组件,框架会确保他们被重新排序,而不是重新创建,以确保使组件保持自身的状态,并且提高列表渲染时的效率。

如不提供 :key,会报一个 warning, 如果明确知道该列表是静态,或者不必关注其顺序,可以选择忽略。

示例:

	<template>
		<view>
			
			<view v-for="(item,index) in objectArray" :key="item.id">
				{{index +':'+ item.name}}
			view>
			
			<view v-for="(item,index) in stringArray" :key="item">
				{{index +':'+ item}}
			view>
		view>
	template>
	<script>
	export default {
		data () {
			return {
				objectArray:[{
					id:0,
					name:'li ming'
				},{
					id:1,
					name:'wang peng'
				}],
				stringArray:['a','b','c']
			}
		}
	}
	script>

#注意事项

  • 在H5平台 使用 v-for 循环整数时和其他平台存在差异,如 v-for="(item, index) in 10" 中,在H5平台 item 从 1 开始,其他平台 item 从 0 开始,可使用第二个参数 index 来保持一致。
  • 在非H5平台 循环对象时不支持第三个参数,如 v-for="(value, name, index) in object" 中,index 参数是不支持的。
  • 小程序端数据为差量更新方式,由于小程序不支持删除对象属性,使用的设置值为 null 的方式替代,导致遍历时可能出现不符合预期的情况,需要自行过滤一下值为 null 的数据(相关反馈)。

#在组件上使用 v-for

在自定义组件上,你可以像在任何普通元素上一样使用 v-for

	<my-component v-for="item in items" :key="item.id">my-component>

当在组件上使用 v-for 时,key是必须的。

五、uni中的事件

1.v-on事件绑定

v-on 指令,它用于监听 DOM 事件。v-on缩写为‘ @ ’,下文简称为 @事件

	
	<view v-on:click="doSomething">点击view>
	
	<view @click="doSomething">点击view>

事件传参

<button type="primary" v-on:click="clickHandle(10,$event)">按钮button>
methods: {
    clickHandle(num, e) { //e -- $event是事件对象
        console.log(num, e)
    }
},

六、uniapp生命周期

1.应用的生命周期

生命周期的概念:一个对象从创建、运行、销毁的整个过程被称为生命周期

生命周期函数:在生命周期中每个阶段会伴随着每一个函数的出发,这些函数被称为生命周期函数

所有页面都是在App.vue下进行切换的,是应用入口文件。但App.vue本身不是页面,这里不能编写视图元素,也就是没有