小程序简介
微信(WeCha)是腾讯公司于2011年1月21日推出的一款为智能终端提供即时通信( Instant Messaging, IM)服务的应用程序。
微信之父张小龙曾经解释:小程序是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫(二维码)或者搜一下(关键词)即可打开应用。微信小程序体现了“用完即走”的理念,用户不用关心是否安装太多应用的问题。有了微信小程序,应用将无处不在,随时可用,且无须安装与卸载。
小程序、 订阅号、服务号、企业微信(企业号)属于微信公众平台的四大生态体系,它们面向不同的用户群体,应用于不同的方向和用途。小程序是微信的一种新的开发能力,具有出色的用户使用体验,可以在微信内被便捷地获取和传播;订阅号为媒体和个人提供一种新的信息传播方式,构建信息发布者与浏览者之间更好的沟通与管理模式;服务号为企业和组织提供更强大的服务与用户管理能力,帮助企业快速实现全新的公众号服务平台;企业微信(公众号)为企业提供专业的通信工具、丰富的办公应用与应用程序接口( ApplicationProgramming Interface, APD), 助力企业高效沟通与办公。
小程序的特征
小程序嵌人微信之中,不需要下载安装外部应用,用户通过扫描二维码和搜索相关功能的关键词即可使用,具备无须安装、触手可及、用完即走、无须卸载的特性。小程序可以被理解为“镶嵌在微信的超级App'
1.无须安装
小程序内嵌于微信程序之中,用户在使用过程中无须在应用商店下载安装外部应用。2.触手可及
用户通过扫描二维码等形式直接进人小程序,实现线下场景与线上应用的即时联通。3.用完即走
用户在线下场景中,当有相关需求时,可以直接接人小程序,使用服务功能后便可以对其不理会,实现用完即走。
的关4. 无须卸载
用户在访问小程序后可以直接关闭小程序,无须卸载。
小程序应用场景的特点
张小龙先生希望微信小程序对用户来说,应该是“无处不在、触手可及、随时可用、
完即走”的一种“小应用”,重点在“小”,主要体现在以下两个方面。
1.简单的业务逻辑中默小赴婚则人1。I
简单是指应用本身的业务逻辑并不复杂。例如,出行类应用“ofo小黄黄车”,该应用的业务逻辑非常简单,服务时间很短
低频度是小程序使用场最的另一 个特点。例如,提供在线购买电影票服务的小程序应用“猫眼”用户对该小程序的使用频度不是很高,就没有必要在手机中安装一个 单独功能的App。
我的第一个程序
{
"usingComponents": {
"navigation-bar": "/components/navigation-bar/navigation-bar"
}
}
/**index.scss**/
page {
height: 100vh;
display: flex;
flex-direction: column;
}
.scrollarea {
flex: 1;
overflow-y: hidden;
}
.userinfo {
display: flex;
flex-direction: column;
align-items: center;
color: #aaa;
width: 80%;
}
.userinfo-avatar {
overflow: hidden;
width: 128rpx;
height: 128rpx;
margin: 20rpx;
border-radius: 50%;
}
.usermotto {
margin-top: 200px;
}
.avatar-wrapper {
padding: 0;
width: 56px !important;
border-radius: 8px;
margin-top: 40px;
margin-bottom: 40px;
}
.avatar {
display: block;
width: 56px;
height: 56px;
}
.nickname-wrapper {
display: flex;
width: 100%;
padding: 16px;
box-sizing: border-box;
border-top: .5px solid rgba(0, 0, 0, 0.1);
border-bottom: .5px solid rgba(0, 0, 0, 0.1);
color: black;
}
.nickname-label {
width: 105px;
}
.nickname-input {
flex: 1;
}
// index.ts
// 获取应用实例
const app = getApp<IAppOption>()
const defaultAvatarUrl = 'https://mmbiz.qpic.cn/mmbiz/icTdbqWNOwNRna42FI242Lcia07jQodd2FJGIYQfG0LAJGFxM4FbnQP6yfMxBgJ0F3YRqJCJ1aPAK2dQagdusBZg/0'
Component({
data: {
motto: 'Hello World',
userInfo: {
avatarUrl: defaultAvatarUrl,
nickName: '',
},
hasUserInfo: false,
canIUseGetUserProfile: wx.canIUse('getUserProfile'),
canIUseNicknameComp: wx.canIUse('input.type.nickname'),
},
methods: {
// 事件处理函数
bindViewTap() {
wx.navigateTo({
url: '../logs/logs',
})
},
onChooseAvatar(e: any) {
const { avatarUrl } = e.detail
const { nickName } = this.data.userInfo
this.setData({
"userInfo.avatarUrl": avatarUrl,
hasUserInfo: nickName && avatarUrl && avatarUrl !== defaultAvatarUrl,
})
},
onInputChange(e: any) {
const nickName = e.detail.value
const { avatarUrl } = this.data.userInfo
this.setData({
"userInfo.nickName": nickName,
hasUserInfo: nickName && avatarUrl && avatarUrl !== defaultAvatarUrl,
})
},
getUserProfile() {
// 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认,开发者妥善保管用户快速填写的头像昵称,避免重复弹窗
wx.getUserProfile({
desc: '展示用户信息', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
success: (res) => {
console.log(res)
this.setData({
userInfo: res.userInfo,
hasUserInfo: true
})
}
})
},
},
})
<!--index.wxml-->
<navigation-bar title="Weixin" back="{{false}}" color="black" background="#FFF"></navigation-bar>
<scroll-view class="scrollarea" scroll-y type="list">
<view class="container">
<view class="userinfo">
<block wx:if="{{canIUseNicknameComp && !hasUserInfo}}">
<button class="avatar-wrapper" open-type="chooseAvatar" bind:chooseavatar="onChooseAvatar">
<image class="avatar" src="{{userInfo.avatarUrl}}"></image>
</button>
<view class="nickname-wrapper">
<text class="nickname-label">昵称</text>
<input type="nickname" class="nickname-input" placeholder="请输入昵称" bind:change="onInputChange" />
</view>
</block>
<block wx:elif="{{!hasUserInfo}}">
<button wx:if="{{canIUseGetUserProfile}}" bindtap="getUserProfile"> 获取头像昵称 </button>
<view wx:else> 请使用2.10.4及以上版本基础库 </view>
</block>
<block wx:else>
<image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"></image>
<text class="userinfo-nickname">{{userInfo.nickName}}</text>
</block>
</view>
<view class="usermotto">
<text class="user-motto">{{motto}}</text>
</view>
</view>
</scroll-view>
微信小程序开发者工具界面功
1.工具栏
开不在工具栏中可以实现多 种功能,例如账号的切换, 模拟区、编辑区、调试区 的显示/隐藏,小程序的编译、预览,切换后台,清理缓存等。
2.模拟区
在模拟区中 选择模拟手机的类型、显示比例、网络类型后,模拟器中会显示小程序的运行效果。
3.目录文件区
目录文件区用来显示当前项目的目录结构,单击左上角的“+”按钮可以进行目录和文件的创建,右键单击目录文件区中的文件或目录可以进行“硬盘打开”“重命名”“删除”等相关操作。
4.编辑区
编辑区用来实现对代码的编辑操作,编辑区中支持对. wxml、.wxss、. js及. json文件的操作,使用组合键能提高代码的编辑效率。常用的组合键如表1-1所示。
5. 调试区
调试区的功能是帮助开发者进行代码调试及排查有问题的区域。小程序系统为开发者提供了9个调试功能模块,分别是Console 、Sources 、Network 、Security 、Storage、 AppData、Wxml、Sensor和Trace。最右边的扩展菜单项“:”是定制与控制开发工具按钮,如图1 -24所示。
第二章
1.小程序基本目录结构
pages用来存放所有小程序的页面
utils用来存放工具性质的模块(例如:格式化时间的自定义模块)
app.js 小程序项目的入口文件(项目组合逻辑文件,用于处理文件需求)
app.json 小程序项目的全局配置文件app.wxss 小程序项目的全局样式文件project.config.json 项目的配置文件
sitemap.json用来配置小程序及其页面是否允许被微信索引
1*.js文件(页面的脚本文件,存放页面的数据、事件处理函数等)
2*.json 文件(当前页面的配置文件,配置窗口的外观、表现等).wxml文件(页面的模板结构文件)
3*.wxss文件(当前页面的样式表文件)
小程序的开发框架:
微信团队为小程序的开发提供了MINA框架。MINA框架通过微信客户端提供文件系统、网络通信、任务管理、数据安全等基础功能,对上层提供了一整套JavaScript API,让开发者能够非常方便地使用微信客户端提供的各种基础功能快速构建应用。
视图层:
MINA框架的视图层有WXML与WXSS编写,由组件来进行展示。对于微信小程序而言,视图层就是所有.wxml文件与.wxss文件的集合:.wxml文件用于描述页面的结构;.wxss文件用于描述页面的样式。
逻辑层:
逻辑层用于处理事务逻辑,对于微信小程序而言,逻辑层就是所有.js脚本文件的集合。微信小程序在逻辑层将数据进行处理后发送给视图层,同时接收视图层的事件反馈。
数据层:
数据层在逻辑上包括页面临时数据或缓存、文件存储(本地存储)和网络存储与调用。
1.页面临时数据或缓存
2.文件存储(本地存储)
3.网络存储与调用
配置文件
1.全局配置文件
1、pages配置项
pages配置项接受一个数组,用来指定小程序由哪些页面组成,数组的每一项都是字符串,代表对应页面的“路径”+“文件名”。pages配置项是必填项。
2、window配置项
window配置项负责设置小程序状态栏、导航栏、标题、窗口背景色等系统样式。window配置项及其描述:
3、tabBar配置项
当需要在程序顶部或底部设置菜单栏时,可以通过配置tabBar配置项来实现。tabBar配置项及其描述:
tabBar中list选项:
4、netwoekTimeout配置项
小程序中各种网络请求API的超时时间值只能通过netwoekTimeout配置项进行统一设置,不能在API中单独设置。
netwoekTimeout配置项属性:
5.页面逻辑文件
冒泡事件:
页面结构文件
1、数据绑定
小程序在进行页面数据绑定时,框架会将WXML文件与逻辑文件中的data进行动态绑定,在页面中显示data中的数据。小程序的数据绑定使用Mustache语法(111)将变量或运算规则包起来
2、条件数据绑定
条件数据绑定就是根据绑定表达式的逻辑值来判断是否数据绑定当前组件
3、列表数据绑定
列表数据绑定用于将列表中的各项数据进行重复数据绑定
4、模版
在小程序中,如果要经常使用几个组件的组合(如“登录”选项),通常把这几个组件结合定义为一个模板,以后在需要的文件中直接使用这个模板。
示例代码:
*.js代码
Page({
data:{
name:'qsy',
age:18,
birthday:[{year: 2003 },{month: 5 },{date: 20 }],
object:{hobby:'csgo'},
num1:2,
num2:2,
students:[ {nickname:'tom',height:175,weight:120},
{nickname:'kary',height:170,weight:110}
]
}
})
*.json代码
{
"navigationBarBackgroundColor": "#ffffff",
"navigationBarTextStyle": "black",
"navigationBarTitleText": "页面配置演示",
"backgroundColor": "#eeeeee",
"backgroundTextStyle": "light",
"usingComponents": {
"navigation-bar": "/components/navigation-bar/navigation-bar"
}
}
*.wxml代码
<view>姓名:{{name}}</view>
<view>年龄:{{age}}</view>
<view>出生日期:
{{birthday[0].year}}年
{{birthday[1].month}}月
{{birthday[2].date}}日
</view>
<view>爱好:{{object.hobby}}</view>
<view>算数运算:{{num1}} + {{num2}} = {{num1 + num2}} </view>
<view>逻辑运算 :{{num2 == 2 }} </view>
<view>三元运算{{num1>num2? 'num1>num2':'num1<num2'}}</view>
<block wx:for="{{students}}">
<view>
<text>姓名:{{item.nickname}}、</text>
<text>身高:{{item.height}}、</text>
<text>体重:{{item.weight}}</text>
</view>
</block>
app.json代码
{
"pages": [
"pages/index/index",
"pages/logs/logs"
],
"window": {
"navigationBarBackgroundColor": "#fff",
"navigationBarTextStyle": "black",
"navigationBarTitleText": "小程序功能演示",
"backgroundColor": "#ccc",
"backgroundTextStyle":"light"
},
"tabBar": {
"color": "#66666",
"selectedColor": "#ff0000",
"borderStyle": "black",
"backgroundColor": "#ffffff",
"list": [{
"pagePath": "pages/index/index",
"text": "首页",
"iconPath": "images/aaa.png",
"selectedIconPath": "images/hhh.png"
},
{
"pagePath": "pages/logs/logs",
"iconPath": "images/aaa.png",
"selectedIconPath": "images/hhh.png",
"text": "新闻"
}]
}
}
app.js代码
// app.js
App({
onLaunch(){
console.log("小程序初始化")
},
onShow(){
console.log("小程序启动")
},
onHide(){
console.log("小程序隐藏")
}
})
运行界面
WXSS常用属性
WXSS文件与CSS中文件大部分属性名及属性值相同,WXSS的常用属性及属性值如图:
第三章
3.1、盒子模型
盒子模型就是我们在页面设计中经常用到的一种思维模型。在CSS中,一个独立的盒子模型由内容(content)、内边距(padding)、边框(border)、和外边距(margin)4个部分组成,
如图:
此外,对padding、border、和margin可以进一步细化为上、下、左、右4个部分,在CSS中可以分别进行设置,如图:
图中各元素的含义如下:
width和height 内容的宽度和高度。
padding-top、padding-right、padding-bottom和padding-left 上内边距、右内边距、底内边距和左内边距。
border-top、border-right、border-bottom和border-left 上边框、右边框、底边框、左边框。
margin-top、margin-right、margin-bottom和margin-left 上外边距、右外边距、底外边距和左外边距。
3.2、块级元素和行内元素
3.2.1、块级元素
<view style = "border:1px solid #f00"> 块状元素1</view>
<view style = "border:1px solid #0f0;margin:15px;padding:20px"> 块状元素2</view>
<view style = "border:1px solid #00f;width:200px;height:80px"> 块状元素3</view>
<view style = "border:1px solid #ccc;">
<view style = "height:60px">块状元素4</view>
</view>
<view style="border: 1px solid #f00;width:100px;background-color:#ccc">父级元素高度随内容决定,内容为文本
</view>
3.2.2、行内元素
<view style="padding: 20px;">
<text style="border: 1px solid #f00">文本1</text>
<text style="border: 1px solid #0f0;margin: 10px;padding: 5px">文本2</text>
<view style="border: 1px solid #00f;display: inline">块状元素设置为行内元素</view>一行显示不全,自动换行显示
</view>
3.2.3、行内块元素
运行效果:
3.3、浮动与定位
3.3.1、元素浮动与清除
<view>box1,box2,box3 没浮动</view>
<view style="border: 1px solid #f00;padding: 5px;">
<view style="border: 1px solid #0f0">box1</view>
<view style="border: 1px solid #0f0">box2</view>
<view style="border: 1px solid #0f0">box3</view>
</view>
box1左浮动
<view>box1左浮动</view>
<view style="border: 1px solid #f00;padding: 5px;">
<view style="float:left;border: 1px solid #0f0">box1</view>
<view style="border: 1px solid #0f0">box2</view>
<view style="border: 1px solid #0f0">box3</view>
</view>
box1、box2左浮动
<view>box1 box2左浮动</view>
<view style="border: 1px solid #f00;padding: 5px;">
<view style="float:left;border: 1px solid #0f0">box1</view>
<view style="float:left;border: 1px solid #0f0">box2</view>
<view style="border: 1px solid #0f0">box3</view>
</view>
box1 box2 box3左浮动
<view>box1 box2 box3左浮动</view>
<view style="border: 1px solid #f00;padding: 5px;">
<view style="float:left;border: 1px solid #0f0">box1</view>
<view style="float:left;border: 1px solid #0f0">box2</view>
<view style="float:left;border: 1px solid #0f0">box3</view>
</view>
box1 box2 左浮动 box3 清除左浮动
<view>box1 box2 左浮动 box3 清除左浮动 </view>
<view style="border: 1px solid #f00;padding: 5px;">
<view style="float:left;border: 1px solid #0f0">box1</view>
<view style="float:left;border: 1px solid #0f0">box2</view>
<view style="clear:left;border: 1px solid #0f0">box3</view>
</view>
box1 box2 box3 左浮动 在父元素后添加一个空元素
<view>box1 box2 box3 左浮动 在父元素后添加一个空元素</view>
<view style="border: 1px solid #f00;padding: 5px;" class="clearfloat">
<view style="float:left;border: 1px solid #0f0">box1</view>
<view style="float:left;border: 1px solid #0f0">box2</view>
<view style="float:left;border: 1px solid #0f0">box3</view>
</view>
运行效果:
3.3.2、元素定位
三个元素均未定位
<!--三个元素均未定位 static-->
<view style="border: 1px solid #0f0;width:100px;height: 100px">box1</view>
<view style="border: 1px solid #0f0;width:100px;height: 100px">box2</view>
<view style="border: 1px solid #0f0;width:100px;height: 100px">box3</view>
运行结果:
元素固定定位
<!--box2元素固定定位 fixed top:30px left:30px -->
<view style="border: 1px solid #0f0;width:100px;height: 100px">box1</view>
<view style="border: 1px solid #0f0;width:100px;height: 100px;position: fixed;left: 30px;top: 30px">box2</view>
<view style="border: 1px solid #0f0;width:100px;height: 100px">box3</view>
运行结果:
元素决定定位
<!--box2元素绝对定位 absolute top:30px left:30px-->
<view style="border: 1px solid #0f0;width:100px;height: 100px">box1</view>
<view style="border: 1px solid #0f0;width:100px;height: 100px;position: absolute;left: 30px;top: 30px">box2</view>
<view style="border: 1px solid #0f0;width:100px;height: 100px">box3</view>
运行结果:
三个元素均未定位
<!--三个元素均未定位 static-->
<view style="border: 1px solid #0f0;width:100px;height: 100px">box1</view>
<view style="border: 1px solid #0f0;width:100px;height: 100px">box2</view>
<view style="border: 1px solid #0f0;width:100px;height: 100px">box3</view>
运行结果:
如果将box1、box2、box3的父元素采用相对定位,将box2采用绝对定位:
<!--如果将box1、box2、box3的父元素采用相对定位,将box2采用绝对定位-->
<view style="position: relative;top: 50px;left: 50px;border: 1px solid #00f">
<view style="border: 1px solid #0f0;width:100px;height: 100px">box1</view>
<view style="border: 1px solid #0f0;width:100px;height: 100px;position: absolute;left: 30px;top: 30px">box2</view>
<view style="border: 1px solid #0f0;width:100px;height: 100px">box3</view>
</view>
运行结果:
如果将box1、box2、box3的父元素采用相对定位,将box2采用固定定位:
<!--如果将box1、box2、box3的父元素采用相对定位,将box2采用固定定位-->
<view style="position: relative;top: 50px;left: 50px;border: 1px solid #00f">
<view style="border: 1px solid #0f0;width:100px;height: 100px">box1</view>
<view style="border: 1px solid #0f0;width:100px;height: 100px;position: fixed;left: 30px;top: 30px">box2</view>
<view style="border: 1px solid #0f0;width:100px;height: 100px">box3</view>
</view>
运行结果:
如果将box1、box2、box3的父元素采用相对定位,将box2采用固定定位:
<!--如果将box1、box2、box3的父元素采用相对定位,将box2采用固定定位-->
<view style="position: relative;top: 50px;left: 50px;border: 1px solid #00f">
<view style="border: 1px solid #0f0;width:100px;height: 100px">box1</view>
<view style="border: 1px solid #0f0;width:100px;height: 100px;position: fixed;left: 30px;top: 30px">box2</view>
<view style="border: 1px solid #0f0;width:100px;height: 100px">box3</view>
</view>
运行结果:
3.4、flex布局 flex布局是万维网联盟(World Wide Web Consortium,W3C)在2009 年提出的一种新布局方案,该布局可以简单快速地完成各种可以伸缩的设计,以便很好地支持响应式布局。flex是flexible box的缩写,意为弹性盒子模型, 可以简便、完整、响应式地实现各种页面布局。 flex布局主要由容器和项目组成,采用flex 布局的元素称为fex容器 (flex container),flex 布局的所有直接子元素自动成为容器的成员, 称为flex项目(flexitem)。 容器默认存在两根轴:水平的主轴(mainaxis) 和垂直的交叉轴(cross axis)。 主轴的开始位置(与边框的交叉点) 叫做mainstart, 结束位置叫做mainend;交叉轴的开始位置叫做cross start,结束位置叫做cross end。 项目默认沿主轴排列。 单个项目占据的主轴空间叫做mainsize, 占据的交叉轴空间叫做cross size。flex布局模型如图3-12所示。 设置display属性可以将一个元素指定为flex布局, 设置fex-direction属性可以指定主轴方向。主轴既可以是水平方向, 也可以是垂直方向。 3.4.1、容器属性
1、display
display用来指定元素是否为flex布局,语法格式为:
.box{display:flex|inline-flex;}
其中,flex——块级flex布局,该元素变为弹性盒子;
inline- flex——行内flex布局, 行内容器符合行内元素的特征, 同时在容器内又符合flex 布局规范。
设置了flex布局之后,子元素的float、clear 和vertical-align属性将失效。
2、flex-direction
flex-direction 用于设置主轴的方向,即项目排列的方向, 语法格式为:
.box{flex-direction:row |row-reverse |column |column-reverse;}
其中,row——主轴为水平方向, 起点在左端,当元素设置为flex布局时, 主轴默认为 row;
row-reverse——主轴为水平方向,起点在右端;
column——主轴为垂直方向,起点在顶端;
column-reverse——主轴为垂直方向,起点在底端。
图3-13 所示为元素在不同主轴方向下的显示效果
3、flex-wrap
flex - wrap 用来指定当项目在一根轴线的排列位置不够时, 项目是否换行, 其语法格式如下:
.box{flex-wrap:nowrap|wrap |wrap-reverse;}
其中,nowrap——不换行,默认值;
wrap——换行,第一行在上方;
wrap - reverse——换行,第一行在下方。
当设置换行时,还需要设置align-item 属性来配合自动换行,但align-item的值不能为
“stretch”。
flex-wrap不同值的显示效果如图3-14所示。
4、flex-flow
flex-flow是flex-direction和flex -wrap的简写形式, 默认值为row nowrap。 语法格式如下:
.box{flex-flow:<flex-direction> ||<flex-wrap>;}
示例代码如下:
.box{flex-flow:rownowrap;} //水平方向不换行
.box{flex-flow:row-reverse wrap;} //水平方向逆方向换行
.box{flex-flow:column wrap-reverse;}//垂直方向逆方向换行
5、justify-content
justify-content用于定义项目在主轴 上的对齐方式。 语法格式如下:
示例代码如下:
.box{flex-flow:<flex-direction> ||<flex-wrap>;}
示例代码如下:
.box{flex-flow:rownowrap;} //水平方向不换行
.box{flex-flow:row-reverse wrap;} //水平方向逆方向换行
.box{flex-flow:column wrap-reverse;}//垂直方向逆方向换行
5、justify-content
justify-content用于定义项目在主轴 上的对齐方式。 语法格式如下:
.box{justify-content:flex-start |flex -end |center |space-between |space-around;}
其中,justify-content-——与主轴方向有关,默认主轴水平对齐, 方向从左到右; flex - start——左对齐,默认值; flex-end——右对齐; center——居中; space -between——两端对齐,项目之间的间隔都相等; space - around——每个项目两侧的间隔相等。
6、align-items
align-items 用于指定项目在交叉轴上的对齐方式, 语法格式如下:
.box{align-items:flex-start |flex-end |center |baseline |stretch;}
其中,align-items——与交叉轴方向有关,默认交叉由上到下;
flex -start——交叉轴起点对齐;
flex -end——交叉轴终点对齐;
center——交叉轴中线对齐;
baseline——项目根据它们第一行文字的基线对齐;
stretch——如果项目未设置高度或设置为auto, 项目将在交叉轴方向拉伸填充容器,此为默认值。
示例代码如下:
<!--//.wxml-->
<view class = "cont1">
<view class = "item">1</view>
<view class = "item item2">2</view>
<view class = "item item3">3</view>
<view class = "item item4">4</view>
</view>
//wxss
.cont1{
display: flex;
flex-direction: row;
align-items:baseline;
}
.item{
background-color: #ccc;
border: 1px solid #f00;
height:100px;
width:50px;
margin:2px;
}
.item2{
height:80px;
}
.item3{
display: flex;
height:50px;
align-items:flex-end;
}
.item4{
height:120px;
}
运行结果:
不同对齐方式的效果:
7、align-content
align-content用来定义项目有多根轴线(出现换行后)在交叉轴上的对齐方式,如果只有一根轴线,该属性不起作用。语法格式如下:
.box{align-content:flex -start |flex -end |center |space -between| space-around |stretch}
其中,space-between——与交叉轴两端对齐,轴线之间的间隔平均分布;
space -around——每根轴线两侧的间隔都相等,轴线之间的间隔比轴线与边框间隔大一倍。
其余各属性值的含义与align-items属性的含义相同。
图3-17所示为align-content不同值的显示效果。
3.4.2、项目属性
1、order
order 属性定义项目的排列顺序,数值越小,排列越靠前。默认值为零。语法格式如下:
.item{order:<number>;}
示例代码如下:
view class="cont1">
<view class="item">1</view>
<view class="item">2</view>
<view class="item">3</view>
<view class="item">4</view>
</view>
<view class="cont1">
<view class="item" style="order: 1">1</view>
<view class="item" style="order: 3">2</view>
<view class="item" style="order: 2">3</view>
<view class="item">4</view>
</view>
- 运行结果
2、flex-grow
flex-grow定义项目的放大比例,默认值为零,既不放大。语法格式如下:
.item{flex-grow:<number>;}
3、flex-shrink
flex-shink 用来定义项目的缩小比例,默认值为,如果空间不是。该项目将被缩小语法格式如下:
.item{flex-shrink:<number>;}
4、flex-basis
flex-basis属性用来定义伸缩项目的基准值,剩余的空间将按比例进行缩放,它的默认值为auto(即项目的本来大小)。语法格式如下:
.item{flex -basis: <number >|auto;}
5、flex
flex属性是flex-grow、flex-shrink 和flex-basis 的简写,其默认值分别为0、1、auto。语法格式如下:
.item{flex:<flex-grow >|<flex -shrink >|<flex -basis >;}
示例代码如下:
.item{flex:auto;}//等价于.item{flex:1 1 auto;}
.item{flex:none;}//等价于.item{flex:0 0 auto;}
6、align-self
align-self属性用来指定单独的伸缩项目在交叉轴上的对齐方式。该属性会重写默认的对齐方式。语法格式如下:
.item{align-self:auto|flex-start|flex-end|center|baseline|stretch;}
-
在该属性值中,除了auto以外,其余属性值和容器align-items的属性值完全一致。
auto表示继承容器align-items的属性,如果没有父元素,则等于stretch(默认值)。
-
第四章
-
4.1、组件的定义和属性
组件是页面视图层(WXML)的基本组成单元,组件组合可以构建功能强大的页面结构。小程序框架为开发者提供了容器视图、基础内容、表单、导航、多媒体、地图、画布、开放能力等8类(30多个)基础组件。每一个组件都由一对标签组成,有开始标签和结束标签,内容放置在开始标签和结束标签之间,内容也可以是组件。组件的语法格式如下:
<标签名 属性名=”属性值”>内容……< /标签名>
组件通过属性来进一步细化。不同的组件可以有不同的属性,但它们也有一些共用属性,如id、class、style、hidden、data-*、bind*/catch*等。
□ id 组件的唯一表示,保持整个页面唯一,不常用。
□class 组件的样式类,对应WXSS中定义的样式。
□style 组件的内联样式,可以动态设置内联样式。
□hidden 组件是否显示,所有组件默认显示。
□data-* 自定义属性,组件触发事件时,会发送给事件处理函数。事件处理函数可以通过传入参数对象的curentTarget. dataset方式来获取自定义属性的值。
□bind*/catch * 组件的事件,绑定逻辑层相关事件处理函数。
4.2、容器视图组件
容器视图组件是能容纳其他组件的组件,是构建小程序页面布局的基础组件,主要包括view、scroll-view、和swiper组件。4.2.1、view
view 组件是块级组件,没有特殊功能,主要用于布局展示,相当于HTML中的div,是布局中最基本的用户界面(User Imterface,UI)组件,通过设置 view 的CSS 属性可以实现各种复杂的布局。view 组件的特有属性如表所示。view组件的特有属性
通过<view>组件实现页面布局示例代码如下:
<view style = "text-align:center">默认 flex 布局</view> <view style = "display:flex"> <view style = "border:1px solid #f00; flex-grow:1"> 1 </view> <view style = "border:1px solid #f00; flex-grow:1"> 2 </view> <view style = "border:1px solid #f00; flex-grow:1"> 3 </view> </view> <view style = "text-align:center"> 上下混合布局 </view> <view style = "display: flex;flex-direction:column"> <view style = "border:1px solid #f00;" > 1 </view> <view style = "display:flex"> <view style = "border:lpx solid #f00;flex-grow:l"> 2 </view> <view style = "border:1px solid #f00;flex-grow:2"> 3 </view> </view> </view> <view style="text-align:center">左右混合布局</view> <view style="display: flex"> <view style="border:1px solid #f00;flex-grow:1">1</view> <view style="display:flex; flex-direction:column;flex-grow:1"> <view style="border:1px solid #f00;flex-grow:1">2</view> <view style="border:1px solid #f00;flex-grow:1">3</view> </view> </view>
运行效果:
4.2.2、scroll-view
通过设置 scroll-view 组件的相关信息可以实现滚动视图的功能,其属性表如图所示:
通过 scroll-view 组件可以实现下拉刷新和上拉加载更多,代码如下:
.wxml
<!-- 4.2.3 --> <swiper indicator-dots="true" autoplay="true" interval="5000" duration="1000"> <swiper-item> <image src="/image/1.jpg" style="width: 100%;"></image> </swiper-item> <swiper-item> <image src="/image/2.jpg" style="width: 100%;"></image> </swiper-item> <swiper-item> <image src="/image/3.jpg" style="width: 100%;"></image> </swiper-item> </swiper>
运行结果:
4.3、基础内容组件
基础内容组件包括icon、text和progress,主要用于在视图页面中展示图标、文本和进度条等信息。4.3.1、icon
icon组件即图标组件,通常用于表示一种状态,如success、info、warn、waiting、cancel等。其属性如表所示:icon组件属性
示例代码如下:
.wxml
<!--4.3.1--> <view> icon 类型: <block wx:for="{{iconType}}"> <icon type ="{{item}}"/>{{item}} </block> </view> <view> icon 大小: <block wx:for="{{iconSize}}"> <icon type ="success" size ="{{item}}"/>{{item}} </block> </view> <view> icon 颜色: <block wx:for ="{{iconColor}}"> <icon type ="success" size ="30" color ="{{item}}"/>{{item}} </block> </view>
.js
Page({ data:{ iconType:["success","success_no_circle","info","warn","wait-ing","cancel","download","search","clear"], iconSize:[10,20,30,40], iconColor:['#f00','#0f0','#00f'] } })
运行结果:
4.3.2、text
text组件用于展示内容,类似HTML中的<span>,test组件中的内容支持长按选中,支持转义字符“\”,属于行内元素。text组件属性如表。
text组件属性
示例代码如下:
.wxml
<!--4.3.2--> <block wx:for="{{x}}" wx:for-item="x"> <view class="aa"> <block wx:for="{{25-x}}" wx:for-item="x"> <text decode="{{true}}"space="{{true}}"> </text> </block> <block wx:for="{{y}}" wx:for-item="y"> <block wx:if="{{y<=2*x-1}}"> <text>*</text> </block> </block> </view> </block> <block wx:for="{{x}}" wx:for-item="x"> <view class="aa"> <block wx:for="{{39+x}}" wx:for-item="x"> <text decode="{{true}}"space="{{true}}"> </text> </block> <block wx:for="{{y}}" wx:for-item="y"> <block wx:if="{{y<=11-2*x}}"> <text>*</text> </block> </block> </view> </block>
.js
Page({ data:{ x:[1,2,3,4,5], y:[1,2,3,4,5,6,7,8,9] } })
运行结果:
4.3.3、progress
progress组件用于显示进度状态,如资源加载、用户资料完成度、媒体资源播放进度等。progress组件属于块级元素,其属性如表所示。
progress组件属性
示例代码如下:
<view>显示百分比</view> <progress percent='80' show-info='80'></progress> <view>改变宽度</view> <progress percent='50' stroke-width='2'></progress> <view>自动显示进度条</view> <progress percent="80" active></progress>
运行结果:
4.4、表单组件
表单组件的主要功能是收集用户信息,并将这些信息传递给后台服务器,实现小程序与用户之间的沟通。表单组件不仅可以放置在<form/>标签中使用,还可以作为单独组件和其他组件混合使用。4.4.1、button
button组件用来实现用户和应用之间的交互,同时按钮的颜色起引导作用。一般来说,在一个程序中一个按钮至少3种状态:默认点击(default)、建议点击(primary)、谨慎点击(warn)。在构建项目时,应在合适的场景使用合适的按钮,当<button>被<form/>包裹时,可以通过设置form-type属性来触发表单对应的事件。button组件的属性如表所示。button组件属性
示例代码如下:
.wxml
<button type="default">type:default</button> <button type="primary">type:primary</button> <button type="warn">type:warn</button> <button type="default" bindtap='buttonSize' size="{{ size }}"> 改变 size </button> <button type="default" bindtap='buttonPlain' plain="{{ plain }}"> 改变 plain </button> <button type="default" bindtap='buttonLoading' loading="{{ loading }}"> 改变 loading 显示 </button>
,js
Page({ data:{ size: 'default', plain: 'false', loading: 'false' }, buttonSize: function(){ if(this.data.size =="default") this.setData({ size:'mini'}) else this.setData({size:'default'}) }, buttonPlain: function(){ this.setData({ plain:! this.data.plain })}, buttonLoading: function(){ this.setData({ loading:! this.data.loading }) } })
4.4.2、radio
radio 单选框用来从一组选项中选取一个选项。在小程序中,单选框由<radio- group/ > (单项选择器)和<radio/>(单选项目)两个组件组合而成。
radio- group 及 radio 组件属性
示例代码如下:
.wxml
<!--4.4.2--> <view>选择您喜爱的城市:</view > <radio-group bindchange = "citychange"> <radio value ="西安"> 西安 </radio > <radio value ="北京"> 北京 </radio > <radio value ="上海"> 上海 </radio > <radio value ="广州"> 广州 </radio > <radio value ="深圳"> 深圳 </radio > </radio-group> <view>你的选择:{{city}}</view> <view>选择您喜爱的计算机语言:</view > <radio-group class ="radio-group" bindchange ="radiochange"> <label class = "radio" wx:for ="{{radios}}"> <radio value ="{{item.value}}" checked="{{item.checked}}"/> {{item.name}} </label > </radio-group> <view >你的选择:{{lang}} </view >
.js
//radio Page({ data:{ radios:[ { name:'java',value:'JAVA' }, {name:'python',value: 'Python',checked: 'true' }, {name:'php',value: 'PHP'}, {name:'swif',value:'swif'}, ], city:"", lang:"" }, citychange: function(e){ this.setData({ city: e.detail.value }); }, radiochange: function(event){ this.setData({lang: event.detail.value}); console.log(event.detail.value) } })
运行结果:
4.4.3、checkbox
复选框用于从一组选项中选取多个选项,小程序中复选框由<checkbox - group/>(多项选择器)和< checkbox/>(多选项目)两个组件
checkbox-group 及 checkbox 组件属性
示例代码如下:
.wxml
<!--4.4.3--> <view>选择您想去的城市:</view > <checkbox-group bindchange="cityChange" > <label wx:for="{{citys}}"> <checkbox value ="{{item.value}}" checked='{{item.checked}}'>{{item.value}} </checkbox> </label > </checkbox-group> <view >您的选择是:{{city}} </view >
.js
//checkbox Page({ city:"", data: { citys:[ {name: 'km',value:'昆明'}, {name: 'sy',value:'三亚'}, {name: 'zh',value:'珠海',checked:'true'}, {name: 'dl',value:'大连'}] }, cityChange:function(e){ console.log(e.detail.value); var city = e.detail.value; this.setData({city:city}) } })
运行结果:
4.4.4、switch
switch 组件的作用类似开关选择器。
switch 组件属性
示例代码如下:
.wxml
<!--4.4.4--> <view > <switch bindchange="swl">{{var1}} </switch> </view> <view > <switch checked bindchange="sw2">{{var2}} </switch> </view > <view > <switch type ="checkbox" bindchange="sw3">{{var3}} </switch > </view >
.js
//switch Page({ data: { var1:'关', var2:'开', var3:'未选' }, swl:function(e){ this.setData({varl: e.detail.value ?'开':'关'}) }, sw2: function(e){ this.setData({var2: e.detail.value ?'开':'关'}) }, sw3: function(e){ this,setData({var3:e.detail.value ?'已选':'未选'}) } })
运行结果:
4.4.5、slider
slider 组件为滑动选择器,可以通过滑动来设置相应的值。
示例代码如下:
.wxml
<!--4.4.5--> <view> 默认min=0 max=100 step=1 </view > <slider ></slider > <view>显示当前值</view > <slider show-value> </slider > <view> 设置min=20 max=200 step=10 </view > <slider min='0' max='200' step='10'show-value > </slider > <view> 背景条红色,已选定颜色绿色 </view > <slider color="#f00" selected-color='#0f0'> </slider > <view > 滑动改变 icon 的大小 </view > <slider show-value bindchange='sliderchange'> </slider > <icon type ="success" size ='{{size}}'></icon >
.js
//slider Page({ data: { size:'20' }, sliderchange:function(e){ this.setData({ size:e.detail.value}) } })
运行结果:
4.4.6、picker
picker 组件为滚动选择器,当用户点击picker组件时,系统从底部弹出选择器供用户选择picke组件目前支持5种选择器,分别是:selector (普通选择器),multiSelector (多列选择器),time (时间选择器),date (日期选择器)、region (省市选择器)。1.普通选择器 (mode=selector)的属性。
picker组件中selector选择器属性示例代码如下:
.wxml
<!--4.4.6--> <view >--- range 为数组 ---</view > <picker range="{{array}}" value="{{index1}}" bindchange='arrayChange'> 当前选择:{{array[index1]}}</picker > <view>--- range为数组对象 ---</view> <picker bindchange="objArrayChange" value = "{{index2}}" range-key="name" range="{{objArray}}"> 当前选择:{{objArray[index2].name}} </picker >
.js
//picker Page({ data:{ array:['Java','Python','c','c#'], objArray:[ {id:0,name: 'Java'}, {id:1,name: 'Python'}, {id:2,name: 'C'}, {id:3,name: 'C#'} ], index1:0, index2:0 }, arrayChange:function(e){ console.log(' picker 值变为', e.detail.value) var index=0; this.setData({ indexl:e.detail.value }) }, objArrayChange: function(e){ console.log('picker值变为', e.detail.value) this.setData({ index2: e.detail.value }) } })
运行结果:
2.多列选择器
多列选择器(mode=multiSelector )允许用户从不同列中选择不同的选择项,其选项是二维数组或数组对象。
示例代码如下:
.wxml
<view>多列选择器</view> <picker rmode="multiSelector" bindchange="bindMultipickerChange" bindcolumnchange="bindMultipickerColumnChange" value="{{multiIndex}}" range="{{multiArray}}"> <view> 当前选择:{{multiArray[0][multiIndex[0]]}}, {{multiArray[1][multiIndex[1]]}}, {{multiArray[2][multiIndex[2]]}} </view> </picker>
.js
Page({ data:{ multiArray:[["陕西省","广东省"],["西安市","汉中市","延安市"],["雁塔区","长安区"]], multiIndex:[0,0,0] }, bindMultiPickerChange:function(e){ console.log("picker发送选择改变,携带值为",e.detail.value) this.setData({ multiIndex:e.detail.value }) }, bindMultiPickerColumnChange:function(e){ console.log("修改的列为",e.detail.column,",值为",e.detail.value); var data={ multiArray:this.data.multiArray, multiIndex:this.data.multiIndex }; data.multiIndex[e.detail.column]=e.detail.value; switch(e.detail.column){ case 0: switch(data.multiIndex[0]){ case 0: data.multiArray[1]=["西安市","汉中市","延安市"]; data.multiArray[2]=["雁塔区","长安区"]; break; case 1: data.multiArray[1]=["深圳市","珠海市"]; data.multiArray[2]=["南山区","罗湖区"]; break; } data.multiIndex[1]=0; data.multiIndex[2]=0; break; case 1: switch(data.multiIndex[0]){ case 0: switch(data.multiIndex[1]){ case 0: data.multiArray[2]=["雁塔区","长安区"]; break; case 1: data.multiArray[2]=["汉台区","南郑区"]; break; case 2: data.multiArray[2]=["宝塔区","长子县","延川县"]; break; } break; case 1: switch(data.multiIndex[1]){ case 0: data.multiArray[2]=["南山区","罗湖区"]; break; case 1: data.multiArray[2]=["香洲区","斗门区"]; break; } break; } data.multiIndex[2]=0; console.log(data.multiIndex); break; } this.setData(data); }, })
运行结果:
2.多列选择器
多列选择器(mode=multiSelector )允许用户从不同列中选择不同的选择项,其选项是二维数组或数组对象。
picker 组件 multiSelector 选择器属性
日期选择器(mode=data)可以用于从提供的日期选项中选择相应的日期。
示例代码如下:
.wxml
<view> <picker mode="date" start="{{startdate}}" end="{{enddate}}" value="{{date}}" bindchange="changedate"> 选择的日期:{{date}} </picker> </view> <view> <picker mode="time" start="{{starttime}}" end="{{endtime}}" bindchange="changetime"> 选择的时间{{time}} </picker> </view>
.js
Page({ data:{ startdate:2000, enddate:2050, data:'2018', starttime:'00:00', endtime:'12:59', time:'8:00' }, changedate:function(e){ this.setData({data:e.detail.value}); console.log(e.detail.value) }, changetime:function(e){ this.setData({time:e.detail.value}) console.log(e.detail.value) } })
运行结果:
4.省市选择器
省市选择器(mode=region)是小程序的新版本提供的选择快速地区的组件。
picker 组件 region 选择器属性
示例代码如下:
.wxml
<!--4.4.6.4--> <picker mode="region" value="{{region}}" custom-item="{{cust-omitem}}" bindchange ="changeregion" > 选择省市区:{{region[0]}},{{region[1]}},{{region[2]}} </picker >
.js
//picker-region Page({ data:{ region:['陕西省','西安市','长安区'], customitem:'全部' }, changeregion: function(e){ console.log(e.detail.value) this.setData({ region:e.detail.value }) } })
运行结果:
4.4.7、picker-view
picker-view 组件为嵌入页面的滚动选择器。组件的列的个数和列的内容由用户通过 <picker-view-column/> 自定义设置。
picker-view 组件属性
示例代码如下:
.wxml
<!--4.4.7--> <view>当前日期:{{year}}年{{month}}月{{day}}日</view> <picker-view indicator-style="height:50px;" style="width: 100%;height:300px;" value="{{value}}" bindchange="bindchange"> <picker-view-column> <view wx:for="{{years}}" style="line-height: 50px;">{{item}}年</view> </picker-view-column> <picker-view-column> <view wx:for="{{months}}" style="line-height: 50px;">{{item}}月</view> </picker-view-column> <picker-view-column> <view wx:for="{{days}}" style="line-height: 50px;">{{item}}日</view> </picker-view-column> </picker-view>
,js
const date=new Date() const years=[] const months=[] const days=[] //定义年份 for(let i=1900;i<=2050;i++){ years.push(i) } //定义月份 for(let i=1;i<=12;i++){ months.push(i) } //定义日期 for(let i=1;i<=31;i++){ days.push(i) } Page({ data:{ years:years, months:months, days:days, year:date.getFullYear(), month:date.getMonth()+1, day:date.getDate(), value:[123,1,0], }, //定位到2018年1月1日 bindChange:function(e){ const val=e.detail.value console.log(val); this.setData({ year:this.data.years[val[0]], month:this.data.months[val[1]], day:this.data.days[val[2]] }) } })
运行结果:
.4.8、input
input组件为输入框,用户可以输入相应的信息,其属性如下表所示。
input组件属性
示例代码如下:
.wxml
<!--4.4.8--> <input placeholder="这是一个可以自动聚焦的input" auto-focus/> <input placeholder="这个只有在按钮点击的时候才聚焦" focus="{{focus}}"/> <button bindtap="bindButtonTap">使得输入框获取焦点</button> <input maxlength="20" placeholder="最大输入长度为20"/> <view class="section_title">你输入的是:{{inputValue}}</view> <input bindinput="bindKeyInput" placeholder="输入同步到view中"/> <input bindinput="bindReplaceInput" placeholder="连续的两个1会变成2"/> <input password type="number"/> <input password type="text"/> <input type="digit" placeholder="带小数点的数学键盘"/> <input type="idcard" placeholder="身份证输入键盘"/> <input placeholder-style="color:red" placeholder="占位符字体是红色的"/>
.js
Page({ data:{ focus:false, inputValue:"" }, bindButtonTap:function(){ this.setData({ focus:true }) }, bindKeyInput:function(e){ this.setData({ inputValue:e.detail.value }) }, bindReplaceInput:function(e){ var value =e.detail.value var pos =e.detail.cursor if(pos!=-1){ //光标在中间 var left =e.detail.value.slice(0,pos) //计算光标的位置 pos =left.replace(/11/g,'2').length } //直接返回对象,可以对输入进行过滤处理,同时可以控制光标的位置 return{ value:value.replace(/11/g,'2'), Cursor:pos } //或者直接返回字符串,光标在最后边 //return value.replace( /11 /g,'2'), } })
运行结果:
4.4.9、textarea
textarea组件为多行输入框文件,可以实现多行内容的输入。textarea组件的属性如下表所示。
textarea组件属性
示例代码如下:
.wxml
<!--4.4.9--> <textarea bindblur="bindTextAreaBlur" auto-height placeholder="自动变高"/> <textarea placeholder="placeholder颜色是红色的" placeholder-style="color:red;"/> <textarea placeholder="这是一个可以自动聚焦的textarea" auto-focus/> <textarea placeholder="这个只有在按钮点击的时候才聚焦" focus="{{focus}}"/> <button bindtap="bindButtonTap">使得输入框获取焦点</button> <form bindsubmit="bindFormsubmit"> <textarea placeholder="form中的textarea" name="textarea"/> <button form-type="submit">提交</button> </form>
.js
Page({ data:{ height:10, focus:false }, bindButtonTap:function(){ this.setData({ focus:true }) }, bindTextAreaBlur:function(e){ console.log(e.detail.value) }, bindFormSubmit:function(e){ console.log(e.detail.value.textarea) } })
运行结果:
4.4.10、label
label组件为标签组件,用于提升表单组件的可用性。label组件支持使用for属性找到对应的id,或者将控件放在该标签下,当点击label组件时,就会触发对应的控件。for属性的优先级高于内部控件,内部有多个控件的时候默认触发第一个控件。目前,label组件可以绑定的控件有<button/ >、<checkbox/ >、<radio/>、<switch/ >。示例代码如下:
.wxml
<!--单击中国不能选择/取消复选框--> <view><checkbox></checkbox>中国</view> <!--单击”中国“可以选择/取消复选框--> <view><label><checkbox></checkbox>中国</label></view> <!--使用for找到对应的id--> <checkbox-group bindchange="cityChange"> <label wx:for="{{citys}}"> <checkbox value="{{item.value}}"checked='{{item.checked}}'>{{item.value}}</checkbox> </label> </checkbox-group> <view>您的选择是:{{city}}</view>
.js
Page({ data:{ citys:[ {name:'km',value:'昆明'}, {name:'sy',value:'三亚'}, {name:'zh',value:'珠海',checked:'true'}, {name:'dl',value:'大连'} ] }, cityChange:function(e){ console.log(e.detail.value); var city=e.detail.value; this.setData({city:city}) } })
运行结果:
4.4.11、form
form组件为表单组件,用来实现将组件内的用户输入信息进行提交。当<form/ >表单中formType为submit的<button/ >组件时,会将表单组件中的value值进行提交。form组件的属性如下表所示。
form组件属性
示例代码如下:
.wxml
<form bindsubmit="formSubmit" bindreset="formReset"> <view>姓名: <input type="text" name="xm"/> </view> <view>性别: <radio-group name="xb"> <label> <radio value="男" checked/>男</label> <label> <radio value="女"/></label> </radio-group> </view> <view>爱好: <checkbox-group name="hobby"> <label wx:for="{{hobbies}}"> <checkbox value="{{item.value}}"checked='{{item.checked}}'>{{item.value}}</checkbox> </label> </checkbox-group> </view> <button form-type="submit">提交</button> <button form-type="reset">重置</button> </form>
.js
Page({ hobby:'', data:{ hobbies:[ {name:'jsj',value:'计算机',checked:'true'}, {name:'music',value:'听音乐'}, {name:'game',value:'玩电竞'}, {name:'swim',value:'游泳',checked:'true'} ] }, forSubmit:function(e){ console.log('form发生了submit事件,携带数据为:',e.detail.value) }, formReset:function(){ console.log('form发生了reset事件') } })
运行结果:
4.5、多媒体组件
多媒体组件包括image(图像)、audio(音频)、video(视频)、camera(相机)组件,使用这些组件,可以让页面更具有吸引力。4.5.1、image
image组件为图像组件,与HTML中的 <img/ >类似,系统默认image组件的宽度为300 px、高度为2250 px, image组件的属性如下表所示。image组件属性
image组件中的mode属性有13种模式,其中缩放模式有4种,裁剪模式有9种。
1.缩放模式
□scaleToFill不保持纵横比缩放图片,使图片的宽高完全拉伸至填满image元素。□aspectFit保持纵横比缩放图片,使图片的长边能完全显示出来。也就是说,可以将图片完整地显示出来。
□aspectFill保持纵横比缩放图片,只保证图片的短边能完全显示出来。也就是说,图片通常只在水平或垂直方向是完整的,在另一个方向将会发生截取。
□widthFix宽度不变,高度自动变化,保持原图宽高比不变。
示例代码如下:
.wxml
<block wx:for="{{modes}}"> <vie></vie> <image mode="{{item}}" src ="/image/1.jpg"style="witdhh:100%,height:100%"/> </block>
.js
Page({ data:{ modes:['scaleToFill','aspectFit','aspectFill','widthFix'] } })
运行结果:
裁剪模式
top 不缩放图片,只显示图片的顶部区域。
bottom 不缩放图片 只显示图片的底部区域。
center 不缩放图片 只显示图片的中间区域。
left 不缩放图片 只显示图片的左边区域。
right 不缩放图片,只显示图片的右边区域。
top_left 不缩放图片 只显示图片的左上边区域。
top_right 不缩放图片,只显示图片的右上边区域。
bottom_left 不缩放图片,只显示图片的左下边区域。
bottom_right不缩放图片,只显示图片的右下边区域。
.wxml
<block wx:for="{{modes}}"> <vie>当前图片模式是:{{item}}</vie> <image mode="{{item}}" src ="/images/jjs.jpg"style="witdhh:100%,height:100%"/> </block>
.js
Page({ data:{ modes:['top','center','botton','left','right','top_left','top_right','bottom_left','bottom_right'] } })
运行结果:
audio
audio来实现音乐播放,暂停等,其属性如图所示:
video组件属性
示例代码如下:
.wxml
<audio src="{{src}}"action="{{action}}"poster="{{poster}}"name="{{name}}"author="{{author}}" loop controls></audio> <button type="primary" bindtap="play">播发</button> <button type="primary" bindtap="pause">暂停</button> <button type="primary" bindtap="playRate">设置速率</button> <button type="primary" bindtap="currentTime">设置当前时间(秒) </button>
.js
Page({ data:{ poster:'http://y.gtimg.cn/music/photo_new/T002R300x300M000003rsKF44GyaSK.jpg? max_age=2592000', name:'此时此刻', author:'许巍', src:'http://ws.stream.qqmusic.qq.com/M500001VfvsJ21xFqb.mp3? guid= ffffffff82def4af4b12b3cd9337d5e7&uin=346897220&vkey =6292F51E1E384E06DCBDC9AB7C49FD713D632D313AC4858BACB8DDD29067D3C601481D36E62053BF8 DFEAF74 C0A5CCFADD6471160CAF3E6A&from tag=46' }, play:function(){ this.setData({ action:{ method:'play' } }) }, pause:function(){ this.setData({ action:{ method:'pause' } }) }, playRate:function(){ this.setData({ action:{ method:'setPlaybackRate', data:10 } }) console.log('当前速率:'+this.data.action.data) }, currentTime:function(e){ this.setData({ action:{ method:'setCurrentTime', data:120 } }) } })
运行结果:
video
video组件用来实现视频的播放,暂停等,视频的模式宽度为300px,高度为225px,video组件的属性
video组件属性
示例代码如下:
.wxml
<video src="{{src}}"controls></video> <view class="btn-area"> <button bind:tap="bindButtonTap">获取视频</button> </view>
.js
Page({ data:{ src:'', }, bindButtonTap:function(){ var that=this wx.chooseVideo({ sourceType:['album','camera'], maxDuration:60, camera:['front','back'], success:function(res){ that.setData({ src:res.tempFilePath }) } }) } })
运行结果:
camera
camera组件为系统相机组件,可以实现拍照或录像功能。 在一个页面中,只能有—camera组件。在开发工具中运行时,使用电脑摄像头实现拍照或录像;在手机中运行时,使用手机前后摄像头实现拍照或录像
camera组件属性
示例代码如下:
.wxml
<camera device-position="back" flash="off" binderror="error" style="width:100%;height:350px"></camera> <button type="primary"bindtap="takePhoto">拍照</button> <view>预览</view> <image mode="widthFix" src="{{src}}"></image>
.js
Page({ takePhoto(){ const ctx=wx.createCameraContext()//创建并返回camera上下文对象 ctx.takePhoto({ quality:'high', success:(res)=>{ this.setData({ src:res.tempImagePath }) } }) }, error(e){ console.log(e.detail) } })
运行结果:
4.6、其他组件
在小程序中,除了前面介绍的组件以来,map组件和canvas组件比较常用。4.6.1、map
map组件用于在页面中显示地图或路径,常用于LBS(基于位置服务)或路径指引,功能相对百度地图、高德地图较简单,目前具备绘制图标、路线、半径等能力,不能在croll-view、swiper、picker-view、movable-view组件中使用。map属性如表。map组件属性
map组件的markers属性用于在地图上显示标记的位置,其此昂管属性如表。
map组件markers属性的相关信息
map组件的polyline属性用来指定一系列坐标点,从数组第一项连线到最后一项,形成一条线路,可以指定线的颜色、宽度、线型以及是否带箭头等,其相关属性如图。
map组件polyline属性的相关属性
示例代码如下:
.wxml
<!--4.6.1--> <map id="map" longitude="108.9200" latitude="34.1550" scale="14" controls="{{controls}}" bindcontroltap="controltap" markers="{markers}" bindmarkertap="markertap" polyline="{{polyline}}" bindregionchange="regionchange" show-location style="width: 100%;height: 300px;"> </map>
.js
Page({ data:{ markers:[{ iconPath:"/image/loo.png", id:0, longitude:"108.9290", latitude:"34.1480", width:50, height:50 }], polyline:[{ points:[ { longitude:"108.9290", latitude:"34.1400", }, { longitude:"108.9290", latitude:"34.1500", }, { longitude:"108.9290", latitude:"34.1700", } ], color:"#00ff00", width:2, dotteLine:true }], controls:[{ id:1, iconPath:'/image/loo.png', position:{ left:0, top:300, width:30, height:30 }, clickable:true }] }, regionchange(e){ console.log(e.type) }, markertap(e){ console.log(e.markertap) }, controltap(e){ controls.loh(e.controltap) } })
运行结果:
4.6.2、canvas
canvas组件用来绘制图形,相当于一块无色透明的普通画布。canvas组件本身并没有绘制能力,仅仅是图形容器,通过绘图API实现绘图功能。在默认情况下,canvas组件的默认宽度为300px,高度为225px,同一页面中的canvas-id不能重复,否则会出错。canvas组件的属性如图canvas组件属性
.wxml
<canvas canvas-id="myCanvas"style="border:1px solid red;"/>
.js
Page({ onLoad:function(options){ var ctx = wx.createCanvasContext('myCanvas') ctx.setFillStyle('green') ctx.fillRect(10,10,200,100) ctx.draw() } })
运行结果:
-
第五章
-
一、即速应用概况
即速应用优势
1,开发流程简单,零门槛制作。2,行业模板多样,种类齐全。
3,丰富的功能组件和强大的后台管理。
即速应用的应用范围组要包括以下内容
(1)咨询类:新闻,媒体。
(2)电商类:网购(服装,电器,读书,母婴)。
(3)外卖类:餐饮及零售。
(4)到店类:餐饮及酒吧。
(5)预约类:酒店,KTV,家教,家政,其他服务行业。
即速应用界面介绍
菜单栏菜单栏中的“风格”选项用于设置小程序页面的风格颜色,“管理”选项用于进入后台管理页面,“帮助”选项用于提示帮助功能,“客服”选项用于进入客服界面,“历史”选项用来恢复前项操作,“预览”选项用在PC端预览制作效果,“保存”选项用于保存已制作的内容,“生成”选项用于实现小程序打包上线设置。
工具栏
工具栏包括“页面管理”“组件库”2个
选项卡,“页面管理”实现添加页面和添加分组以及对某一页面进行改名、收藏、复制、删
除操作。“组件库”有9个基础组件、7个布局组件、18个高级组件和2个其他组件。编辑区
编辑区是用来制作小程序页面的主要区域,通过拖拽组件实现页面制作,右边的“前进”“后退”选项可以进行恢复操作,“模板”选项可以用来选择模板、“元素”速项可以用来显示页面中的组件及其层次关系,“数据”选项可以用来进行页面数据管理,“模块”选项可以用来选择模块。
属性面板
属性面板用来设置选定组件的属性及样式,包括“组件”和“组件样式”两个选项卡。组件”选项卡用来设置组件内容及点击事件;“组件样式”选项卡用来设置组件的样式,不同组件有不同的样式需要设置。
即速应用组件
布局组件布局组件用于设计页面布局,主要包括双栏、面板、自由面板、顶部导航、底部导航、分割线和动态分类,如图所示
双栏组件
双栏组件用来布局整体,它可以把一个区块分为两部分,操作时显示一个分隔的标志,便于操作,预览时则不会出现。双栏组件默认设置每个栏占50%总宽,也可以按实际需要调整比例。双栏里面可以添加基本的组
动态分类,从而达到整体的布局效果。双栏还可以嵌套双栏,即可以在其中的一个栏里嵌入一个双栏,从而将整体分成3部分(若需要将整体分成4部分,就再嵌套一个双栏,依次类推)。双栏组件的属性面板如图面板组件
面板组件相当于一个大画板,用户可以将很多基本(甚至高级)的组件(如文本组件、图片组件、按钮组件、标题组件、分类组件、音频组件、双栏组件、计数组件等)放进面板组件里一起管理。面板组件的属性面板如图所示自由面板组件
自由面板组件是指放置在该面板内的组件可以自由拖动,调节组件大小。用户既可以向
自由面板内拖入部分组件(包括文本组件、图片组件和按钮组件),也可以拖入任意相关容器组件,用于不规则布局自由面板组件的属性面版如图顶部导航组件
顶部导航组件固定于页面顶部,用于编辑顶部的导航。常用的手机应用在顶部有一条导航,上面写有手机应用App的名称或10go,以及返回键等。顶部导航组件的属性面板设置如图所示底部导航组件
底部导航组件固定于页面底部,用于编辑底部的导航。底部导航组件的属性面板设置如图5-8所示。
通过底部导航组件可以添加标签、删除标签,同时可以分别设置每个标签的名称、原始图片、点击图片及链接至某一页面;通过组件面板可以进行组件背景色、图片及文字的设置。
分割线组件
分割线组件被放置于任意组件之间,用于实现分割,其面板属性如图
动态分类组件
动态分类组件仅适用于电商、到店类小程序。用户通过选择动态分类组件的样式,可以实现顶部分类、侧边栏分类来展示应用数据、商品数据等。动态分类的二级有图模式只适用于电商类小程序。动态分类组件的属性面板如图
基本组件
基本组件是小程序页面常用的组件,包括文本、图片、按钮、标题、轮播、分类、图片
列表、图文集和视频,如图文本组件
文本组件用于展示文字,设置点击事件,是小程序中最常用的组件,文本属性如图
图片组件
图片组件用于在页面中展示图片,其属性面板如图
按钮组件
按钮组件用于在页面中设置按钮,其属性如图
标题组件
标题组件用于在页面中设置标题,其属性如图
轮播组件
轮播组件用于实现图片轮播展示,其属性如图
分类组件
分类组件可以设置不同内容展示在不同类别中,还可以添加、删除分类的个数及进行相应的设置。图片列表组件
图片列表组件可以将图片以列表的形式展示,还可以设置图片的名称、标题和点击事
图片列表组件的属性面板如图图文集组件
图文集组件用于展示图片、标题和简介,其属性面板如图视频组件
视频组件用于展示视频,其属性面板如图高级组件
高级组件通常需要有后台数据,通过设置后台数据来实现数据后台化,让小程序的数据随时更新,及时修改
动态列表组件
动态列表组件是容纳基础组件来展示后台数据的容器,通过添加基础组件来展示对应的后台数据,其属性面板如图个人中心组件
个人中心组件显示个人相关信息的组件,包括图像、昵称、我的订单、收货地址、购物
车等,个人中心组件的属性面板如图动态表单组件
动态表单组件相当于HTML中的<form>标签,是一个容器组件,可以添加子表单组件和基本组件,用来收集用户提交的相关信息给后台数据对象。动态表单组件的属性面板如图评论组件
评论组件提供信息发布或回复信息的组件,评论组件的属性面板如图
计数组件
计数组件可以用于点赞、统计浏览量等类似的计数功能。计数组件的属性面板如图了地图组件
地图组件用于显示指定地址的地图,常用于实现定位及导航功能,地图组件的属性面板
如图城市定位组件
城市定位组件通常与列表类组件搭配使用,常见搭配有动态列表和商品列表。例如,城
市定位组件与商品列表搭配,可以实现通过城市定位来搜索出某具体位置信息下的商品列表悬浮窗组件
悬浮窗组件的固定搭配有:客服、我的订单、购物车、回到顶部。悬浮窗组件通常出现
在个人中心或商品列表页面,其属性面板如图其他组件
音频组件
音频组件用于播放音乐(每个页面有一个音频组件即可),手动点击播放按钮后即可实现播放。音频文件可以选择音频库中的音乐,也可以上传本地音频进行更换,音频组件的属性面板如图动态容器组件
动态容器组件用于动态页面,即所在页面绑定了数据对象。动态容器组件中可以添加多种组件——文本组件、图片组件、按钮组件、标题组件、分类组件、音频组件、双栏组件、计数组件。其中,文本组件和图片组件可以绑定相应的数据对象字段(填充相应动态数据),若有计数组件,则会自动与动态容器关联。动态容器组件的属性面板如图
即速应用后台管理
数据管理
数据管理包括数据总览、访客分析和传播数据功能。
数据总览提供小程序总浏览量、昨日/今日访问量、总用户量、总订单数及浏览量曲线图,如图分享设置
分享设置主要提供可以分享应用的方式用户管理
用户管理主要用于实现对用户进行添加、分组、群发消息、储值金充值、赠送会员卡等功能,如图应用数据
应用数据是后台管理的主要内容,前端组件(动态列表、动态表单)的数据都是通过在应用数据中的数据对象来管理的,类似通过数据库存放和管理数据。
轮播管理轮播管理是前端软播组件的后台数据管理器,通过软播管理来设置前端软播组件展示的图片内容。
分类管理分类管理适用于电商、到店、应用数据。分类管理可以通过选择动态分类组件样式来实现在顶部分类或侧边栏分类以展示应用数据、商品数据等效果。动态分类的二级有图模式只适用于电商。
商品管理商品管理是后台管理的主要内容,前端商品列表组件的数据来源于后台商品管理。商品管理可以管理商品列表、积分商品、位置管理、支付方式、订单管理、拼团订单管理、订单统计、账单明细、运费管理和评价管理功能。
经营管理经营管理主要包括子账号管理、手机端客户关系管理和短信接收管理,便于管理者管理小程序的运营。
营销工具营销工具是小程序营销推广的有力工具,主要有会员卡、优惠券、积分、储值、推广、秒杀、集集乐、拼团活动、大转盘、砸金蛋、刮刮乐等。这些营销工具都需要事前在后台合理设置后,才能在活动中发挥更大的作用。
多商家管理多商家管理是即速应用为有众多商家的商城(如“华东商城”“义乌商城”等)开设的
管理功能,方便管理者统计每家店铺的订单及进行收益分析。 -
第六章
-
网络Api
微信小程序处理的数据通常从后台服务器获取,再将处理过的结果保存到后台服务器,这就要求微信小程序要有与后台进行交互的能力。微信原生API接口或第三方API提供了各类接口实现前后端交互。
网络API可以帮助开发者实现网络URL访问调用、文件的上传和下载、网络套接字的
使用等功能处理。微信开发团队提供了10个网络API接口。
(1)wx.request(Object)接口用于发起HTTPS请求。
(2)wx.uploadFile(Object)接口用于将本地资源上传到后台服务器。
(3)wx.downloadFile(Object)接口 用于下载文件资源到本地。
(4)wx.connectSocket(Object)接口 用于创建一个WebSocket 连接。
(5)wx.sendSocketMessage(Object)接口 用于实现通过WebSocket 连接发送数据。
(6)wx.closeSocket(Object)接口用于关闭WebSocket连接。
(7)wx.onSocketOpen(CallBack)接口 用于监听 WebSocket连接打开事件。
(8)wx.onSocketError(CallBack)接口 用于监听WebSocket错误。
(9)wx.onSocketMessage(CallBack)接口 用于实现监听 WebSocket 接收到服务器的消息
(10)wx.onSocketClose(CallBack)接口 用于实现监听WebSocket关闭。发起网络请求
wx.request(Object)实现向服务器发送请求、获取数据等各种网络交互操作,一个微信小程序同时只能有5个网络请求连接,并且是HTTPS请求。列如,通过 wx. request(Object)获取百度(https://www.baidu.com)首页的数据。
.wxml
<button type="primary"bindtap="getbaidutap">获取HTML数据</button> <textarea value ='{{html}}'auto-heightmaxlength='0'></textarea>
.js
Page({ data:{ html:"" }, getbaidutap:function(){ var that = this; wx.request({ url:'https://www.baidu.com/', data:{}, header:{'Content-Type':'application/json'}, success:function(res){ console.log(res); that.setData({ html:res.data }) } }) } })
运行结果:
例如,通过wx.request(Object)的CET方法获取邮政编码对应的地址信息
.wxml
<view>邮政编码:</view> <input type="text"bindinput="input"placeholder='6位邮政编码'/> <button type ="primary"bindtap="find">查询</button> <block wx:for="{{address}}"> <block wx:for="{{item}}"> <text > {{item}}</text></block> </block>
.js
Page({ data:{ postcode:"", address:[], errMsg:"", erroe_code:-1 }, input:function(e){ this.setData({ postcode:e.detail.value, }) console.log(e.detail.value) }, find:function(){ var postcode = this.data.postcode; if(postcode != null&& postcode != ""){ var self = this; wx.showToast({ title:'正在查询、请稍候...', icon:'loading', duration:10000 }); wx.request({ uel:'https://v.juhe.cn/postcode/query', data:{ 'postcode': postcode, 'key':'0ff9bfccaf147476e067de994eb5496e' }, header:{ 'Content -Type':'application/json', }, success:function(res){ wx.hideToast(); if(res.data.error_code ==0){ console.log(res); self.setData({ errMsg:"", error_code: res.data.error_code, address:res.data.result.list }) } else{ self.setData({ rrMsg:res.data.reason ||res.data.reason, error_code: res.data. error_code }) } } }) } } })
运行结果:
上传文件
wx.uploadFile(Object)接口用于将本地资源上传到开发者服务器,并在客户端发起一个HTTPS POOST请求,相关参数如图
通过wx. uploadFile,可以将图片上传到服务器显示。
.wxml
<button type="primary"bindtap="uploadimage">上传图片</button ><image src="/images/tp.jpg"mode="widthFix"/>
.js
Page({ data:{ img :null, uploadimage:function(){ var that =this; //选择图片 wx.chooseImage({ success:function(res){ var tempFilePaths =res.tempFilePaths upload(that,tempFilePaths); } }) function upload(page,path){ //显示toast提示消息 wx.showToast({ icon:"loading", title:"正在上传" }), wx.uploadFile({ url:"http://localhost/", filePath:path[0], name:'file', success:function(res){ console.log(res); if(res.statusCodel=200){ wx.showModal({ title:'提示', content:'上传失败', showCancel:false }) return; } var data =res.data page.setData({ //上传成功修改显示头像 img:path[0] }) }, fail:function(e){ console.log(e); wx.showModal({ title:'提示', content:'上传失败', showCancel:false }) }, complete:function(){//隐藏 Toast wx.hideToast(); } }) } } } })
运行结果:
下载文件
wx.downloadFile(Object)接口用于实现从开发者服务器下载文件资源到本地,在客户端直接发起一个HTTP GET请求,返回文件的本地临时路径,相关参数如图
通过wx.downloadFile(Object),实现从服务器下载图片
.wxml
<button type="primary" bind:tap="downloadimge">下载图像</button> <image src="{{img}}"mode='widthFix'style = "width:90%;height:500px"></image>
.js
Page({ data:{ img:null, }, downloadimage:function(){ var that = this; wx.downloadFile({ url: "http://localhost/1.jpg", //通过WAMP软件实现 success:function(res){ console.log(res) that.setData({ img:res.tempFilePath }) } }) } })
运行结果:
多媒体
多媒体 API主要包括图片API、录音API、音频播放控制API、音乐播放控制API等,其
目的是丰富小程序的页面功能。图片API
图片API实现对相机拍照图片或本地相册图片进行处理,主要包括以下4个API接口:
(1)wx. chooselmage(Object)接口用于从本地相册选择图片或使用相机拍照。
(2)wx.previewlmage(Object)接口 用于预览图片。
(3)wx.getlmagelnfo(Object)接口用于获取图片信息。
(4)wx. savelmageToPhotosAlbum(Object)接口用于保存图片到系统相册。
选择图片或拍照
wx.chooselmage(Object)接口用于从本地相册选择图片或使用相机拍照。拍照时产生的临时路径在小程序本次启动期间可以正常使用,若要持久保存,则需要调用wx.saveFile保存图片到本地。其相关参数如表若调用成功,则返回 tempFilePaths和 tempFiles,tempFilcPaths表示图片在本地临时文件
路径列表。tempFiles 表示图片的本地文件列表,包括path和size。示例代码
wx.chooseImage({ count:2,//默认值为9 sizeType:['original','compressed'],//可以指定是原图还是压缩图,默认 者都有 sourceType:['album','camera'],//可以指定来源是相册还是相机,默认二者都有 success:function(res){ //返回选定照片的本地文件路径列表,tempFilePath可以作为img标签的src属性来显示图片 var tempFilePaths =res.tempFilePaths var tempFiles =res.tempFiles; console.log(tempFilePaths) console.log(tempFiles) } })
预览图片
wx.previewImage(Object)接口主要用于预览图片,其相关参数如表
示例代码
wx.previewImage({ //定义显示第二张 current:" http://bmob- can - 16488.b0.upaiyun. com/2018 /02/05 2.png", urls:["http://bmob-cdn -16488.b0.upaiyun.com/2018/02/05/1.png" "http://bmob-cdn -16488.b0.upaiyun.com /2018/02/05 /2.png", "http://bmob -cdn -16488.b0.upaiyun.com /2018/02 /05 /3.jpg" ] })
获取图片信息
wx.getImageInfo(Object)接口用于获取图片信息,其参数如表
代码示例
wx.chooseImage({ success:function(res){ wx.getImageInfo({ src:res.tempFilePaths[0], success:function(e){ console.log(e.width) console.log(e.height) } }) }, })
保存图片到系统相册
wx. savelmageToPhotosAlbum(Object)接口用于保存图片到系统相册,需要得到用户授权
scope. writePhotosAlbum。其相关参数如表示例代码wx.chooseImage({ success: function(res){ wx. SaveImageToPhotosAlbum({ filePath: res.tempFilePaths[0] success:function(e){ console.1og(e) } }) }, })
录音
6.2.2录音API
录音 API提供了语音录制的功能,主要包括以下两个API 接口:
(1)wx. startRecord(Object)接口用于实现开始录音。
(2)wx.stopRecord(Object)接口 用于实现主动调用停止录音。开始录音
wx. startRecord(Object)接口用于实现开始录音。当主动调用 wx.stopRecord(Object)接口或者录音超过1分钟时,系统自动结束录音,并返回录音文件的临时文件路径。若要持久保存,则需要调用wx.saveFile()接口。其相关参数如表停止录音
wx.stopRecord(Object)接口用于实现主动调用停止录音。
代码示例
wx.startRecord) ({ success: function(res){ var tempFilePath= res.tempFilePath}, fail: function(res){ //录音失败 } }) setTimeout(function(){//结束录音 wx.stopRecord() },10000)
音频播放控制
音频播放控制 API主要用于对语音媒体文件的控制,包括播放、暂停、停止及audio组
件的控制,主要包括以下3个 API:
wx.playVoice(Object)接口用于实现开始播放语音。
wx.pauseVoice(Object)接口用于实现暂停正在播放的语音。
wx.stopVoice(Object)接口用于结束播放语音。播放音乐
wx.playVoice(Object)接口用于开始播放语音,同时只允许一个语音文件播放,如果前
一个语音文件还未播放完,则中断前一个语音文件的播放。其相关参数如表代码示例wx.playBackgroundAudio({ dataUrl:'http://bmob-cdn-16488.b0.upaiyun.com/2018/02/01/ti.mp3', title:'有一天', coverImgUrl:'http://bmob-cdn-16488.b0.upaiyun.com/2018/02/01/si.jpg', success:function(res){ console.log(res) } })
获取音乐播放状态
wx.getBackgroundAudioPlayerState(Object)接口用于获取音乐播放状态,其相关参数如图
代码示例
wx.getBackgroundAudioPlayerState({ success:function(res){ var status=res.status var dataUrl=res.dataUrl var currentPosition=res.currentPosition var duration=res.duration var downloadPercent=res.downloadPercent console.log("播放状态:"+status) console.log("音乐文件地址:"+dataUrl) console.log("音乐文件当前播放位置:"+currentPosition) console.log("音乐文件的长度:"+duration) console.log("音乐文件的下载进度:"+status) } })
控制音乐播放进度
wx.playBackgrondAudio{ dataUrl:'/music/a.mp3', title:'我的音乐', coverImgUrl:'/images/poster.jpg', success:function(){ console.log('开始播放音乐了'); } }); setTimeout(function(){ console.log('暂停播放'); wx.pauseBackgroundAudio(); },5000);//5秒后自动暂停
wx.seekBackgroundAudio(Object)接口用于控制音乐播放进度,其相关参数如表 示例代码
wx.seekBackgroundAudio({ posiyion:30 })
4.暂停播放音乐
wx.pauseBackgroundAudio()接口用于暂停播放音乐。
代码示例
wx.stopBackgroundAudio()接口用于暂停播放音乐。
代码示例
wx.playBackgrondAudio{ dataUrl:'/music/a.mp3', title:'我的音乐', coverImgUrl:'/images/poster.jpg', success:function(){ console.log('开始播放音乐了'); } }); setTimeout(function(){ console.log('暂停播放'); wx.stopBackgroundAudio(); },5000);//5秒后自动
监听音乐播放
wx.onBackgroundAudioPlay(CallBack)接口用于实现监听音乐播放,通常被wx.playBackgroundAudio(Object)方法触发,在CallBack中可改变播放图标。
示例代码
wx.playBackgroundAudio({ dataUrl:this.data.musicData.dataUrl, title:this.data.musicData.title, coverImgUrl:this.data.musicData.coverImgUrl, success:function(){ wx.onBackgroundAudioStop(function(){ that.setData({ isPlayingMusic:false }) })
监听音乐暂停
wx.onBackground AudioPause(CallBack)接口用于实现监听音乐暂停,通常被 wx.pause
BackgroundAudio()方法触发。在CallBack中可以改变播放图标。监听音乐停止
wx. onBackgroundAudioStop(CallBack)接口用于实现监听音乐停止,通常被音乐自然播放停止或wx. seekBackgroundAudio(Object)方法导致播放位置等于音乐总时长时触发。在CallBack中可以改变播放图标。案例展示
在此,以小程序music 为案例来展示音乐API的使用。该小程序的4个页面文件分别为music. wxml、music. wxss、music.json和music.cojs。music.wxml的示例代码如下
<view class="container"> <image class="bgaudio"src = "{{changedImg? music.coverImg:'../images/yy (4).png'}}"/> <view class ="control-view"> <!--使用data-how定义一个0表示快退10秒--> <image src ="../images/yy (4).png"bindtap="onPositionTap"data-how= "0 "/> <image src = "../images/{{isPlaying?'pause':'play'}}.png " bindtap = "onAudioTap"/> <image src ="../images/play.png"bindtap = "onStopTap"/><!--使用data-how定义一个1表示快进10秒--> <image src ="../images/yy (4).png"bindtap ="onPositionTap"data-how = "1"/> </view > </view >
music.wxss的示例代码如下
.bgaudio{ height:350rpx; width:350rpx; margin-bottom:100rpx; } .control-view image{ height:64rpx; width:64rpx; margin:30rpx; }
music.json的示例代码如下
music.js的示例代码如下
Page({ data:{ //记录播放状态 isPlaying:false, //记录coverImg,仅当音乐初始时和播放停止时,使用默认的图片。播放中和暂停时,都使用当前音乐的图片 coverImgchangedImg:false, //音乐内容 music:{ "url":"../images/e e.mp4", "title":"盛晓玫-有一天", "coverImg": "../images/e e.mp4" }, }, onLoad:function(){ //页面加载时,注册监听事件 this.onAudioState(); }, //点击播放或者暂停按钮时触发 onAudioTap:function(event){ if(this.data.isPlaying){ //如果在正常播放状态,就暂停,并修改播放的状态 wx.pauseBackgroundAudio(); }else{ //如果在暂停状态,就开始播放,并修改播放的状态28 let music = this.data.music; wx.playBackgroundAudio({ dataUrl: music.url, title: music.title, coverImgUrl:music.coverImg }) } }, //点击即可停止播放音乐 onStopTap:function(){ let that = this; wx.stopBackgroundAudio({ success:function(){ //改变coverImg和播放状态 that.setData({ isPlaying:false,changedImg:false}); } }) }, //点击“快进10秒”或者“快退10秒”时,触发 onPositionTap:function(event){ let how = event.target.dataset.how;//获取音乐的播放状态 wx.getBackgroundAudioPlayerState({ success:function(res){ //仅在音乐播放中,快进和快退才生效 //音乐的播放状态,1表示播放中54 let status = res.status; if(status === 1){//音乐的总时长 let duration = res.duration;//音乐播放的当前位置 let currentPosition = res.currentPosition; if(how ==="0"){ //注意:快退时,当前播放位置快退10秒小于0时,直接设置position为1;否则,直接减去10秒//快退到达的位置 let position = currentPosition - 10; if(position <0){ position =1;//执行快退 } wx.seekBackgroundAudio({ position: position }); //给出一个友情提示,在实际应用中,请删除!!! wx. showToast({title:"快退10s",duration:500}); } if(how === "1"){//注意:快进时,当前播放位置快进10秒后大于总时长时,直接设置position 为总时长减1 //快进到达的位置 let position =currentPosition +10; if(position >duration){ position =duration-1;//执行快进 } wx.seekBackgroundAudio({ position: position});//给出一个友情提示,在实际应用中,请删除!!! wx.showToast({ title:"快进10s",duration:500}); } }else { //给出一个友情提示,在实际应用中,请删除!!! wx.showToast({title:"音乐未播放",duration:800}); } } }) },//音乐播放状态 onAudioState:function(){ let that =this; wx.onBackgroundAudioPlay(function(){//当wx.playBackgroundAudio()执行时触发101 //改变coverImg和播放状态 that.setData({ isPlaying:true,changedImg:true}); console.log("on play"); }); wx.onBackgroundAudioPause(function(){ //当wx.pauseBackgroundAudio()执行时触发//仅改变播放状态 that.setData({isPlaying:false}); console.log("on pause"); }); wx.onBackgroundAudioStop(function(){ //当音乐自行播放结束时触发//改变coverImg和播放状态 that.setData({isPlaying:false,changedImg:false}); console.log("on stop"); }); } })
文件API
从网络上下载或录音的文件都是临时保存的,若要持久保存,需要用到文件API。文件
API 提供了打开、保存、删除等操作本地文件的能力,主要包括以下5个API接口:
(1)wx.saveFile(Object)接口用于保存文件到本地。
(2)wx. getSavedFileList(Object)接口用于获取本地已保存的文件列表。
(3)wx.getSaveFilelnfo(Object)接口用于获取本地文的文件信息。
(4)wx.removeSaveFile(Object)接口用于删除本地存储的文件。
(5)wx.openDocument(Object)接口 用于新开页面打开文档,支持格式:doc、x ppt、pdf、docx、xlsx、ppts。保存文件
wx.saveFile(Object)用于保存文件到本地,其相关参数如表部分示例代码如下savelmg: function(){ wx.chooseImage({ count:1,//默认值为9 sizeType:[original','compressed'],//可以指定是原图还是压缩图,默认 二者都有 sourceType:['album','camera ],//可以指定来源是相册还是相机,默认二者都有 success:function(res){ var tempFilePaths = res.tempFilePaths[0] wx.saveFile({ tempFilePath: tempFilePaths, success:function(res){ var saveFilePath = res. savedFilepath; console. log(saveFilePath) } }) } }) }
获取本地文件列表
wx. getSavedFileList(Object)接口用于获取本地已保存的文件列表,如果调用成功,则返回文件的本地路径、文件大小和文件保存时的时间戳(从1970/01/01 08:00:00到当前时间的秒数)文件列表。相关参数如图示例代码
wx.getSavedFileList({ success:function(res){ that.setData({ fileList:res.fileList }) } })
获取本地文件的文件信息
wx. getSaveFileInfo(0bject)接口用于获取本地文件的文件信息,此接口只能用于获取已保存到本地的文件,若需要获取临时文件信息,则使用wx. getFileInfo(Object)接口。相关参数如图示例代码
wx.chooseImage( count:1,//默认值为9 sizeType:['original,compressed'],//可以指定是原图还是压缩图,默认 sourceType:['album,'camera'],//可以指定来源是相册还是相机,默认二老 success:function(res){ var tempFilePaths = res.tempFilePaths[0] wx.saveFile({ tempFilePath: tempFilePaths, success:function(res){ var saverilePath = res.savedrilePath; wx.getSavedFileInfo({ filePath: saveFilePath, success:function(res){ console.log(res.size) } }) } }) } })
删除本地文件
wx.removeSaveFile(Object)用于删除本地储存文件,其参数如图示例代码如下
打开文档
wx.openDocument(Object)接口用于新开页面打开文档,支持格式有doc、xls、ppt、pdf、docx、xlsx、pptx,其相关参数如图
代码示例如下
wx.downloadFile({ url:"http://localhost/fm2.pdf", success: function(res){ var tempFilePath =res. tempFilePath; wx.openDocument({ filePath: tempFilePath, success:function(res){ console.log("打开成功") } }) } })
本地数据及缓存
小程序提供了以键值对的形式进行本地数据缓存功能,并且是永久存储的,但最大不超过10MB,其目的是提高加载速度。数据缓存的接口主要有4个:
(1)wx.setStorage(Object)或wx.setStorageSync(key,data)接口用于设置缓存数据。
(2)wx. getStorage(Object)或wx.getStorageSync(key)接口用于获取缓存数据。
(3)wx. removeStorage(Object)或wx.removeStorageSync(key)接口用于删除指定缓存
(4)wx.clearStorage()或wx.clearStorageSync()接口用于清除缓存数据。其中,带Sync后缀的为同步接口,不带Symc后缀的为异步接口。保存数据
wx. setStorage(Object)
wx.setStorage(Object)接口将数据存储到本地缓存接口指定的key中,接口执行后会覆盖原来key对应的内容。其参数如图示例代码wx.setStorage({ key: 'name', data: 'sdy', success:function(res){ console.log(res) } })
wx. setStorageSync(key,data)
wx.setStorageSync(key,data)是同步接口,其参数只有key 和data。
示例代码如下:wx.setStorageSync('age', 25')
获取数据
1wx. getStorage(Object)
wx.getStorage(Object)接口是从本地缓存中异步获取指定 key 对应的内容。其相关参数如图示例代码
wx.getstorage({ key:'name', success:function(res){ console.log(res.data) }, })
wx. getStorageSync(key)
wx.getStorageSync(key)从本地缓存中同步获取指定key 对应的内容。其参数只有keya示例代码
try{ var value = wx.getstorageSync('age') if(value){ console.log("获取成功"+value) } }catch(e){ console.log("获取失败") }
运行结果:
删除数据
wx. removeStorage(Object)
wx. removeStorage(Object)接口用于从本地缓存中异步移除指定 key。其相关参数如图示例代码wx.removeStorage({ key:'name', success:function(res){ console.log("删除成功") }, fail:function(){ console.log("删除失败") } })
wx. removeStorageSync(key)
wx. removeStorageSync(key)接口用于从本地缓存中同步删除指定key 对应的内容。其参数只有key。示例代码
try { wx.removeStorageSync('name') } catch(e){ //Do something when catch error }
运行结果:
清空数据
wx. clearStorage()
wx.clearStorage()接口用于异步清理本地数据缓存,没有参数。示例代码
wx.getStorage({ key:'name', success:function(res){ wx.clearStorage() }, })
运行结果:
wx. clearStroageSync()
wx.clearStroageSync()接口用于同步清理本地数据缓存。示例代码
try{ wx.clearStorageSync() }catch(e){ }
位置信息API
小程序可以通过位置信息API 来获取或显示本地位置信息,小程序支持WGS84和GCj02标准,WGS84 标准为地球坐标系,是国际上通用的坐标系;GCjO2标准是中国国家测绘局制定的地理信息系统的坐标系统,是由WGS84坐标系经加密后的坐标系,又称为火星坐标系。默认为WCS84标准,若要查看位置需要使用GCj02标准。主要包括以下3个API接口:
wx. getLocation(Object)接口用于获取位置信息。
wx.chooseLocation(Object)接口 用于选择位置信息。wx.openLocation(Object)接口 用于通过地图显示位置。
获取位置信息
wx.getLocation(Object)接口用于获取当前用户的地理位置、速度,需要用户开启定位功能,当用户离开小程序后,无法获取当前的地理位置及速度,当用户点击“显示在聊天顶部”时,可以获取到定位信息,其相关参数如表wx.getLocation(Object) 调用成功后,返回的参数如图
示例代码
wx.getLocation({ type:'wgs84', success:function(res){ console.log("经度:"+res.longitude); console.log("纬度:"+res.latitude); console.log("速度:"+res.longitude); console.log("位置的精确度:"+res.accuracy); console.log("水平精确度:"+res.horizontalAccuracy); console.log("垂直精确度:"+res.verticalAccuracy);}, })
选择位置信息
wx.chooseLocation(Object)接口用于在打开的地图中选择位置,用户选择位置后可返回当前位置的名称、地址、经纬度信息。其相关参数wx. chooseLocation(Object)调用成功后,返回的参数如表示例代码
wx.chooseLocation({ success:function(res){ console.1og("位置的名称:"+res.name) console.1og("位置的地址:"+res.address) console.1og("位置的经度:"+ res.longitude) console.log("位置的纬度:"+ res.latitude) } })
显示位置信息
wx. qpenlocation(Object)接口用于在微信内置地图中显示位置信息,其相关参数如表
示例代码
wx.getLocation({ type:'gcj02',//返回可以用于wx.openLocation的经纬度 success:function(res){ var latitude = res.latitude var longitude= res.longitude wx.openLocation({ latitude: latitude, longitude:longitude, scale:10, name:'智慧国际酒店', address:'西安市长安区西长安区300号'}) } })
相关设备
设备相关的接口用于获取设备相关信息,主要包括系统信息、网络状态、拨打电话及扫
码等。主要包括以下5个接口 API:
(1)wx.getSystemInfo(Object)接口、wx.getSystemInfoSync()接口用于获取系统信息。
(2)wx.getNetworkType(Object)接口用于获取网络类型。
(3)wx.onNetworkStatusChange(CallBack)接口用于监测网络状态改变。
(4)wx.makePhoneCall(Object)接口用于拨打电话。
(5)wx.scanCode(Object)接口用于扫描二维码。采取系统信息
wx.getSystemInfo(Object)接口、wx.getSystemInfoSync()接口分别用于异步和同步获取系
统信息。其相关参数如表wx.getSystemlnfo()接口或wx.getSystemInfoSync()接口调用成功后,返回系统相关信
息,如表示例代码
wx.getSystemInfo({ success:function(res){ console.log("手机型号:"+res.model) console.log("设备像素比:"+res.pixelRatio) console.log("窗口的宽度:"+ res.windowWidth) console.log("窗口的高度:"+res.windowHeight) console.log("微信的版本号:"+res.version) console.log("操作系统版本:"+ res.system) console.log("客户端平台:"+res.platform)},})
网络状态
获取网络状态
wx. getNetworkType(0bject)用于获取网络类型,其相关参数如表如果wx.getNetworkType()接口被成功调用,则返回网络类型包,有wifi、2G、3G 4G、unknown(Android下不常见的网络类型)、none(无网络)。
示例代码
wx.getNetworkType({ success:function(res){ console.log(res.networkType)},})
监听网络状态变化
wx.onNetworkStatusChange(CallBack)接口用于监听网络状态变化,当网络状态变化时,返回当前网络状态类型及是否有网络连接。
示例代码
wx.onNetworkStatusChange(function(res){ console.log("网络是否连接:"+res.isConnected) console.log("变化后的网络类型"+res.networkType)})
拨打电话
wx.makePhoneCall(Object)接口用于实现调用手机拨打电话,其相关参数如表
示例代码
wx.makePhoneCall({ phoneNumber:'18092585093'//需要拨打的电话号码 })
扫描二维码
wx.scanCode(Object)接口用于调起客户端扫码界面,扫码成功后返回相应的内容,其相关参数如图
扫描成功后,返回的数据如图
示例代码
//允许从相机和相册扫码 wx.scanCode({ success:(res) =>{ console.log(res.result) console.log(res.scanType) console.log(res.charSet) console.log(res.path) } }) //只允许从相机扫码 wx.scanCode({ onlyFromCamera:true, success:(res) =>{ console.log(res) } })
运行结果:
本章小结
本章主要介绍了小程序的各类核心 API,包括网络API、多媒体API、文件 API、本地数据及缓存API、位置信息API及设备相关API等。通过对本章的学习,大家应深刻地理解各类API是开发各类小程序的核心。