一到六总结

第一章  微信小程序概述
1.1   认识微信小程序
简介:微信(WeChat)是腾讯公司于2011年1月21日推出的一款为智能终端提供即时通信服务的应用程序,于2017年1月上线。

优势:1. 无需安装   2. 触手可及   3. 用完即走   4. 无需卸载

应用场景特点:简单的业务逻辑     使用频率低

1.2    微信小程序开发流程
微信小程序开发流程为:第1步,在微信公众平台上注册小程序账号;第2步,下载开发者工具进行编码;第3步,通过开发者工具提交代码,待通过审核后便可以发布。

1.3   微信小程序开发者工具界面功能介绍
我们把微信小程序开发者工具界面划分五大区域:工具栏、模拟区、目录文件区、编辑区和调试区

调试功能模块则分为以下10类:
Console 面板:调试,便于排查错误
Sources 面板:显示源文件目录结构
Network面板:观察和显示网络请求reauest和 socket等网络相关的详细信息
Security面板:调试当前网页的安全和认证等问题
Storage 面板:数据存储信息页
AppData面板:实时数据信息页,显示项目中被激活的所有页面的数据情况
Wxml面板 :布局信息页,调试Wxml 组件和相关CSS样式,显示Wxml转的界面
Sensor面板:重力传感器信息页,在这里选择模拟地理位置来模拟杉动设备用于调试重力感应API
Trace 面板:路由追踪信息页,追踪连接到电脑中的安卓(Android) 设备的路由信息
扩展菜单栏:“:”主要包括开发工具的一些定制与设置,在这里设置相关信息
第二章    微信小程序开发基础
2.1   小程序的基本目录结构
主体文件:
app.js           逻辑文件,主要用来注册小程序全局实例,在编译时,app.js文件会和其他页面的逻辑文件打包成一个JavaScript文件。
app.json       公共设置文件,配置小程序全局设置。
app.wxss      主样式表文件,类似HTML的.css文件。
页面文件:
.js文件            页面逻辑文件,编写JavaScript代码控制页面
.wxml文件      页面结构文件,设计页面布局,数据绑定
.wxss文件      页面样式表文件,定义各类样式表
.json文件        页面配置文件
2.2   小程序的开发框架
视图层:由WXML和WXSS编写,组件进行展示。

逻辑层:用于处理事务逻辑。

数据层:1.页面临时数据或缓存   2.文件存储(本地存储)  3.网络存储与调用

2.3   创建小程序页面
第一种方法:启动微信开发者工具,创建新的项目demo2,此处不勾选“创建QuickStart”复选框,单击“确定”按钮后,可以看到开发者工具中的“目录结构”界面只显示项目配置文件,同时(app.js、app.json和app.wxss)在项目的主目录下建立,继续在项目主目录下新建一个pages目录,在此目录下新建一个index目录,并新建index.js、index.json、index.wxml和index.wxss空文件。

2.4   配置文件

全局配置文件

小程序的全局配置保存在全局配置文件(app.json)中,使用全局配置文件来配置页面文件(pages)的路径,设置窗口(window)表现,设定网络请求API的超时(networkTimeout)以及配置多个切换页(tabBar)等。

1.   pages配置项
pages 配置项接受一个数组,用来指定小程序由哪些页面组成,数组的每一项都是字符串,代表对应页面的“路径”+“文件名”。pages 配置项是必填项。
设置 pages 配置项时应注意以下3 点:

数组的第一项用于设定小程序的初始页面
在小程序中新增或减少页面时,都需要对数组进行修改。
文件名不需要写文件扩展名。小程序框架会自动寻找路径及对.jsjson.wxml和.wxss 文件进行整合数据绑定。
2.   window配置项
window配置项负责设置小程序状态栏、导航条、标题、窗口背景色等系统样式

  debug配置项
debug配置项用于开启开发者工具的调试模式,默认为false。开启后,页面的注册、路由、数据更新、事件触发等调试信息将以info的形式输出到Console(控制台)面板上。

页面配置文件
页面配置文件(*.json)只能设置本页面的窗口表现,而且只能设置window配置项的内容。在配置页面配置文件后,页面中的window配置值将覆盖全局配置文件(app.json)中的配置值   逻辑层文件
项目逻辑文件
项目逻辑文件app.js中可以通过App()函数注册小程序生命周期函数、全局属性和全局方法,已注册的小程序实例可以在其他页面逻辑文件中通过getApp()获取。

定义当前页面的生命周期函数
在Page()函数的参数中,可以定义当前页面的生命周期函数。页面的生命周期函数主要有onLoad、onShow、onReady、onHide、onUnload。

onLoad  页面加载函数。当页面加载完成后调用该函数。一个页面只会调用一次。该函数的参数可以获取wx.navigateTo和 wx.redirectTo及<navigator/>中的query。
onShow  页面显示函数。当页面显示时调用该函数。每次打开页面都会调用一次。
onReady 页面数据绑定函数。当页面初次数据绑定完成时调用该函数。一个页面只会调用一次,代表页面已经准备就绪,可以和视图层进行交互。
onHide 页面隐藏函数。当页面隐藏时及当navigateTo或小程序底部进行tab切换时,
调用该函数。
onUnload  页面卸载函数。当页面卸载、进行navigateBack或redirectTo操作时,调用该函数。
3.定义事件处理函数
开发者在Page()中自定义的函数称为事件处理函数。视图层可以在组件中加人事件定,当达到触发事件时,小程序就会执行Page()中定义的事件处理函数。

4.使用setData跟新数据
小程序在Page对象中封装了一个名为setData()的函数,用来更新data中的数据。函数参数为Object,以“key:value”对的形式表示将this.data 中的key对应的值修改为value。

