第一章 微信小程序概述
1.认识微信小程序
简介:微信小程序是一种集成在微信内部的应用程序,用户可以直接在微信中使用,不需要下载安装。随着微信用户的不断增加,微信小程序逐渐成为商家们进行移动互联网营销的重要选择。小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验。
特征·:
1. 无须安装
小程序内嵌于微信程序之中,用户在使用过程中无须在应用商店下载安装外部应用。
2. 触手可及
用户通过扫描二维码等形式直接进入小程序,实现见线下场景与线上应用的即时联通。
3. 用完即走
用户在线下场景中,当有相关需求时,可以直接接妾入小程序,使用服务功能后便可以对其不理会,实现用完即走。
4. 无须卸载
用户在访问小程序后可以直接关闭小程序,无须卸载。
应用场景特点:
1.简单的业务逻辑
2.低频的使用场景
2.微信小程序开发者工具界面功能介绍
1.工具栏
在工具栏中可以实现多种功能,例如账号的切换,模拟区、编辑区、调试区的显示/隐藏,小程序的编译、预览,切换后台,清理缓存等。
2. 模拟区
在模拟区中选择模拟手机的类型、显示比例、网络类型后,模拟器中会显示小程序的运行效果。
3.目录文件区
目录文件区用来显示当前项目的目录结构,单击左上角的“+”按钮可以进行目录和文件的创建,右键单击目录文件区中的文件或目录可以进行“硬盘打开”“重命名”“删除”等相关操作。
4.编辑区
编辑区用来实现对代码的编辑操作,编辑区中支持对.wxml、.wxss、.js 及.json 文件作,使用组合键能提高代码的编辑效率。
5.调试区
调试区的功能是帮助开发者进行代码调试及排查有问题的区域。
三.面板
1.Console 面板
Console面板是调试小程序的控制面板,当代码执行出现错误时,错送1信号将显示在
Console面板中,便于开发者排查错误。
2.Sources 面板
Sources 面板是源文件调试信息页,用于显示当调试区左侧显示的是源文件的目录结构。
3.Network面板
Network 面板是网络调试信息页,用于观察和显示网络请求reauest和 socket等网络相关
的详细信息。
4.Security面板
Security 面板是安全认证信息页,开发者可以通过该面板调试当前网页的安全和认证等问
题。
5.Storage 面板
Storage 面板是数据存储信息页,开发者可以使用Wx.setStorage或者Wx.setStorageSync将数据
存储到本地存储,存储在本地存储中的变心可以在Storage面板中显示。
6.AppData面板
AppData面板是实时数据信息页,用于显示项目中被激活的所有页面的数据情况。
7.Wxml面板
Wxml面板是布局信息页,主要用于调试Wxml 组件和相关CSS样式,显示Wxml转的界面。
8.Sensor面板
Sensor面板是重力传感器信息页,开发者可以在这里选择模拟地理位置来模拟杉动设备
用于调试重力感应API。
9.Trace 面板
Trace 面板是路由追踪信息页,开发者在这里可以追踪连接到电脑中的安卓(Android) 设备的路由信息。
10.扩展菜单栏
最右边的扩展菜单项“:”主要包括开发工具的一些定制与设置,开发者可以在这里设置相关信息。
第二章 微信小程序开发基础
1.小程序的基本目录结构
pages:页面文件夹
utils:工具包 存放一些公共的.js文件(例如:格式化时间的自定义模块)
app.js:全局逻辑文件
app.json:小程序公共设置文件,配置小程序全局设置
app.wxss:小程序主样式表文件
project.config.json:项目配置文件
index:页面文件
index有四个页面文件分别是
index.js:页面逻辑文件,在该文件中编写JavaScript代码控制页面的逻辑。
index.json:页面配置文件
index.wxml:页面结构文件,用于设计页面的布局,数据绑定等,类似HTML页面中的.html文件。
index.wxss:页面样式表文件,用于定义本页面中用到的各类样式表。
2.小程序开发框架
视图层:视觉效果,内容,结构等。
逻辑层:数据整理,网络通讯等。
数据层: 数据层在逻辑上包括页面临时数据或缓存、文件存储(本地存储)和网络存储与调用。
1.页面临时数据或缓存
在Page()中,使用setData函数将数据从逻辑层发送到视图层,同时改变对应的this.data的值。
setData()函数的参数接受一个对象,以(key,value)的形式表示将key在this.data中对应的值改变成value。
2.文件存储(本地存储)
使用数据API接口,如下:
- wx.getStorage 获取本地数据缓存。
- wx.setStorage 设置本地数据缓存。
- wx.clearStorage 清理本地数据缓存。
3.网络存储与调用
上传或下载文件API接口,如下:
- wx.request 发起网络请求。
- wx.uploadFile 上传文件。
- wx.downloadFile 下载文件。
调用URL的AIP接口,如下:
- wx.navigateTo 新窗口打开页面。
- wxredirectTo 原窗口打开页面.
全局配置项
3.配置文件
1.pages配置项
pages配置项接受一个数组,用来指定小程序由哪些页面组成,数组的每一项都是字符串,代表对应页面的"路径"+"文件名"。pages配置项是必填项。
设置pages设置项时,应注意以下3点:
(1)数组的第一项用于设定小程序的初始页面。
(2)在小程序中新增或减少页面时,都需要对数组进行修改。
(3)文件名不需要写文件扩展名。小程序框架会自动寻找路径对应及对.js、.json、.wxml、和.wxss文件进行整合数据绑定。
2.window配置项
window配置项负责设置小程序状态栏、导航条、标题、窗口背景色等系统样式。
window配置项及描述
3.tabBar配置项
当需要在程序顶部或底部设置菜单栏时,可以通过配置tabBar配置项来实现。
tabBar配置项及其描述
其中,list(列表)接受数组值,数组中的每一项也都是一个对象。
tabBar中list选项
4.networkTimeout配置项
小程序中各种网络请求API的超时时间值只能通过networkTimeout配置项进行统一设置,不能在API中单独设置。
networkTimeout配置项
5.debug配置项
debug配置项用于开启开发者工具的调试模式,默认为false。开启后,页面的注册、路由、数据更新、事件触发等调试信息将以info的形式输出到Console(控制台)面板上。
页面配置文件
页面配置文件(*.json) 只能设置本页面的窗口表现,而且只能设置window 配置项的内容,在配置页面配置文件后,页面中的window配置值将覆盖全局配置文件(app.json)中的配置值
1.app.json中"navigationBarTextStyle": "black"跟自建的页面文件夹设置的"navigationBarTextStyle": "red"优先取自建页面文件夹中的颜色。"就近原则"
4.逻辑层文件
1.项目逻辑文件
项目逻辑文件app.js中可以通过App()函数注册小程序生命周期函数、全局属性和全局方法,已注册的小程序实例可以在其他页面逻辑文件中通过getApp()获取。
App()函数用于注册一个小程序,参数为Object,用于指定小程序的生命周期函数,用户自定义属性和方法。
项目逻辑文件配置项
2.页面逻辑文件
页面逻辑文件的主要功能有:设置初始数据;定义当前页面的生命周期函数;定义事件处理函数等。每个页面文件都有一个相应的逻辑文件,逻辑文件是运行在纯JavaScript引擎中。因此,在逻辑文件中不能使用浏览器提供的特有对象(document、window)及通过操作DOM改变页面,只能采用数据绑定和事件响应来实现。
在逻辑层,Page()方法用来注册一个页面,并且每个页面有且仅有一个
页面逻辑文件配置项
1. 设置初始数据
设置初始数据是对页面的第一次数据绑定。对象data 将会以JSON (Javascript Object No tation,JS对象简谱)的形式由逻辑层传至视图层。因此,数据必须是可以转成JSON的格式(字符串、数字、布尔值、对象、数组)。
视图层可以通过WXML对数据进行绑定
2.定义当前页面的生命周期函数
- 在Page()函数的参数中,可以定义当前页面的生命周期函数。页面的生命周期函数主
- 要有onload、onShow、onReady、onHide、onUnload。
- onLoad页面加载函数。当页面加载完成后调用该函数。一个页面只会调用一次。
- 该函数的参数可以获取 wx. navigateTo和wx.redirectTo及<navigator/>中的query。
- onShow页面显示函数。当页面显示时调用该函数。每次打开页面都会调用一次。onReady页面数据绑定函数。当页面初次数据绑定完成时调用该函数。一个页面只会调用一次,代表页面已经准备就绪,可以和视图层进行交互。
- onHide页面隐藏函数。当页面隐藏时及当navigateTo或小程序底部进行tab切换时,调用该函数。
- onUnload页面卸载函数。当页面卸载、进行 navigateBack或redirectTo操作时,调用该函数
示例代码
运行结果
在app.json文件中设置如下tabBar配置
"tabBar": {
"color": "#666666",
"selectedColor": "#ff0000",
"borderStyle":"black",
"backgroundColor": "#ffffff",
"list": [{
"pagePath": "pages/index/index",
"text": "首页",
"iconPath": "images/IMG7.jpg",
"selectedIconPath": "images/IMG7.jpg"
},
{
"pagePath": "pages/news/news",
"iconPath": "images/IMG8.jpg",
"selectedIconPath": "images/IMG8.jpg",
"text": "新闻"
}
运行结果
3.定义事件处理函数
开发者在Page()中自定义的函数称为事件处理函数。视图层可以在组件中加入事件绑
定,当达到触发事件时,小程序就会执行Page()中定义的事件处理函数。
4.使用setData更新数据
小程序在Page 对象中封装了一个名为setData()的函数,用来更新data中的数据。函数参数为Object,以“key:value”对的形式表示将 this data 中的key 对应的值修改为value。
示例代码
.json
Page({
data:{
name:'lwk',
birthday:[{year:1998},{month:11},{date:18}],
object:{hobby:'computer'}
},
chtext:function(){
this.setData({
name:'lzh'
});
},
charray:function(){
this.setData({
'birthday[0].year':2005
});
},
chobject:function(){
this.setData({
'object.hobby':'music'
})
},
addata:function(){
this.setData({
'address':'shanxi'
})
}
})
.wxml
<view>{{name}}</view>
<button bindtap="chtext">修改普通数据</button>
<view>{{birthday[0].year}}</view>
<button bindtap="charray">修改数组数据</button>
<view>{{object.hobby}}</view>
<button bindtap="chobject">修改对象数据</button>
<view>{{address}}</view>
<button bindtap="adddata">添加数据</button>
运行结果
5.页面结构文件
页面结构文件(WXML)是框架设计的一套类似IITML的标签语言,结合基础组件、事件系统,可以构建出页面的结构,即.wxml文件。在小程序中,类似HTML的标签被称为组件,是页面结构文件的基本组成单元。这些组件有开始(如<view>)和结束(如</view>)标志,每个组件可以设置不同的属性(如id、class等),红件还可以嵌套。
WXML还具有数据绑定、条件数据绑定、列表数据绑定、模板、引用页面文件、页面事件等能力。
1.数据绑定
小程序在进行页面数据绑定时,框架会将WXML文件与逻辑文件中的dala进行动态绑定,在页面中显示data中的数据。小程序的数据绑定使用Mustache语法(1111)将变量或运算规则包起来。
1.简单绑定
简单绑定是指使用双大括号({111)将变量包起来,在页面中直接作为字符串输出使用。
简单绑定可以作用于内容、组件属性、控制属性等的输出。
【注意】
简单绑定作用于组件属性、控制属性时,双大括号外应添加双引号。
2.运算
在{{}} 内可以做一些简单的运算(主要有算术运算、逻辑运算、三元运算、字符串
运算等),这些运算均应符合JavaScript运算规则。
示例代码
.wxml
<view>算数运算:{{age+100}}</view>
<view>逻辑运算:{{age==30}}</view>
<view>三元运算:{{1==1?3:4}}</view>
运行结果
3.列表数据绑定
列表数据绑定用于将列表中的各项数据进行重复数据绑定。
1.wx:for
在组件上,可以使用wx:for控制属性绑定一个数组,将数据中的各项数据循环进行数据绑定到该组件。
示例代码
.js
students:[
{nickname:"tom",height:180,weight:150},
{nickname:"duola",height:160,weight:100}
]
.wxml
<view wx:for="{{students}}">
<text>姓名:{{item.nickname}}</text>
<text>身高:{{item.height}}</text>
<text>体重:{{item.weight}}</text>
</view>
运行结果
2.block wx:for
与block wx:if类似,在wxml中也可以使用<block>包装多个组件进行列表数据绑定。
6.页面事件
简单来说,小程序中的事件是用户的一种行为或通信方式。在页面文件中,通过定义事件来完成页面与用户之间的交互,同时通过事件来实现视图层与逻辑层的通信。我们可以将事件绑定到组件上,当达到触发条件时,事件就会执行逻辑层中对应的事件处理函数。要实现这种机制,需要定义事件函数和调用事件。
1.定义事件函数 在.js文件中定义事件函数来实现相关功能,当事件响应后就会执行事件处理码。
2.调用事件调用事件 也称为注册事件。调用事件就是告诉小程序要监听哪个组件的什么事件,通常在页面文件中的组件上注册事件。事件的注册(同组件属性),以“key =value”形式出现,key(属性名)以bind或catch开头,再加上事件类型,如bindtap、catchlongtap。其中,bind开头的事件绑定不会阻止冒泡事件向上冒泡,catch开头的事件绑定可以阻止冒泡事件向上冒泡。value(属性值)是在js中定义的处理该事件的函数名称,如click。
在小程序中,事件分为冒泡事件和非冒泡事件两大类型。
1.冒泡事件冒泡事件是指某个组件上的事件被触发后,事件会向父级元素传递,父级元素再向其父级元素传递,一直到页面的顶级元素
2.非冒泡事件非冒泡事件是指某个组件上的事件被触发后,该事件不会向父节点传递。
7 页面样式文件
页面样式文件(WXSS)是基于CSS拓展的样式语言,用于描述WXML的组成样式,决定WXML的组件如何显示。WXSS具有CSS的大部分特性,小程序对WXSS做了一些扩充和修改。
1.尺寸单位
由于CSS原有的尺寸单位在不同尺寸的屏幕中得不到很好的呈现,WXSS在此基础上增加了尺寸单位mpx(respnesive pixel)WXSS规定屏幕宽度为750 mpx,在系统数据绑定过程中rpx会按比例转化为px。
2.样式导入
为了便于管理WXSS文件,我们可以将样式存放于不同的文件中。如果需要在某个文件中引用另一个样式文件,使用@import语句导入即可。
3.选择器
目前,WXSS 仅支持CSS 中常用的选择器,如.class、#id、element、:before、::aftent等。
4.WXSS常用属性
WXSS文件与CSS文件有大部分属性名及属性值相同,WXSS的常用属性及属性值如表
第三章页面布局
3.1.盒子模型
盒子模型就是在页面设计中经常用到的一种思维模型。在CSS中,一个独立的盒子模型由内容(content)、内边距(padding)、边框(border)、和外边框(margin)4个部分组成。
此外,对padding、border和margin可以进一步细化为上、下、左、右4个部分,在CSS中可以分别设置
图中各元素的含义如下:
1.width和height 内容的高度和宽度。
2. padding -top、padding-right、padding-bottom 和padding-left上内边距、右内边
距、底内边距和左内边距。
3.border -top、border -right、border-bottom 和border-left上边框、右边框、底边框
4.margin-top、margin-right、margin-bottom 和margin-left上外边距、右外边距
底外边距和左外边距。
因此,一个盒子实际所占有的宽度(高度)应该由“内容”+“内边距”+“边框”
+“外边距”组成。CSS中的布局都基于盒子模型,不同类型的元素对盒子模型的处理不同。
3.2 块级元素与行内元素
元素按显示方式分为块级、行内元素和行内块元素,他们的显示方式由display属性控制。
3.2.1块级元素
块级元素默认占一行高度,一行内通常只有一个块级元素(浮动后除外),添加新的块
级元素时,会自动换行,块级元素一般作为盒子出现。块级元素的特点如下:
(1)一个块级元素占一行。
(2)块级元素的默认高度由内容决定,除非自定义高度。
(3)块级元素的默认宽度是父级元素的内容区宽度,除非自定义宽度。(4)块级元素的宽度、高度、外边距及内边距都可以自定义设置。(5)块级元素可以容纳块级元素和行内元素。
<view>组件默认为块级元素,使用<view/>组件演示盒子模型及块级元素的示例代码如下:
.wxml
<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.3 行内元素
行内元素,不必从新一行开始,通常会与前后的其他行内元素显示在同一行中,它们不占有独立的区域,仅靠自身内容支撑结构,一般不可以设置大小,常用于控制页面中文本的样式。将一个元素的display 属性设置为inline后,该元素即被设置为行内元素。行内元素的特点如下:
(1)行内元素不能被设置高度和宽度,其高度和宽度由内容决定 。
(2)行内元素内不能放置块级元素,只级容纳文本或其他行内元素
(3)同一块内,行内元素和其他行内元素显示在同一行。
<text/>组件默认为行内元素,使用<vicw/>及<text/>组件演示盒子模型及行内元素
的示例代码如下:
.wxml
<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.3 浮动与定位
3.3.1 元素浮动与清除
元素浮动就是指设置了浮动属性的元素会脱离标准文档流的控制,移到其父元素中指定位置的过程。在CSS中,通过float属性来定义浮动,其基本格式如下
其中,none——默认值,表元素不浮动;left——元素向左浮动right——元素向右浮动
代码如下,分别对box1 box2 box3元素左浮动
.wxml
<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>
<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;">box2</view>
</view>
<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>
<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>
运行结果
通过案例我们发现,当box3左浮动后,父元素的边框未能包裹box3元素。这时,可以通过清除浮动来解决。
由于浮动元素不再占用原文档流的位置,因此它会对页面中其他元素的排列产生影响。在CSS中,clear属性用于清除浮动对其他元素的影响,其基本格式如下:
其中,left——清除左边浮动的影响,也就是吧允许左侧有浮动元素;right——清除右浮动的影响,也就是不允许右侧有浮动元素;both——同时清除左右两侧浮动的影响;none——不清除浮动。
.wxml
<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>
另外,还可以在父元素外添加一个空元素,实现父元素包裹浮动元素代码如下:
<view>box1 box2 box3 左浮动 在父元素后添加一个空元素</view>
<view style="border: 1px solid #f00;padding: 5px;"class="clear-float">
<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;">box2</view>
</view>
运行结果
3.3.2元素定位
浮动布局虽然灵活,但无法对元素的位置进行精确的控制。在CSS中,通过position属性可以实现对页面元素的精准定位。基本格式如下:
static——默认值,该元素按照标准流进行布局;
relative——相对定位,相对于它在原文档流的位置进行定位,它后面的盒子仍以标准流
方式对待它;
absolute——绝对定位,相对于其上一个已经定位的父元素进行定位,绝对定位的盒子
从标准流中脱离,它对其后的兄弟盒子的定位没有影响;
fixed—固定定位,相对于浏览器窗口进行定位。
对box1 box2 box3 进行元素静态定位,示例代码如下:
<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进行元素相对定位,示例代码如下:
<view style="border: 1px solid #0f0;width: 100px;height: 100px;">box1</view>
<view style="border: 1px solid #0f0;width: 100px;height: 100px; position: relative;left: 30px;top: 30px;">box2</view>
<view style="border: 1px solid #0f0;width: 100px;height: 100px;">box3</view>
<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 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>
运行结果如下
通过案例我们发现绝对定位和固定定位的效果相同。因为他们的父元素是page,没有定位。
如果将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采用固定定位代码如下:
<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布局是万维网联盟在2009年提出的一种新布局方案,该布局可以简单快速地完成各种可以伸缩的设计,以便很好地支持响应式布局。flex是flexible box的缩写,意为弹性盒子模型,可以简便、完整、响应式地实现各种页面布局。
flex 布局主要由容器和项目组成,采用flex布局的元素称为 flex容器(flexcontainer),
flex布局的所有直接子元素自动成为容器的成员,称为flex项目(flexitem)。
容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end;交叉轴的开始位置叫做cross start,结束位置叫做cross end。
项目默认沿主轴排列。单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做
cross size。
设置display 属性可以将一个元素指定为fex布局,设置fex-direction属性可以指定主
轴方向。主轴既可以是水平方向,也可以是垂直方向。
flex布局模型
第四章 页面组件
4.1 组件的定义及属性
组件是页面视图层(WXML)的基本组成单元,组件组合可以构建功能强大的页面结构。小程序框架为开发者提供了容器视图、基础内容、表单、导航、多媒体、地图、画布开放能力等8类(30多个)基础组件。
每一个组件都由一对标签组成,有开始标签和结束标签,内容放置在开始标签和结束标签之间,内容也可以是组件。语法格式如下:
组件通过属性来进一步细化。不同的组件可以有不同的属性,但它们也有一些共用属
性,如id、class、style、hidden、data-*、bind*/catch*等。
■id 组件的唯一表示,保持整个页面唯一,不常用。
■class 组件的样式类,对应WXSS中定义的样式。
■style 组件的内联样式,可以动态设置内联样式。
■hidden 组件是否显示,所有组件默认显示。
■data-* 自定义属性,组件触发事件时,会发送给事件处理函数。事件处理函数可以通过传入参数对象的currentTarget. dataset方式来获取自定义属性的值。
■bind */catch *组件的事件,绑定逻辑层相关事件处理函数。
4.2 容器视图组件
容器视图组件是能容纳其他组件的组件,是构建小程序页面布局的基础组件,主要包括view、 scroll-view和suiper。
4.2.1 view
view 组件是块级组件,没有特殊功能,主要用于布局展示,相当于HTML中的div、是布局中最基本的用户界面(User Interface,UI)组件,通过设置view 的CSS属性可以实现各种复杂的布局。
通过<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: 1px solid #f00;flex-grow: 1;">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="border: 1px solid #f00; 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: 2;">3</view>
</view>
</view>
运行结果如下
4.2.2 scroll - view
通过设置cvroll-view组件的相关属性可以·实现滚动视图。
scroll - view组件属性
(1)在使用竖向滚动时,如果需要给scroll-view组件设置一个固定高度,可以通过
WXSS设置height来完成。
(2)请勿在scroll-view 组件中使用textarea、map、canvas、video组件。
(3)scroll -into-view 属性的优先级高于scroll-tops
(4)由于在使用scroll-view 组件时会阻止页面回弹,所以在scroll-view 组件液动时无
法触发onPullDownRefresh。
(5)如果要实现页面下拉刷新,请使用页面的滚动,而不是设置scroll-view组件。这
样做,能通过单击顶部状态栏回到页面顶部。
通过scroll - view 组件可以实现下拉刷新和上拉加载更多,代码如下:
<view class="container" style="padding: 0rpx;">
<scroll-view scroll-top="{{scrollTop}}" scroll-y="true" style="height: {{scrollHeight}}px;" class="list" bindscrolltolower="bindscrolltolower"
bindscrolltoupper="topLoad" bindscrolltoupper="scroll">
<view class="item" wx:for="{{list}}">
<image class="img" src="{{item.pic_url}}"/>
<view class="text">
<text class="title">{{item.name}}</text>
<text class="description">{{item.short_description}}</text>
</view>
</view>
</scroll-view>
<view class="body-view">
<loading hidden="{{hidden}}" bindchange="loadingChange">加载中...</loading>
</view>
</view>
var url="http://www.imooc.com/course/ajaxlist";
var page=0;
var page_size=5;
var sort="last";
var is_easy=0;
var lange_id=0;
var pos_id=0;
var unlearn=0;
var loadMore=function(that){
that.setData({
hidden:false
});
wx.request({
url: 'url',
data: {
page:page,
page_size:page_size,
sort:sort,
is_easy:is_easy,
lange_id:lange_id,
pos_id:pos_id,
unlearn:unlearn
},
succes:function(res){
//console.info(that.data.list);
var list=that.data.list;
for(var i=0;i<res.data.list.length;i++){
list.push(res.data.list[i]);
}
that.setData({
list:list
});
page++;
that.setData({
hidden:true
});
}
});
}
Page({
data:{
hidden:true,
listt:[],
scrollTop:0,
scrollHeight:0
},
onLoad:function(){
var that=this;
wx:wx.getSystemInfo({
success: function(res){
that.setData({
scrollHeight:res.windowHeight
});
}
});
loadMore(that);
},
bindDoenLond:function(){
var that=this;
loadMore(that);
console.log("lower");
},
scroll:function(event){
this.setData({
scrollTop:event.detail.scrollTop
});
},
topLoad:function(event){
page=0;
this.setData({
list:[],
scrollTop:0
});
loadMore(this);
console.log("lower");
}
})
.userinfo{
display: flex;
flex-direction: column;
align-items: center;
}
.userinfo-avatar{
width: 128rpx;
height: 128rpx;
margin: 20rpx;
border-radius: 50%;
}
.userinfo-nickname{
color: #aaa;
}
.usermotto{
margin-top: 200px;
}
scroll-view{
width: 100%;
}
.item{
width: 90%;
height: 300rpx;
margin: 20rpx auto;
background: brown;
overflow: hidden;
}
.item .img{
width: 430rpx;
margin-right: 20px;
float: left;
}
.title{
font-size: 30px;
display: block;
margin: 30rpx auto;
}
.description{
font-size: 26rpx;
line-height: 15rpx;
}
4.3 基础内容组件
基础内容组件包括icon、text和progress,主要用于在视图页面中展示图标,文本和进度条等信息。
4.3.1 icon
icon组件即图标组件,通常用于表示一种状态,如success、info、warn、waiting、cancel等。
icon组件属性
示例代码
.wxml
<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","waiting","cancel","download","search","clear"],
iconSize:[10,20,30,40],
iconColor:['#f00','#0f0','#00f']
}
})
运行结果
4.3.2 text
text 组件用于展示内容,类似HTML中的<span>,text组件中的内容支持长按选中,支持转义字符“\”,属于行内元素。
示例代码
.wxml
<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.4表单组件
表单组件的主要功能是收集用户信息,并将这些信息传递给后台服务器,实现小程序与用户之间的沟通。表单组件不仅可以放置在<form/>标签中使用,还可以作为单独组件和其他组件混合使用。
4.4.1 button
button组件用来实现用户和应用之间的交互,同时按钮的颜色起引导作用。一般来说,在一个程序中一个按钮至少有3种状态:默认点击(default)、建议点击(primary)、谨慎点击(warn)。在构建项目时,应在合适的场景使用合适的按钮,当<button>被<form/>包裹时,可以通过设置form-type 属性来触发表单对应的事件。
示例代码如下
.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="warn"bindtap='buttonLoading'loading="{{loading}}">改变loading</button>
.js
data:{
size:'default',
plain:'false',
loading:'false'
},
buttonSize:function(){
if(this.data.size == "default")
this.setData({size:'mini'})
else
this.setData({plain:!this.data.plain})
},
buttonLoading:function(){
this.setData({loading:!this.data.loading})
}
})
运行结果
4.4.2 radio
单选框用来从一组选项中选取一个选项。在小程序中,单选框由<radio-group/>(单项选择器)和<radio/>(单选项日)两个组件组合而成,一个包含多个<radio/>的<radio-group/>表示一组单选项,在同一组单选项中<radio/>是互斥的,当一个按钮被选中后,之前选中的按钮就变为非选。
示例代码如下
.wxml
<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}}</radio>
</label>
</radio-group>
<view>你的选择:{{lang}}</view>
.js
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/>表示一组选项,可以在一组逃项中选中多个选项。
示例代码
.wxml
<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
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,this.setData({city:city})
}
})
结果如下
4.4.4 picker
picker 组件为滚动选择器,当用户点击picker组件时,系统从底部弹出选择器供用户选择。picker 组件目前支持5种选择器,分别是:selector(普通选择器)、multiSelector(多列选择器)、time(时间选择器)、date(日期选择器)、region(省市选择器)。、、
1.普通选择器
普通选择器(mode=selector)的属性如下表所示。
示例如下
.wxml
<view>range为数组</view>
<picker range = "{{array}}"vaule="{{index1}}"bindchange='arrayChange'>
当前选择:{{array[index1]}}
</picker>
<view>range为数组对象</view>
<picker bindchange="objArrayChange" value="{{index2}}"range-key="name"range="{{objArray}}">
当前选择:{{objArray[index2].name}}
</picker>
.js
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({
index1:e.detail.value
})
},
objArraychange:function(e){
console.log('picker值变为','e.detail.value')
this.setData({
index2:e.datail.value
})
}
})
运行结果如下
2.多列表选择器
多列表选择器(mode=nultiSelector)允许用户从不同列中选择不同的选择项,其选择项是二维数组或数组对象。多列选择器的属性表如下
代码如下
.wxml
<view>多列选择器</view>
<picker mode="multiSelector" bindchange="bindMultiPickerChang" blindcolumnchange="bindMultiPickerColumnChang" value="{{multiIndex}}"
range="{{multiArray}}">
<view>
当前选择:{{multiArray[0][multiIndex[0]]}},{{multiArray[1][multiIndex[1]]}},{{multiArray[2][multiIndex[2]]}}
</view>
</picker>
//.js
data:{
multiArray:[['陕西省','广东省'],['西安市','汉中市','延安市'],['雁塔区','长安区']],
multiIndex:[0,0,0]
},
bindMultiPickerChang:function(e){
console.log('picker发送选择改变,携带值为',e.detail.value)
this.setData({
multiIndex:e.detail.value
})
},
bindMultiPickerColumnChang: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);
}
运行结果
4.4.5 input
input组件为输入框,用户可以输入相应的信息,其属性如表所示
示例代码如下
.wxml
<input placeholder="这是一个可以自动聚焦的input"auto-focus/>
<input placeholder="这个只有按钮点击的时候才聚焦"focus="{{focus}}"/>
<button bind:tap="bindButtonTap">使得输入框获取聚焦</button>
<input maxlength="10" placeholder="最大输入长度为10"/>
<view class ="section_title">你输入的是:{{inputValue}}
<input bindinput="bindKeyInput" placeholder="输入同步到view中"/></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
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
}
}
运行结果
4.5多媒体组件
多媒体组件包括image(图像)、audio(音频)、video(视频)、camera(相机)组件,
使用这些组件,可以让页面更具有吸引力。
4.5.1 image
image 组件为图像组件,与HTMI中的<img/>类似,系统默认 image 组件的宽度为
300 px、高度为2250 px,image 组件的属性如表所示。
image组件中的mode属性有13种模式,其中缩放模式有4种,裁剪模式有9种。
1.缩放模式
scaleToFill不保持纵横比缩放图片,使图片的宽高完全拉伸至填满image元素。
aspectFit保持纵横比缩放图片,使图片的长边能完全显示出来。也就是说,可以将图片完整地显示出来。
aspectFill保持纵横比缩放图片,只保证图片的短边能完全显示出来。也就是说,图片通常只在水平或垂直方向是完整的,在另一个方向将会发生截取。
widthFix宽度不变,高度自动变化,保持原图宽高比不变。
示例代码如下:
.wxml
<block wx:for="{{modes}}">
<view>当前图片的模式是:{{item}}</view>
<image mode="{{item}}" src="../image/IMG5.jpg" style="width: 100%,height:100%"/>
</block>
.js
data:{
modes:['scaleToFill','aspectFit','aspectFill','widthFix']
}
运行结果
第五章
5.1极速应用概述
5.1.1 极速应用的优势
即速应用是深圳市咫尺网络科技开发有限公司开发的一款同时兼具微信小程序和支付宝小程序快速开发能力的工具,用户只需简单拖拽可视化组件,就可以实现在线小程序开发。据不完全统计,在微信小程序正式发布的1年内,在即速应用上打包代码并成功上线的微信小程序已经超过5万个。
即速应用的功能特点主要体现在以下几个方面:
1.开发流程简单,零门槛制作
使用即速应用来开发微信小程序的过程非常简单,无须储备相关代码知识,没有开发经
验的人也可以轻松上手。
(1)登录即速应用的官方网站(www.jisuapp.cn),进入制作界面,从众多行业模板中
选择一个合适的模板。
(2).在模板的基础上进行简单编辑和个性化制作。
(3)制作完成后,将代码一键打包并下载。
(4)将代码上传至微信开发者工具。
(5)上传成功后,等待审核通过即可。
2.行业模板多样,种类齐全
即速应用为广大开发者提供了非常齐全的行业解决方案。目前,即速应用已经上线60多个小程序行业模板,涉及餐饮(单店版、多店版)、婚庆、旅游、运动、美容、房地产家居、医药、母婴、摄影、社区、酒店、KTV、汽车、资讯等多个行业。
这些小程序行业模板可以有效地帮助企业拓宽资源整合渠道,降低运营成本,提高管理效率。
3.丰富的功能组件和强大的管理后台
即速应用的功能组件和管理后台非常实用,可以根据实际情况解决商家的不同需求。例如,到店体系可以实现电子点餐、排队预约和线上快速结算;社区体系可以实现评论留言和话题管理;多商家系统可以实现分店统一管理、多门店统一运营;营销工具可以实现会员卡、优惠券的设置等营销方式……
目前,即速应用有4个版本,分别为基础版、高级版、尊享版和旗舰版。基础版为免费使用的版本,适合制作个人小程序,其他版本根据功能不同可以满是不同企业的需求。
即速应用的应用范围主要包括以下类型:
(1)资讯类:新闻、媒体。
(2)电商类:网购(服装、电器、读书、母婴.
(3)外卖类:餐饮及零售。
(4)到店类:餐饮及酒吧。
(5)预约类:酒店、KTV、家教、家政,其他服务行业。
5.1.2 极速应用界面介绍
登录即速应用官网,单击“注册”按钮,在如图5-1所示的页面填写相应信息,即可完成注册。完成注册后,即可登录账号,使用即速应用。即速应用的主界面主要分为4个区域,分别为菜单栏、工具栏、编辑区和属性面板。
2.工具栏
工具栏包括“页面管理”“组件库”2个选项卡,“页面管理”实现添加页面和添加分组以及对某一页面进行改名、收藏、复制、删除操作。“组件库”有9个基础组件、7个布局组件、18个高级组件和2个其他组件。
3.编辑区
编辑区是用来制作小程序页面的主要区域,通过拖拽组件实现页面制作,右边的“前进”“后退”选项可以进行恢复操作,“模板”选项可以用来选择模板,“元素”选项可以用来显示页面中的组件及其层次关系,“数据”选项可以用来进行页面数据管理,“模块”选项可以用来选择模块。
4.属性面板
属性面板用来设置选定组件的属性及样式,包括“组件”和“组件样式”两个选项卡。“组件”选项卡用来设置组件内容及点击事件;“组件样式”选项卡用来设置组件的样式,不同组件有不同的样式需要设置。
5.2 极速应用组件
即速应用提供了大量的组件供用户快速布局页面,包括7个布局组件、9个基本组件、18个高级组件和2个其他组件。
5.2.1 布局组件
布局组件用于设计页面布局,主要包括双栏、面板自由面板、顶部导航、底部导航、分割线和动态分类图5-3所示
1.双栏组件
1.双栏组件
双栏组件用来布局整体,它可以把一个区块分为两部分,操作时显示一个分隔的标志,便于操作,预览时则不会出现。双栏组件默认设置每个栏占50%总宽,也删动态分类可以按实际需要调整比例。双栏里面可以添加基本的组件,从而达到整体的布局效果。双栏还可以嵌套双栏,即可以在其中的一个栏里嵌入一个双栏,从而将整体分成3部分(若需要将整体分成4部分,就再嵌套一个双栏,依次类推)。双栏组件的属性面板如图5-4所示。
2.面板组件
面板组件相当于一个大画板,用户可以将很多基本(甚至高级)的组件(如文本组件、图片组件、按钮组件、标题组件、分类组件、音频组件、双栏组件、计数组件等)放进面板组件里一起管理。面板组件的属性面板如图5-5所示。
3.自由面板组件
自由面板组件是指放置在该面板内的组件可以自由拖动,调节组件大小。用户既可以向自由面板内拖入部分组件(包括文本组件、图片组件和按钮组件),也可以拖入任意相关容器组件。自由面板组件的属性面板。
4.顶部导航组件
顶部导航组件固定于页面顶部,用于编辑顶部的导航。常用的手机应用在顶部有一条导航,上面写有手机应用App的名称或 1ogo,以及返回键等。顶部导航组件的属性面板设置。
5.底部导航组件
底部导航组件固定于页面底部,用于编辑底部的导航。底部导航组件的属性面板设置
通过底部导航组件可以添加标签、删除标签,同时可以分别设置每个标签的名称、原始图片、点击图片及链接至某一页面;通过组件面板可以进行组件背景色、图片及文字的设置。底部导航组件的制作效果
第六章
6.1 网络API
微信小程序处理的数据通常从后台服务器获取,再将处理过的结果保存到后台服务器这就要求微信小程序要有与后台进行交互的能力。微信原生API接口或第三方API提供了各类接口实现前后互。
网络API可以帮助开发者实现网络URL访问调用、文件的上传和下载、网络套接字的使用等功能处理。微信开发团队提供了10个网络API接口。
- wx.request(Object)接口用于发起HTTPS请求。
- wx.uploadFile(Object)接口用于将本地资源上传到后台服务器。wx.downloadFile(Object)接口 用于下载文件资源到本地。wx.connectSocket(Object)接口 用于创建一个WebSocket 连接。
- wx.sendSocketMessage(Object)接口 用于实现通过WebSocket 连接发送数据。
- wx.closeSocket(Object)接口 用于关闭WebSocket 连接。
- wx.onSocketOpen(CallBack)接口 用于监听WebSocket连接打开事件。
- wx.onSocketError(CallBack)接口 用于监听 WebSocket 错误.
- wx.onSocketMessage(CallBack)接口 用于实现监听WebSocket 接收到服务器的消息
- 事件。
- wx.onSocketClose(CallBack)接口 用于实现监听WebSocket关闭。
6.1.1 发起网络请求
wx.request(Object)实现向服务器发送请求,获取数据等各种网络交互操作,其相关参数。一个微信小程序同时智能有五个网络请求连接,并且是HTTPS请求。
例如,通过wx.request(Object)获取百度(https://www.baidu.com)首页的数据。(需要在微信公众平台小程序服务器配置中的requcst合法域名中添加“htfps://www.baidu.com”。)示例代码如下:
.wxml
<buttontype="primary" bindtap = "getbaidutap">获取HTML数据</buttontype>
<textareavalue='{{html}}'auto-heightmaxlength='0'></textareavalue>
.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)获取百度(https://www.baidu.com)首页的数据。(需要在微信公众平台小程序服务器配置中的requcst合法域名中添加“htfps://www.baidu.com”。)示例代码如下:
.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:'',
error_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({
url: 'https://v.juhe.cn/postcode/query',
data:{
'postcode':postcode,
'key':'0ff9bfccdf147476e067de994eb5496e'
},
header:{
'Content-Type':'application/json',
},
method:'GET',
success:function(res){
wx.hideToast();
if(res.data.error_code==0){
console.log(res);
self.setData({
errMsg:'',
error_code:res.data.result.list
})
}
else{
self.setData({
errMsg:res.data.reason ||res.data.reason,
error_code:res.data.error_code
})
}
}
})
}
}
})
运行结果
例如,通过wx:request(Object)的POST方法获取邮政编码对应的地址信息。
示例代码如下:
.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:'',
error_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({
url: 'https://v.juhe.cn/postcode/query',
data:{
'postcode':postcode,
'key':'0ff9bfccdf147476e067de994eb5496e'
},
header:{
'Content-Type':'application/x-www-form-urlencoded',
},
method:'POST',
success:function(res){
wx.hideToast();
if(res.data.error_code==0){
console.log(res);
self.setData({
errMsg:'',
error_code:res.data.result.list
})
}
else{
self.setData({
errMsg:res.data.reason ||res.data.reason,
error_code:res.data.error_code
})
}
}
})
}
}
})
运行结果
6.1.2 上传文件
wx.uploadFile(Objecct)接口用于将本地资源上传到开发者服务器,并在客户端发起一个HTTPS POST请求。
通过wx.uploadFile(Object),可以将图片上传到服务器并显示。
代码如下
.wxml
<button type="primary"bindtap="uploadimage">上传图片</button>
<image src="{{img}}"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){
wx.showToast({
icon:"loading",
title:"正在上传"
}),
wx.uploadFile({
url:"http://localhost/",
filePath:path[0],
name:'file',
success:function(res){
console.log(res);
if(res.statusCode!=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(){
wx.hideToast();
}
})
}
}
})
运行结果
6.1.3下载文件
wx.downloadFile(Object)接口用于实现从开发者服务器下载文件资源到本地,在客户端
直接发起一个HTTP GET请求,返回文件的本地临时路径。
例如,通过wxdownloadFile(Object)实现从服务器中下载图片,后台服务采用WAMP
软件在本机搭建。
代码如下
.wxml
<button type="primary"bindtap='downloadimage'>下载图像</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',
success:function(res){
console.log(res)
that.setData({
img:res.tempFilePath
})
}
})
}
})
6.2 多媒体API
多媒体API主要包括图片API,录音API,音频播放控制API,音乐控制播放API等,其目的是丰富小程序的页面功能。
6.2.1 图片API
图片API实现对相机拍照图片或本地相册图片进行处理,主要包括以下4个API接口:
- wx.chooselmage(Object)接口 用于从本地相册选择图片或使用相机拍照。
- wx.previewlmage(Object)接口用于预览图片。
- wx.getlmagelnfo(Object)接口用于获取图片信息。
- wx. savelmageToPhotosAlbum(Object)接口 用于保存图片到系统相册。
1.选择图片或拍照
wx.chooselmage(Object)接口用于从本地相册选择图片或使用相机拍照。拍照时产生的临时路径在小程序本次启动期间可以正常使用,若要持久保存,则需要调用wx.saveFile保存图片到本地。其相关参数如表6-4所示。
若调用成功,则返回 tempFilePaths和tempFiles,templilePaths表示图片在本地临时文件
路径列表。tempFiles 表示图片的本地文件列表,包括path和size。
代码如下
.js
wx.chooseImage({
count:2,
sizeType:['original','compressed'],
sourceType:['album','camera'],
success:function(res){
var tempFilePaths = res.tempFilePaths
var tempFiles = res.tempFiles;
console.log(tempFilePaths)
console.log(tempFiles)
}
})
2.预览图片
wx.previewImage(Object)接口主要用于预览图片
代码如下
.js
wx.previewImage({
current:"http://bmob-cdn-164.88.b0.upaiyun.com/2018.02/05/2.png",
urls:["http://bmob-cdn-164.88.b0.upaiyun.com/2018.02/05/1.png",
"http://bmob-cdn-164.88.b0.upaiyun.com/2018.02/05/2.png",
"http://bmob-cdn-164.88.b0.upaiyun.com/2018.02/05/3.jpg",]
})
运行结果
6.2.3音频播放控制 API
音频播放控制 API主要用于对语音媒体文件的控制,包括播放、暂停、停止及audio组
件的控制,主要包括以下3个API
wx.playVoice(Object)接口 用于实现开始播放语音。
wx.pauseVoice(Object)接口 用于实现暂停正在播放的语音。
wx.stopVoice(Object)接口用于结束播放语音
1.播放语音
wx.playVoice(Object)接口用于开始播放语音,同时只允许一个语音文件播放,如果前
个语音文件还未播放完,则中断前一个语音文件的播放。
2.暂停播放
wx.pauseVoice(Object)用于暂停正在播放的语音。再次调用 wx.playVoice(Object))播放同一个文件时,会从暂停处开始播放。如果想从头开始播放,则需要先调用 wx.stopVoice(Object)。
3.结束播放
wx.stopVoice(Object)用于结束播放语音。
6.2.4音乐播放控制API
音乐播放控制 API主要用于实现对背景音乐的控制,音乐文件只能是网络流媒体,不能
是本地音乐文件。音乐播放控制API主要包括以下8个API:
- wx.playBackgroundAudio(Object)接口 用于播放音乐。
- wx.getBackgroundAudioPlayerState(Object)接口 用于获取音乐播放状态。
- wx.seekBackgroundAudio(Object)接口用于定位音乐播放进度
- wx.pauseBackgroundAudio()接口 用于实现暂停播放音乐。
- wx.stopBackgroundAudio()接口用于实现停止播放音乐
- wx.onBackgroundAudioPlay(CallBack)接口 用于实现监听音乐播放。
- wx.onBackgroundAudioPause(CallBack)接口 用于实现监听音乐暂停。
- wx.onBackgroundAudioStop(CallBack)接口用于实现监听音乐停止。
1.播放音乐
wx.playBackgroundAudio(Object)用于播放音乐,同一时间只能有一首音乐处于播放状态
2.获取音乐播放状态
wx.getBackgroundAudioPlayerState(Object)接口用于获取音乐播放状态
3.控制音乐播放进度
wx.seekBackground Audio(Object)接口用于控制音乐播放进度,其相关参数如表6-13所示
4.暂停播放音乐
wx.pauseBackgroundAudio()接口用于暂停播放音乐。
5.停止播放音乐
wx.stopBackgroundAudio()接口用于停止播放音乐。
6.监听音乐播放器
wx.onBackgroundAudioPlay(CallBack)接口用于实现监听音乐播放,通常被 wx. playBack-
plindAudio(Object)方法触发,在CallBack中可改变播放图标。
7.监听音乐暂停
wx.onBackgroundAudioPause(CallBack)接口用于实现监听音乐暂停,通常被wx.pause BackgroundAudio()方法触发。在CallBack中可以改变播放图标。
8.监听音乐停止
wx.onBackgroundAudioStop(CallBack)接口用于实现监听音乐停止,通常被音乐自然播放停止或wx. seekBackgroundAudio(Object)方法导致播放位置等于音乐总时长时触发。在CallBack中可以改变播放图标。
9.案例展示
在此,以小程序 music 为案例来展示音乐API的使用。该小程序的4个页面文件分别为music. wxml、music. wxss、music.json和 music.cojs。实际效果如图6-5所示。
.wxml
<view class="container">
<image class="bgaudio"src = "{{changedImg? music.coverImg:'../image/test4.jpg'}}"/>
<view class ="control-view">
<image src ="../image/test2.jpg"bindtap="onPositionTap"data-how= "0 "/>
<image src = "../image/test5.jpg{{isPlaying?'pause':'play'}} " bindtap = "onAudioTap"/>
<image src ="../image/test1.jpg"bindtap = "onStopTap"/>
<image src ="../image/test3.jpg"bindtap ="onPositionTap"data-how = "1"/>
</view >
</view >
.js
Page({
data:{
isPlaying:false,
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{
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(){
that.setData({ isPlaying:false,changedImg:false});
}
})
},
onPositionTap:function(event){
let how = event.target.dataset.how;
wx.getBackgroundAudioPlayerState({
success:function(res){
let status = res.status;
if(status === 1){
let duration = res.duration;
let currentPosition = res.currentPosition;
if(how ==="0"){
let position = currentPosition - 10;
if(position <0){
position =1;
}
wx.seekBackgroundAudio({
position: position
});
wx. showToast({title:"快退10s",duration:500});
}
if(how === "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(){
that.setData({ isPlaying:true,changedImg:true});
console.log("on play");
});
wx.onBackgroundAudioPause(function(){
that.setData({isPlaying:false});
console.log("on pause");
});
wx.onBackgroundAudioStop(function(){
that.setData({isPlaying:false,changedImg:false});
console.log("on stop");
});
}
})
.wxss
.bgaudio{
height:350rpx; width:350rpx;
margin-bottom:100rpx;
}
.control-view image{
height:64rpx;
width:64rpx;
margin:30rpx;
}
运行结果
6.3 本地数据及缓存API
小程序提供了以键值对的形式进行本地数据缓存功能,并且是永久存储的,但最大不
过10MB,其目的是提高加载速度。数据缓存的接口主要有4个:
wx.setStorage(Object)或wx.setStorageSync(key,data)接口用于设置缓存数据
wx. getStorage(Object)或wx.getStorageSync(key)接口用于获取缓存数据。
wx.removeStorage(Object)或wx.removeStorageSync(key)接口用于删除指定缓有数据。
wx.clearStorage()或wx. clearStorageSync()接口用于清除缓存数据。其中,带Sync后级的为同步接口,不带Sync后级的为异步接口。
6.4.1 保留数据
1. wx. setStorage(Object)
wx. setStorage(Object)接口将数据存储到本地缓存接口指定的key中,接口执行后会覆盖原来key对应的内容
.js
wx.setStorage({
key:'name',
data:'sdy',
success:function(res){
console.log(res)
}
})