2.6   页面文件结构
页面结构文件(WXML)是框架设计的一套类似HTML的标签语言,结合基础组件、事件系统,可以构建出页面的结构,即.wxml 文件。在小程序中,类似HTML的标签被称为组件,是页面结构文件的基本组成单元。这些组件有开始(如<view>)和结束(如</view>) 标志,每个组件可以设置不同的属性(如id、class等),组件还可以嵌套。
WXML还具有数据绑定、条件数据绑定、列表数据绑定、模板、引用页面文件、页面事件等能力。

数据绑定
小程序在进行页面数据绑定时,框架会将WXML文件与逻辑文件中的data进行动态绑定,在页面中显示data中的数据。小程序的数据绑定使用Mustache语法()将变量或运算规则包起来。

1. 简单绑定
简单绑定是指使用双大括号({{}})将变量包起来,在页面中直接作为字符串输出使用。
简单绑定可以作用于内容、组件属性、控制属性等的输出。

【注意】
简单绑定作用于组件属性、控制属性时,双大括号外应添加双引号。

2.运算
在{{}}内可以做一些简单的运算(主要有算术运算、逻辑运算、三元运算、字符串运算等),这些运算均应符合JavaScript 运算规则。

条件数据绑定
条件数据绑定就是根据绑定表达式的逻辑值来判断是否数据绑定当前组件。

1.   wx:if条件数据绑定
wx:if条件数据绑定是指使用wx:if这个属性来判断是否数据绑定当前组件。

<view  wx:if="{ {conditon}}">内容</view>

<view w×:if="{{x>0}}">1</view>

<view wx:elif="{{×==0}}">0</view >

<view wx:else>-1</view> 
在以上代码中,当x的值大于0时,输出1;当x的值等于0时,输出0;否则,输出-1。

2.   block  wx:if条件数据绑定
当需要通过一个表达式去控制多个组件时,可以通过<block>将多个组件包起来,然后在<block>中添加wx:if属性即可。

列表数据绑定
列表数据绑定用于将列表中的各项数据进行重复数据绑定。

1.    wx:for
在组件上,可以使用wx:for控制属性绑定一个数组,将数据中的各项数据循环进行数据绑定到该组件,格式如下: 
<view wx:for =”{{items}}”> 
{{index}}:{{item }}
</view> 

2.    block  wx:for
与block wx:if类似,在wxml中也可以使用<block>包装多个组件进行列表数据绑定。

模板
在小程序中,如果要经常使用几个组件的组合(如“登录”选项),通常把这几个组件
结合定义为一个模板,以后在需要的文件中直接使用这个模板。

1.定义模板
模板代码由wxml组成,因此其定义也是在wxml 文件中,定义模板的格式为: 
<template name="模板名">

2.调用模板
将模板定义后,就可以对其进行调用了。调用模板的格式为: 
<template is="模板名称"data=="{{传入的数据}}"/> 
其中,<template>为模板标签;is属性用于指定要调用的模板名称;data属性定义要传
人的数据,如果模板中不需要传入数据,data属性可以省略.

引用页面文件
在WXML文件中,不仅可以引用模板文件,还可以引用普通的页面文件。WXML提供了两种方式来引用其他页面文件。

1.  import方式
如果在要引用的文件中定义了模板代码,则需要用import方式引用。

2.  include方式
include方式可以将源文件中除模板之外的其他代码全部引人,相当于将源文件中的代码
复制到include 所在位置。

页面事件
简单来说,小程序中的事件是用户的一种行为或通信方式。在页面文件中,通过定义事件来完成页面与用户之间的交互,同时通过事件来实现视图层与逻辑层的通信。我们可以将事件绑定到组件上,当达到触发条件时,事件就会执行逻辑层中对应的事件处理函数。要实现这种机制,需要定义事件函数和调用事件。

定义事件函数在.js文件中定义事件函数来实现相关功能,当事件响应后就会执行事件处理代码。
调用事件调用事件也称为注册事件。

调用事件就是告诉小程序要监听哪个组件的什么事件,通常在页面文件中的组件上注册事件。事件的注册(同组件属性),以"key =value" 形式出现,key (属性名)以 bind 或catch开头,再加上事件类型,如bindtap、catchlongtap。其中,bind开头的事件绑定不会阻止冒泡事件向上冒泡,catch开头的事件绑定可以阻止冒泡事件向上冒泡。

小程序中,事件分为冒泡事件和非冒泡事件两大类型。
冒泡事件是指某个组件上的事件被触发后,事件会向父级元素传递,父
级元素再向其父级元素传递,一直到页面的顶级元素。
非冒泡事件是指某个组件上的事件被触发后,该事件不会向父节点传递。

页面样式文件
页面样式文件(WxSS)是基于Css拓展的样式语言,用于描述WXML,的组成样式,决定WXML的组件如何显示。WXSS具有CSS的大部分特性,小程序对Wxss做了一些扩充和修改。

1尺寸单位
由于CSS原有的尺寸单位在不同尺寸的屏幕中得不到很好的呈现,WXSS在此基础上增加了尺寸单位rpx (respnesive pixel)。WXSS规定屏幕宽度为750 rpx,在系统数据绑定过程中rpx会按比例转化为px。

2样式导入
为了便于管理WXSS文件,我们可以将样式存放于不同的文件中。如果需要在某个文件
中引用另一个样式文件,使用@ import语句导人即可。

3选择器
目前,WXSS仅支持CSS中常用的选择器,如.class、#id、element、:.before、:aftert等。

4WXSS常用属性

第三章
盒子模型 
介绍:小程序页面中的元素布局模型,类似于网页中的盒子模型。它由四个基本属性组成:内容(content)、填充(padding)、边框(border)和边距(margin)。

内容(content):指的是元素中实际的内容,比如文字、图片等。内容的宽度和高度可以通过设置元素的width和height属性来确定。

填充(padding):指的是内容与边框之间的空白区域。填充可以通过设置元素的padding属性来确定。padding属性可以同时设置上、右、下、左四个方向的填充值,也可以分别设置每个方向的填充值。

边框(border):指的是内容周围的边界。边框可以通过设置元素的border属性来确定。border属性可以同时设置边框的宽度、样式和颜色。

边距(margin):指的是元素与其他元素之间的空白区域。边距可以通过设置元素的margin属性来确定。margin属性可以同时设置上、右、下、左四个方向的边距值,也可以分别设置每个方向的边距值。

 块级元素与行内元素
行内元素
介绍

行内元素,不必从新一行开始,通常会与前后的其他行内元素显示在同一行中,它们不占有独立的区域,仅靠自身内容支撑结构,一般不可以设置大小,常用于控制页面中文本的样式。将一个元素的 display 属性设置为 imline 后,该元素即被设置为行内元素。

行内元素的特点

(1)行内元素不能被设置高度和宽度,其高度和宽度由内容决定,

(2)行内元素内不能放置块级元素,只级容纳文本或其他行内元素

(3)同一块内,行内元素和其他行内元素显示在同一行。

块级元素 
介绍
块级元素默认占一行高度,一行内通常只有一个块级元素(浮动后除外),添加新级元素时,会自动换行,块级元素一般作为盒子出现。

块级元素的特点
(1)一个块级元素占一行。
(2)块级元素的默认高度由内容决定,除非自定义高度。
(3)块级元素的默认宽度是父级元素的内容区宽度,除非自定义宽度
(4)块级元素的宽度、高度、外边距及内边距都可以自定义设置。
(5)块级元素可以容纳块级元素和行内元素

 浮动
元素浮动就是指设置了浮动属性的元素会脱离标准文档流的控制,移到其父元素中指定位置的过程。在CSS中,通过foat属性来定义浮动

其中,none--默认值,表示元素不浮动;
lef--元素向左浮动;
right--元素向右浮动。

 清除浮动


由于浮动元素不再古用原文档流的位置,因此它会对页面中其他元素的。通过清除浮动来解决。在Css 中,cear 属性用于清除浮动元素对其他元素的影响

清除浮动方式


其中,lef--清除左边浮动的影响,也就是不允许左侧有浮动元素night--清除右边浮动的影响,也就是不允许右侧有浮动元素:
both--同时清除左右两侧浮动的影响:
none--不清除浮动

​
<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;">box3</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>
 
​​
<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;">box3</view>
</view>
 
​
​
元素定位

浮动布局虽然灵活,但无法对元素的位置进行精确的控制。在CSS中,通过positon属性可以实现对页面元素的精确定位。基本格式如下:

position:staticlrelative labsolute lfixed

定位方法

其中,static--默认值,该元素按照标准流进行布局:
relative--相对定位,相对于它在原文档流的位置进行定位,它后面的盒子仍以标准流方式对待它;
absolute--绝对定位,相对于其上一个已经定位的父元素进行定位,绝对定位的盒子从标准流中脱离,它对其后的兄弟盒子的定位没有影响;
fixed--固定定位,相对于浏览器窗口进行定位。

示例代码如下
定位方法

其中,static--默认值,该元素按照标准流进行布局:
relative--相对定位,相对于它在原文档流的位置进行定位,它后面的盒子仍以标准流方式对待它;
absolute--绝对定位,相对于其上一个已经定位的父元素进行定位,绝对定位的盒子从标准流中脱离,它对其后的兄弟盒子的定位没有影响;
fixed--固定定位,相对于浏览器窗口进行定位。

flex布局
 flex布局
介绍
flex 布局是万维网联盟(WoeldWideWebConsortium,W3C) 在2009 年提出的一种新布局方案, 该布局可以简单快速地完成各种可以伸缩的设计, 以便很好地支持响应式布局。flex 是flexiblebox 的缩写, 意为弹性盒子模型, 可以简便、完整、响应式地实现各种页面布局。

布局 
flex 布局主要由容器和项目组成, 采用flex 布局的元素称为flex容器(flexcontainer),flex 布局的所有直接子元素自动成为容器的成员, 称为flex项目(flexitem)。

容器默认存在两根轴: 水平的主轴和垂直的交叉轴。 主轴的开始位置(与边框的交叉点) 叫做mainstart, 结束位置叫做mained; 交叉轴的开始位置叫做crosstart, 结束位置叫做crossend。 项目默认沿主轴排列。 单个项目占据的主轴空间叫做mainsize, 占据的交叉轴空间叫做crossize。

flex———块级flex布局, 该元素变为弹性盒子;

inline-flex———行内flex 布局, 行内容器符合行内元素的特征, 同时在容器内又符合flex 布局规范。 

设置了flex布局之后, 子元素的float、clear 和vertical-align属性将失效。

(2)flex-direction
用于设置主轴的方向, 即项目排列的方向, 语法格式为:

.box{flex-direction:row|row-reverse|column|column-reverse;}

row———主轴为水平方向, 起点在左端, 当元素设置为 flex布局时, 主轴默认为row;

row-reverse———主轴为水平方向, 起点在右端; 

column———主轴为垂直方向, 起点在顶端;

column-reverse———主轴为垂直方向, 起点在底端

(3)flex-wrap
用来指定项目在一根轴线的排列位置不够时,项目是否换行,其语法格式为:

.box{flex-wrap:nowrap|wrap|wrap-reverse;}

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="cont">
<view class="item">1</view>
<view class="item item2">2</view>
<view class="item item3">3</view>
<view class="item item4">4</view>
</view>
.clear-float::after {display:black;clear:both;height:0;content:""}
.cont{
  display: flex;
  border: 1px solid #f00;
  height: 100px;
  width: 50px;
  margin: 2px;
}
.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;
}

本章小结


本章首先介绍了页面布局中最基本的盒子模型,接下来介绍了浮动和定位,最后重点讲解了 fex 布局的基本原理、容器和项目的相关属性。大家学好这些内容,可为小程序项目的布局打下良好的基础。, 如果没有父元素, 则等于stretch (默认值)。

第四章
 页面组件
4.1组件的定义及属性
        组件是页面视图层(WXML)的基本组成单元,组件组合可以构建功能强大的页面结构。小程序框架为开发者提供了容器视图、基础内容、表单、导航、多媒体、地图、画布开放能力等8类(30多个)基础组件。

        每一个组件都由一对标签组成,有开始标签和结束标签,内容放置在开始标签和结束标签之间,内容也可以是组件。组件的语法格式如下:

<标签名 属性名=”属性值”>内容…</标签名>
        组件通过属性来进一步细化。不同的组件可以有不同的属性,但它们也有一些共用属性,如id、class、style、hidden、data-*、bind */catch *等  

        1.id 组件的唯一表示,保持整个页面唯一,不常用

        2. class 组件的样式类,对应 WXSS 中定义的样式

        3.  style 组件的内联样式,可以动态设置内联样式

        4. hidden 组件是否显示,所有组件默认显示

        5. data-*自定义属性,组件触发事件时,会发送给事件处理函数。事件处理函数可
以通过传人参数对象的 currentTarget,dataset 方式来获取自定义属性的值

        6. bind*/catch* 组件的事件,绑定逻辑层相关事件处理函数

4.2 容器视图组件
        容器视图组件是能容纳其他组件的组件,是构建小程序页面布局的基础组件,主要包括view、scroll-view和swiper 组件。

4.2.1 View
        view组件是块级组件,没有特殊功能,主要用于布局展示,相当于HTML中的div,是布局中最基本的用户界面(User Interface,UI)组件,通过设置view的CSS属性可以实现各种复杂的布局。

<!-- 4.2.1 wxml文件-->
<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: 1;">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-grow: 1;flex-direction: column;">
    <view style="border: 1px solid #f00;flex-grow: 1;">2</view>
    <view style="border: 1px solid #f00;flex-grow: 2;">3</view>
  </view>
</view>

 (1)在使用竖向滚动时,如果需要给scroll-view组件设置一个固定高度,可以通过WXSS设置height来完成。

        (2)请勿在scroll-view组件中使用 textarea、map、canvas、video 组件。

        (3)scroll-into-view属性的优先级高于scroll -top。

        (4)由于在使用scroll-view组件时会阻止页面回弹,所以在scroll-view 组件滚动时无法触发onPullDownRefresh。

        (5)如果要实现页面下拉刷新,请使用页面的滚动,而不是设置scroll-view 组件。这样做,能通过单击顶部状态栏回到页面顶部。

通过serol-view 组件可以实现下拉刷新和上拉加载更多,代码如下:

<!-- 4.2.2 wxml文件-->
<view class="container" style="padding: 0rpx;">
<!-- 垂直滚动,这里必须设置高度 -->
  <scroll-view scroll-top="{{scrollTop}}"scroll-y="true" style="height: {{scrollHeight}}px;" class="list" bind-scrolltolower="bindDownLoad" bindscrolltoupper="topLoad" bindscroll="scroll">
    <view class="item" wx:for="{{list}}">
      <image class="img" src="{{item.pic_url}}"></image>
      <view class="text">
       <text class="title">{{item.name}}</text>
       <text class="description">{{item.short_description}}</text>
      </view>
    </view>
  </scroll-view>
  <view class="body-view">
    <losding hidden="{{hidden}}" bindchange="loadingChange">
      加载中……
    </losding>
  </view>
</view>
// 4.2.2 js文件
var url = "http://www.imooc.com/course/ajaxlist";
var page = 0;
var page_size = 5;
var sort = "last";
var is_easy = 0;
var lang_id = 0;
var pos_id = 0;
var unlearn = 0;
//请求数据
var losdMore = function(that){
  that.setData({
    hidden:false
  });
  wx.request({
    url: 'url',
    data:{
      page:page,
      page_size:page_size,
      sort:sort,
      is_easy:is_easy,
      lang_id:lang_id,
      pos_id:pos_id,
      unlearn:unlearn
    },
    success:function(res){
      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,
   list:[],
   scrollTop:0,
   scrollHeigt:0
 },
 onLoad:function(){
   //这里要注意,微信的scroll-view必须设置高度才能监听滚动事件,所以需要在页面的onLoad事件中为scroll-view的高度赋值
   var that = this;
   wx.getSystemInfo({
     success:function(res){
       that.setData({
         scrollHeigt:res.windowHeight
       });
     }
   });
   loadMore(that);
 },
 //页面滑动到底部
 bindDownLoad:function(){
   var that = this;
   loadMore(that);
   console.log("lower");
 },
 scroll:function(event){
   //该方法绑定了页面滚动时的事件,这里记录了当前的position.y的值,为了在请求数据后把页面定位到这里
   this.setData({
     scrollTop:event.detail.scrollTop
   });
 },
 topLoad:function(event){
   //该方法绑定了页面滑动到顶部的时间,然后做页面上拉刷新
   page = 0;
   this.setData({
     list:[],
     scrollTop:0
   });
   loadMore(this);
   console.log("lower");
 }
}) 
/* 4.2.2 wxss文件*/
.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: 20rpx;
  float: left;
}
.title{
  font-size: 30rpx;
  display: block;
  margin: 30rpx auto;
}
.description{
  font-size: 26rpx;
  line-height: 15rpx;
}

4.2.3 Swiper
        swiper组件可以实现轮播图、图片预览、滑动页面等效果。一个完整的swiper 组件由<swiper/>和<swiper-item/>两个标签组成,它们不能单独使用。<swiper/>中只能放置-个或多个<swiper-item/>,若放置其他组件则会被删除;<swiper-item/>内部可以放置任何组件,默认宽高自动设置为100%。

text

        text 组件用于展示内容,类似HTML中的<span >,text 组件中的内容支持长按选中,支持转义字符“\”,属于行内元素。text组件的属性如表所示。

示例代码如下:

<!-- 4.3.2 wxml文件 -->
<block wx:for="{{x}}" wx:for-item="x">
  <view class="aa">
    <block wx:for = "{{1-x}}" wx:for-item="x">
      <text decode = "{{true}}" space="{{true}}">
        &nbsp;
      </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="{{-5+x}}" wx:for-item="x">
      <text decode="{{true}}" space="{{true}}">
        &nbsp;
      </text>
    </block>
    <block wx:for="{{y}}" wx:for-item="y">
      <block wx:if="{{y<=11-2*x}}">
       <text>*</text>
      </block>
    </block>
  </view>
</block>

 表单组件

        表单组件的主要功能是收集用户信息,并将这些信息传递给后台服务器,实现小程序与用户之间的沟通。表单组件不仅可以放置在<form/>标签中使用,还可以作为单独组件和其他组件混合使用。

 button
        button 组件用来实现用户和应用之间的交互,同时按钮的颜色起引导作用。一般来说
在一个程序中一个按钮至少有3种状态:默认点击(default)、建议点击(primary)、谨慎点击(warn)。在构建项目时,应在合适的场景使用合适的按钮,当<buton>被<form/>包裹时,可以通过设置form-type 属性来触发表单对应的事件。

<!-- 4.4.1 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>
//4.4.1 js文件
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})
},
//是否显示loading图案
buttonLoading:function(){
  this.setData({loading:!this.data.loading})
}
省市选择器

        省市选择器(mode=region)是小程序的新版本提供的选择快速地区的组件

<!-- 省市选择器 wxml文件 -->
<picker 
mode="region"
value="{{region}}"
custom-item="{{custom-item}}"
bindchange="changeregion">
选择省市区{{region[0]}},{{region[1]}},{{region[2]}}
</picker>
// 省市选择器 js文件
  data:{
    region:['陕西省','西安市','长安区'],
    customitme:'全部'
  },
  changeregion:function(e){
    console.log(e.detail.value)
    this.setData({
      region:e.detail.value
    })
  },
picker-view

        picker-view  组件为嵌入页面的滚动选择器。 相对于picker 组件, picker-view  组件的列的个数和列的内容由用户通过< picker-view  -column/ > 自定义设置

<!-- picker-view wxml文件 -->
<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> 

// 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:[118,0,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]]
    })
  }
})

多媒体组件
        多媒体组件包括image (图像)、audio (音频)、video(视频)、camera (相机) 组件,使用这些组件, 可以让页面更具有吸引力

4.5.1 image
         image 组件为图像组件, 与HTML中的< img/ > 类似, 系统默认image 组件的宽度为300px、高度为2250px,image组件的属性如表:

  image组件中的mode 属性有13 种模式, 其中缩放模式有4 种, 裁剪模式有9 种

1.缩放模式
(1)scaleToFill
不保持纵横比缩放图片, 使图片的宽高完全拉伸至填满image 元素。

(2)aspectFit
保持纵横比缩放图片, 使图片的长边能完全显示出来。 也就是说, 可以将图片完整地显示出来。

(3)aspectFill  
保持纵横比缩放图片, 只保证图片的短边能完全显示出来。 也就是说,图片通常只在水平或垂直方向是完整的, 在另一个方向将会发生截取。

(4)widthFix
宽度不变, 高度自动变化, 保持原图宽高比不变

示例代码如下:

<!-- image缩放 wxml文件 -->
<block wx:for="{{modes}}">
<view>当前图片的模式是:{{item}}</view>
<image mode="{{item}}"src="../../img/玉猪大帝.jpg"style="width:100%,height:100%"/>
</block>
// image缩放 js文件
  data:{
    modes:['scaleToFill','aspectFit','aspectFill','widthFix']
  }

.剪裁模式
(1)top
不缩放图片, 只显示图片的顶部区域。

(2) bottom
不缩放图片, 只显示图片的底部区域。

(3) center
不缩放图片, 只显示图片的中间区域。

(4)left
不缩放图片, 只显示图片的左边区域。

(5) right
不缩放图片, 只显示图片的右边区域。

(6)top-left
不缩放图片, 只显示图片的左上边区域。

(7) top-right
不缩放图片, 只显示图片的右上边区域。

(8)bottom-right
不缩放图片, 只显示图片的左下边区域

示例代码如下:

<!-- image剪裁 wxml文件 -->
<block wx:for="{{modes}}">
<view>当前图片的模式是:{{item}}</view>
<image mode="{{item}}"src="../../img/玉猪大帝.jpg"style="width:100%,height:100%"></image>
</block>

第五章

即速应用概况
即速应用的优势
    即速应用是深圳市咫尺网络科技开发有限公司开发的一款同时兼具微信小程序和支付宝小程序快速开发能力的工具,用户只需简单拖拽可视化组件,就可以实现在线小程序开发。据不完全统计,在微信小程序正式发布的1年内,在即速应用上打包代码并成功上线的微信小程序已经超过5万个。

即速应用的功能特点主要体现在以下几个方面:

1.开发流程简单,零门槛制作
使用即速应用来开发微信小程序的过程非常简单, 无须储备相关代码知识, 没有开发经验的人也可以轻松上手。

(1) 登录即速应用的官方网站(www.jisuapp.cn), 进入制作界面, 从众多行业模板中选择一个合适的模板。

(2) 在模板的基础上进行简单编辑和个性化制作。

(3) 制作完成后, 将代码一键打包并下载。

(4) 将代码上传至微信开发者工具。

(5) 上传成功后, 等待审核通过即可。

2.行业模板多样,种类齐全
即速应用为广大开发者提供了非常齐全的行业解决方案。 目前, 即速应用已经上线60多个小程序行业模板, 涉及餐饮(单店版、多店版)、婚庆、旅游、运动、美容、房地产、家居、医药、母婴、摄影、社区、酒店、KTV、汽车、资讯等多个行业。

这些小程序行业模板可以有效地帮助企业拓宽资源整合渠道, 降低运营成本, 提高管理效率。

3.丰富的功能组件和强大的管理后台
即速应用的功能组件和管理后台非常实用, 可以根据实际情况解决商家的不同需求。目前, 即速应用有4个版本,分别为基础版、高级版、尊享版和旗舰版。基础版为免费使用的版本,适合制作个人小程序,其他版本根据功能不同可以满足不同企业的需求。

即速应用的应用范围主要包括以下类型:

(1) 资讯类: 新闻、媒体。

(2) 电商类: 网购(服装、电器、读书、母婴……)。

(3) 外卖类: 餐饮及零售。

(4) 到店类: 餐饮及酒吧。

(5) 预约类: 酒店、KTV、家教、家政, 其他服务行业。

即速应用界面介绍
登录即速应用官网, 单击“注册”按钮, 在如图所示的页面填写相应信息,即可完成注册。完成注册后,即可登录账号, 使用即速应用。

即速应用的主界面主要分为4个区域, 分别为菜单栏、工具栏、编辑区和属性面板

1.菜单栏
    菜单栏中的“风格”选项用于设置小程序页面的风格颜色, “管理”选项用于进入后台管理页面, “帮助”选项用于提示帮助功能, “客服”选项用于进入客服界面, “历史”选项用来恢复前项操作,“预览”选项用在PC端预览制作效果,“保存”选项用于保存已制作的内容,“生成”选项用于实现小程序打包上线设置。

2.工具栏
工具栏包括“页面管理”“组件库”2个选项卡, “页面管理” 实现添加页面和添加分组以及对某一页面进行改名、收藏、复制、删除操作。 “组件库”有9个基础组件、7个布局组件、18个高级组件和2个其他组件。

3.编辑区
编辑区是用来制作小程序页面的主要区域,通过拖拽组件实现页面制作,右边的“前进”“后退”选项可以进行恢复操作,“模板”选项可以用来选择模板,“元素”选项可以用来显示页面中的组件及其层次关系,“数据”选项可以用来进行页面数据管理,“模块”选项可以用来选择模块。

4.属性面板
属性面板用来设置选定组件的属性及样式, 包括“组件”和“组件样式”两个选项卡。“组件”选项卡用来设置组件内容及点击事件;“组件样式”选项卡用来设置组件的样式,不同组件有不同的样式需要设置。

1.双栏组件
双栏组件用来布局整体,它可以把一个区块分为两部分,操作时显示一个分隔的标志,便于操作,预览时则不会出现。双栏组件默认设置每个栏占50%总宽,也可以按实际需要调整比例。

双栏里面可以添加基本的组件,从而达到整体的布局效果。双栏还可以嵌套双栏, 即可以在其中的一个栏里嵌入一个双栏,从而将整体分成3部分(若需要将整体分成4部分,就再嵌套一个双栏,依次类推)。

2.面板组件
        组件相当于一个大画板, 用户可以将很多基本(甚至高级) 的组件(如文本组件、图片组件、按钮组件、标题组件、分类组件、音频组件、双栏组件、计数组件等) 放进面板组件里一起管理。 面板组件的属性面板

3.自由面板组件
           自由面板组件是指放置在该面板内的组件可以自由拖动, 调节组件大小。 用户既可以向自由面板内拖入部分组件(包括文本组件、图片组件和按钮组件), 也可以拖入任意相关容器组件, 用于不规则布局。 自由面板组件的属性面板

其他组件
         其他组件包括音频组件和动态容器组件。

1.音频组件
         音频组件用于播放音乐(每个页面有一个音频组件即可), 手动点击播放按钮后即可实现播放。 音频文件可以选择音频库中的音乐, 也可以上传本地音频进行更换

4.应用数据
应用数据是后台管理的主要内容, 前端组件(动态列表、动态表单) 的数据都是通过在应用数据中的数据对象来管理的, 类似通过数据库存放和管理数据。

5. 轮播管理
轮播管理是前端软播组件的后台数据管理器, 通过软播管理来设置前端软播组件展示的图片内容。

6. 分类管理
分类管理适用于电商、到店、应用数据。 分类管理可以通过选择动态分类组件样式来实现在顶部分类或侧边栏分类以展示应用数据、商品数据等效果。 动态分类的二级有图模式只适用于电商。

7. 商品管理
商品管理是后台管理的主要内容, 前端商品列表组件的数据来源于后台商品管理。 商品管理可以管理商品列表、积分商品、位置管理、支付方式、订单管理、拼团订单管理、订单统计、账单明细、运费管理和评价管理功能。

8.经营管理
经营管理主要包括子账号管理、手机端客户关系管理和短信接收管理, 便于管理者管理小程序的运营。

9.营销工具
营销工具是小程序营销推广的有力工具, 主要有会员卡、优惠券、积分、储值、推广、秒杀、集集乐、拼团活动、大转盘、砸金蛋、刮刮乐等。 这些营销工具都需要事前在后台合理设置后, 才能在活动中发挥更大的作用。

10.多商家管理
多商家管理是即速应用为有众多商家的商城(如“华东商城” “义乌商城” 等) 开设的管理功能, 方便管理者统计每家店铺的订单及进行收益分析。

第六章

网络API
微信小程序处理的数据通常从后台服务器获取,再将处理过的结果保存到后台服务器,这就要求微信小程序要有与后台进行交互的能力。 微信原生API接口或第三方API提供了各类接口实现前后端交互。网络API可以帮助开发者实现网络URL访问调用、文件的上传和下载、网络套接字的使用等功能处理。 微信开发团队提供了10个网络API接口。

wx.request(Object) 接口用于发起HTTPS请求。
Wx.uploadFile(Object)接口用于将本地资源上传到后台服务器。
wx.downloadFile(Object) 接口用于下载文件资源到本地。
wx.connectSocket(Object) 接口用于创建一个WebSocket连接。
wx.sendSockerMessage(Object) 接口用于实现通过WebSocket连接发送数据。
wx.closeSocket(Object) 接口用于关闭WebSocket连接。
wx.onSocketOpen(CallBack) 接口用于监听WebSocket连接打开事件。
wx.onSocketError(CallBack) 接口用于监听WebSocket错误。
wx.onSocketMessage(CallBack) 接口用于实现监听WebSocket接收到服务器的消息事件。
wx.onSocketClose(CallBack) 接口用于实现监听WebSocket关闭。
发起网络请求
wx.request(Object) 实现向服务器发送请求、获取数据等各种网络交互操作, 其相关参数如表所示。一个微信小程序同时只能有5个网络请求连接, 并且是HTTPS请求。

示例1,通过wx.request(Object)获取百度(https://www.daidu.com)首页的数据。

//zzz.js
Page({
  data: {
    html:''
  },
  getbaidutap:function(){
    var that=this;
    wx:wx.request({
      url: 'https://www.baidu.com',
      data: {},
      header: {'Content-Type':'application/json'},
      success: function(res) {
        console.log(res);
        that.setData({
          html:res.data
        })
      },
    })
  }
});
//wxml
<view>邮箱编码:</view>
<input type="text" bindinput="input" placeholder="6位邮政编码"/>
<button type="primary" bind:tap="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.error_code,
              address:res.data.result.list
            })
          }
          else{
            self.setData({
              errMsg:res.data.reason || res.data.reason,
              error_code:res.data.error_code
            })
          }
        }
      })
    }
  }
})
//wxml
<view>邮箱编码:</view>
<input type="text" bindinput="input" placeholder="6位邮政编码"/>
<button type="primary" bind:tap="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.error_code,
              address:res.data.result.list
            })
          }
          else{
            self.setData({
              errMsg:res.data.reason || res.data.reason,
              error_code:res.data.error_code
            })
          }
        }
      })
    }
  }
})

 

下载文件
wx.downloadFile(Object)接口用于实现从开发者服务器下载文件资源到本地, 在客户端直接发起一个HTTP GET请求, 返回文件的本地临时路径。

示例,通过wx.downloadFile(Object)实现从服务器中下载图片,后台服务采用WAMP软件在本机搭建。

多媒体API
多媒体API主要包括图片API、录音API、音频播放控制API、音乐播放控制API等, 其目的是丰富小程序的页面功能。

图片API
图片API实现对相机拍照图片或本地相册图片进行处理,主要包括以下4个API接口:

wx.chooseImage(Object)接口用于从本地相册选择图片或使用相机拍照。
wx.previewImage(Object)接口用于预览图片。
wx.getImageInfo(Object)接口用于获取图片信息。
wx.saveImageToPhotosAlbum(Onject)接口用于保存图片到系统相册。
1.选择图片或拍照
wx.chooseImage(Object)接口用于从本地相册选择图片或使用相机拍照。拍照时产生的临时路径在小程序本次启动期间可以正常使用,若要持久保存,则需要调用wx.saveFile保存图片到本地。

若调用成功,则返回tempFilePaths和tempFiles,tempFilePaths表示图片在本地临时文件路径列表。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)
  }
})

录音API
录音API提供了语音录制的功能, 主要包括以下两个API接口:

wx.startRecord(Object)接口用于实现开始录音。
wx.stopRecord(Object)接口用于实现主动调用停止录音。
1.开始录音
wx.startRecord(Object)接口用于实现开始录音。当主动调用wx.stopRecord(Object)接口或者录音超过1分钟时,系统自动结束录音,并返回录音文件的临时文件路径。若要持久保存,则需要调用wx.saveFile()接口。

音频播放控制API
音频播放控制API主要用于对语音媒体文件的控制,包括播放、暂停、停止及audio组件的控制,主要包括以下3个API:

wx.playVoice(Object)接口用于实现开始播放语音。
wx.pauseVoice(Object)接口用于实现暂停正在播放的语音。
wx.stopVoice(Object)接口用于结束播放语音。
1.播放语音
wx.playVoice(Object)接口用于开始播放语音,同时只允许一个语音文件播放,如果前一个语音文件还未播放完,则中断前一个语音文件的播放。

//js
wx.startRecord({
  success:function(res){
    var tempFilePath = res.tempFilePath
    wx.playVoice({
      filePath: tempFilePath,
      complete:function(){
      }
    })
  }
})

 

2.暂停播放

wx.pauseVoice(Object)用于暂停正在播放的语音。再次调用wx.playVoice(Object)播放同一个文件时,会从暂停处开始播放。如果想从头开始播放,则需要先调用wx.stopVoice(Object)。

示例代码如下:

 

wx.startRecord({
  success:function(res){
    var tempFilePath = res.tempFilePath
    wx.playVoice({
      filePath: 'tempFilePath',
    })
    setTimeout(function(){//暂停播放
      wx.pauseVoice()
    },5000)
  }
})

音乐播放控制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)用于播放音乐,同一时间只能有一首音乐处于播放状态

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.playBackgroundAudio({
  dataUrl: 'http://bmob - cdn - 16488.b0.upaiyun.com/2018/02/09/117e4a1b405195b18061299e2de89597.mp3',
  title:'有一天',
  coverImgUrl:'http://bmob - cdn - 16488.b0.upaiyun.com/2018/02/09/f604297140c9681880cc3d3e581f7724.jpg',
  success:function(res){
    console.log(res)
  }
})
监听音乐播放

wx.onBackgroundAudioPlay(CallBack)接口用于实现监听音乐播放,通常被wx.playBackgroundAudio(Object)方法触发,在CallBack中可改变播放图标。示例代码如下

//js
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,
      })
    })
  }
})

7.监听音乐暂停
wx.onBackgroundAudioPause(CallBack)接口用于实现监听音乐暂停,通常被wx.pauseBackgroundAudio()方法触发。在CallBack中可以改变播放图标。

8.监听音乐停止
wx.onBackgroundAudioStop(CallBack)接口用于实现监听音乐停止,通常被音乐自然播放停止或wx.seekBackgroundAudio(Object)方法导致播放位置等于音乐总时长时触发。在CallBack中可以改变播放图标。

 

//wxml
<view class="container">
<image class="bgaudio" src="{{changedImg ? music.coverImg: '/images/1-3.png'}}"/>
<view class="control-view">
<image src="/images/smoke1.png" bind:tap="onPositionTap" data-how="0"/>
<image src="/pages/test/{{isPlaying ? 'pause':'play'}}.png" bind:tap="onAudioTap"/>
<image src="/images/smoke2.png" bind:tap="onStopTap"/>
<image src="/images/smoke3.png" bind:tap="onPositionTap" data-how="1"/>
</view>
</view>
 
 
 
 
//json
{
  
}
 
 
 
//wxss
.bgaudio{
  height: 350rpx;
  width: 350rpx;
  margin-bottom: 100rpx;
}
.control-viewimage{
  height: 64rpx;
  width: 64rpx;
  margin: 30rpx;
}
 
 
 
 
 
//js
Page({
  data:{
    //记录播放状态
    isPlaying:false,
  coverImg:"",
    changedImg:false,
    //音乐内容
    music:{
      "url":
      "http://bomb - cdn - 16488.b0.upaiyun.com/2018/02/09/117e4a1b405195b18061299e89597.mp3",
      "title":"盛晓玫 - 有一天",
      "coverImg":
      "http://bomb - cdn - 16488.b0.upaiyun.com/2018/02/09/f604297140c9681880cc3d3e581f7724.jpg"
    },
  },
  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(){
        //改变coverImg和播放状态
        that.setData({ isPlaying:false,changedImg:false });
      }
    })
  },
  //点击快进或快退,触发
  onPositionTap:function(event){
    let how = event.target.dataset.how;
    //获取音乐的播放状态
    wx.getBackgroundAudioPlayerState({
      success:function(res){
        //在播放才生效
        //1播放中
        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");
    });
  }
})

文件API
从网络上下载或录音的文件都是临时保存的,若要持久保存,需要用到文件API。文件API提供了打开、保存、删除等操作本地文件的能力,主要包括以下5个API接口:

(一)wx.saveFile(Object)接口用于保存文件到本地。
(二)wx.getSaveFileList(Object) 接口用于获取本地已保存的文件列表。
(三)wx.getSaveFileInfo(Object) 接口用于获取本地文件的文件信息。
(四)wx.removeSaveFile(Object) 接口用于删除本地存储的文件。
(五)wx.openDocument(Object) 接口用于新开页面打开文档,支持格式:doc、xls、ppt、pdf、docx、xlsx、ppts。
1.保存文件
wx.saveFile(Object)用于保存文件到本地

saveImg: (function(){
  wx.chooseImage({
    count:1,
    sizeType:['original','compressed'],
    sourceType:['album','camera'],
    success:function(res){
      var tempFilePaths = res.tempFilePaths[0]
      wx.saveFile({
        tempFilePath:tempFilePaths,
        success:function(res){
          var saveFilePath = res.saveFilePath;
          console.log(saveFilePath)
        }
      })
    }
  })
})

 

本地数据及缓存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后缀的为异步接口。
保存数据
1.wx.setStorage(Object)
wx.setStorage(Object)接口将数据存储到本地缓存接口指定的key中,接口执行后会覆盖原来key对应的内容。

//js
wx.setStorage({
  kry:'name',
  data:'sdy',
  success:function(res){
    console.log(res)
  }
})

 

位置信息API
小程序可以通过位置信息API来获取或显示本地位置信息, 小程序支持WGS84和GCj02标准,WGS84标准为地球坐标系,是国际上通用的坐标系ꎻGCj02标准是中国国家测绘局制定的地理信息系统的坐标系统,是由WGS84坐标系经加密后的坐标系,又称为火星坐标系。

默认为WGS84标准,若要查看位置需要使用GCj02标准。主要包括以下3个API接口:

wx.getLocation(Object)接口用于获取位置信息。
wx.chooseLocation(Object)接口用于选择位置信息。
wx.openLocation(Object)接口用于通过地图显示位置。
获取位置信息
wx.getLocation(Object)接口用于获取当前用户的地理位置、速度,需要用户开启定位功能,当用户离开小程序后,无法获取当前的地理位置及速度,当用户点击“显示在聊天顶部”时,可以获取到定位信息

//js
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);
  },
})

设备相关API
设备相关的接口用于获取设备相关信息,主要包括系统信息、网络状态、拨打电话及扫码等。主要包括以下5个接口API:

一、wx.getSystemInfo(Object)接口、wx.getSystemInfoSync()接口用于获取系统信息。
二、wx.getNetworkType(Object)接口用于获取网络类型。
三、wx.onNetworkStatusChange(CallBack)接口用于监测网络状态改变。
四、wx.makePhoneCall(Object)接口用于拨打电话。
五、wx.scanCode(Object)接口用于扫描二维码。
获取系统信息
wx.getSystemInfo(Object)接口、wx.getSystemInfoSync()接口分别用于异步和同步获取系统信息。

//js
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.scanCode(Object)接口用于调起客户端扫码界面, 扫码成功后返回相应的内容,

//js
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)
  }
})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值