第4章 页面组件
第五章 即速应用
第六章 API应用
第四章 页面组件
4.1 组件的定义及属性
组件是页面视图层的基本组成单元,组件组合可以构建功能强大的页面结构。小程序框架为开发者提供了容器视图,基础内容,表单,导航,多媒体,地图,画布,开放能力等8类基础组件。
例如一下组件:
id: 组件的唯一表示,保持整个页面唯一,不常用。
class: 组件的样式类,对应WXSS中定义的样式。
style: 组件的内联样式,可以动态设置内联样式。
hidden: 组件是否显示,所有组件默认显示。
data-* :自定义属性,组件触发事件时,会发送给事件处理函数。事件处理函数可以通过传入参数对象的currentTarget.dataset 方式来获取自定义属性的值。
bind*/catch* : 组件的事件,绑定逻辑层相关事件处理函数。
4.2 容器视图组件
容器视图组件是能容纳其他组件的组件,是构建小程序页面布局的基础组件,主要包括view,scroll-view和swiper组件。
4.2.1 view组件
属性名 | 类型 | 默认值 | 功能 |
hover-class | String | none | 指定按下去的样式类,默认没有点击态效果 |
hover-stop-propagation | Boolean | false | 指定是否阻止节点的祖先节点出现点击态 |
hover-start-time | Number | 50 | 手指触键至出现点击态的等待时间(ms) |
hover-stay-time | Number | 400 | 手指松开后点击态的保留时间 |
通过<view>组件实现页面布局示例代码如下:
<view style="text-align:center">默认flex布局</view>
<view style="display:flex">
<view style ="border:2px solid #f00;flex-grow:1">1 </view>
<view style ="border:2px solid #f00;flex-grow:1">2 </view>
<view style ="border:2px solid #f00;flex-grow:1">3 </view>
</view>
<view style="text-align:center">上下混合布局</view>
<view style="display:flex;flex-direction:column">
<view style="border:2px solid #f00;">1 </view>
<view style="display:flex">
<view style="border:2px solid #f00;flex-grow:1">
2 </view>
<view style="border:2px solid #f00;flex-grow:2">3</view>
</view>
</view>
<view style="text-align:center">左右混合布局</view>
<view style="display:flex">
<view style ="border:2px solid #f00;flex-grow:1">1 </view>
<view style ="display:flex;flex-direction:column;flex-grow:1">
<view style ="border:2px solid #f00;flex-grow:1">2</view>
<view style ="border:2px solid #f00;flex-grow:2">3</view>
</view>
</view>
运行效果如图:
4.2.2 scroll-view 实现滚动视图的功能
属性名 | 类型 | 说明 |
scroll-x | Boolean | 允许横向滚动,默认值false |
scroll-y | Boolean | 允许纵向滚动,默认值false |
upper-threshold | Number | 距顶部/左边多远时,触发scrolltoupper事件,默认值50px |
lower-threshold | Number | 距底部/右边多远时,触发scrolltoupper事件,默认值50px |
scroll-top | Number | 设置竖向滚动条位置 |
scroll-left | Number | 设置横向滚动条位置 |
scroll-into-view | String | 元素滚动到滚动区域的顶部 |
bindscrolltoupper | EventHandle | 距顶部/左边多远时,触发scrolltoupper事件 |
bindscrolltolower | EventHandle | 距底部/右边多远时,触发scrolltoupper事件 |
bindscroll | EventHandle | 滚动时触发,event,detail={scrollLeft,scrollTop,scrollHeight,scrollWidth,deltaX,deltaY} |
通过scroll-view组件可以实现下拉刷新和上拉加载更多,代码如下:
在.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="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_de-scription}}</text>
</view>
</view>
</scroll-view>
<view class="body-view">
<loading hidden="{{hidden}}"bindchange="loadingChange">
加载中.....</loading>
</view>
</view>
在.JS下输入以下代码:
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:{
var page=page,
var page_size=page_size,
var sort=sort,
var is_easy=is_easy,
var lange_id=lange_id,
var pos_id=pos_id,
var unlearn=unlearn
},
success: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,
list:[],
scrollTop:0,
scrollHeight:0
},
onLoad:function(){
//这里要注意,微信的scroll-view必须设置高度才能监听滚动事件,所以需要再页面的onLoad实践中为scroll-view的高度赋值
var that=this;
wx.getSystemInfo({
success:function(res){
that.setData({
scrollHeight: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");
}
})
在.scss下输入以下代码:
.userinfo{
display:flex;
flex-direction:column;
align-items:center;
}
.userinfo-avatar{
width:128rpx;
height :128rpx;
margin:20rpx;
border-radius:50%;
}
.userinfo-nickname{
color: #aaaaaa;
}
.usermotto{
margin-top:200px;
}
sCroll-view{
width: 100%;
}
.item{
width:90%;
height:300rpx;
margin:20rpxauto;
background:brown;
overflow:hidden;
}
.item.img
{
width:430rpx;
margin-right:20rpx;
float:left;
}
.title{
font-size:30rpx;
display:block;
margin:30rpxauto;
}
.description{
font-size:26rpx;
line-height:15rpx;
}
运行效果图如下:
4.2.3 swiper 实现轮播图,图片预览,滑动页面等效果。
属性名 | 类型 | 默认值 | 说明 |
indicator-dots | Boolean | dalse | 是否显示面板指示点 |
autoplay | Boolean | dalse | 是否自动切换 |
current | Number | 0 | 当前所在页面的index |
interval | Number | 5000 | 自动切换时间间隔(ms) |
duration | Number | 1000 | 滑动动画时长(ms) |
bindchange | EventHandle | ---- | current改变时会触发change事件,event.detail={cur-rent:current} |
<swiper-item/>组件为滑块项组件,只能被放置在<swiper/>组件中,宽高尺寸默认按100%显示。
在.WXML输入以下代码:
<swiperindicator-dots='true'autoplay ='true'interval='5000'du-ration='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 图标组件
属性名 | 属性值 | 说明 |
type | String | icon类型,有效值为success,success_no_circle,info,warn,waiting,cancel,download,search,clear |
size | Number | icon的大小,默认值为23px |
color | Color | icon的颜色,类似CSS中的color |
在.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_on_circle","warn","wait-ing","cancel","download","search","clear"],
iconSize:[10,20,30,40],
iconColor:['#f00','#0f0','#00f'],
}
})
运行效果如图:
4.3.2 text 展示内容
属性名 | 类型 | 默认值 | 说明 |
selectable | Boolean | false | 文本是否可选 |
space | Boolean | false | 显示连续空格 |
decode | Boolean | false | 是否解码 |
代码如下
在.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="{{19+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 显示进度条状态
属性名 | 类型 | 默认值 | 说明 |
percent | Float | 无 | 百分比(0~100) |
show-info | Boolean | false | 是否在进度条右侧显示百分比 |
stroke-width | Number | 6 | 进度条的宽度,单位为px |
color | Number | #09BB07 | 进度条颜色 |
active | Boolean | false | 是否以动画方式显示进度条 |
代码如下:
<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 实现用户和应用之间的交互,按钮的颜色起引导作用
属性名 | 类型 | 默认值 | 说明 |
size | String | default | 按钮的大小,其指包括default,mini |
type | String | default | 按钮的大小,其指包括default,primary,warn |
plain | Boolean | false | 按钮是否镂空,背景色透明 |
disabled | Boolean | false | 是否禁用 |
loading | Boolean | false | 名称前是否显示loading图标 |
form-type | String | --- | 有效值为submit和reset。用于</form>组件,点击后会分别触发submit事件,reset事件。 |
hover-class | String | button-hover | 点击按钮时的样式 |
示例代码如下:
在.XWML下输入以下代码:
<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}}">改变1oading显示</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})
},
//是否显示 loading 图案
buttonLoading:function(){
this.setData({loading:!this.data.loading})
}
})
运行效果图如下:
4.4.2 radio 单选框用来从一组选项中选取一个选项。
示例代码如下:
在.XWML下输入以下代码:
<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"vx:for="{{radios}}">
<radio value="{{item.value}}"checed="{{item.checked}}"/>
{{item.name}}
</ladel>
</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 复制框
示例代码如下
在.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({
data:{
radios:[
{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 开关选择器
在.WXML下输入以下代码:
<view>
<switch bindchange="sw1">{{var1}}</switch>
</view>
<view>
<switch bindchange bindchange="sw2">{{var2}}</switch>
</view>
<view>
<switch type="checkbox" bindchange="sw3">{{var3}}</switch>
</view>
在.JS下输入以下代码:
Page({
data:{
var1:'关',
var2:'开',
var3:'未选'},
swl:function(e){
this.setData({var1: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 滑动选择器
在.WXML下输入以下代码:
示例代码如下:
<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下输入以下代码:
page({
data:{
size:'20'
},
sliderchange:function(e){
this.setData({size:e.detail.value})
}
})
运行效果图如下:
4.4.6 picker 滚动选择器
1.普通选择器
示例代码如下:
在.WXML下输入以下代码:
<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]}}
</picker>
在.JS下输入以下代码:
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({
index1:e.detail.value
})
},
objArrayChange: function(e){
console.log('picker值变为',e.detail.value)
this.setData({
index2:e.detail.value
})
}
})
运行效果图如下:
2.多列选择器
示例代码如下:
在.WXML下输入以下代码:
<view>多列选择器</view>
<picker mode="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]
},
//绑定 Multipicker
bindMultiPickerChange:function(e){
console.log('picker发送选择改变,携带值为',e.detail.value)
this.setData({multiIndex:e.detail.value
})
},
//绑定MultiPickerColumn
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){}
case0 :
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.multiIndex0){
case 0:
switch(data.multiIndex1){
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]=['南山区','罗湖区'];
case 1:
data.multiArray[2]=['香洲区','斗门区'];
break;
}
break;
}
data.multiIndex[2]=0;
console.log(data.multiIndex);
break;
}
this.setData(data);
},
})
运行效果图如下:
3.时间选择器,日期选择器
示例代码如下:
在.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,
date:'2018',
starttime:'00:00',
endtime:'12:59',
time:'8:00'
},
changedate:function(e){
this.setData({date:e.detail.value});
console.log(e.detail.value)
},
changetime:function(e){
this.setData({time:e.detail.value})
console.log(e.detail.value)
}
})
运行效果图如下:
4. 省市选择器
示例代码如下:
在.WXML下输入以下代码:
<picker mode="region"value="{{region}}"custom-item="{{cust-omitem}}"bindchange="changeregion">
选择省市区:{{region[0]}},{{region[1]}},{{region[2]}}
</picker>
在.JS下输入以下代码:
page({
data:{
region:['陕西省','西安市','长安区'],
customitem:'全部'
},
changeregion:function(e){
console.log(e.detail.value)
this.setDataa({
region:e.detail.value
})
}
})
运行效果图如下:
4.4.7 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>
在.JS下输入以下代码:
//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]]
})
}
})
运行效果图如下:
4.4.8 input 输入框
示例代码如下:
在.WXML下输入以下代码:
<input placeholder="这是一个可以自动聚焦的 input" auto-focus/>
<input placeholder="这个只有在按钮点击的时候才聚焦" focus ="{{focus}}"/>
<button bindtap="bindButtonTap">使得输入框获取焦点</button>
<input maxlength="10" placeholder="最大输入长度为10"/>
<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
})
},
bingKeyInput: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.4.9 textarea 多行输入框组件
示例代码如下
在.WXML下输入以下代码:
<textarea bindblur="bindTextAreaBlur"auto-height placeholder="自动变高"/>
<textarea placeholder="placeholder 颜色是红色的 "placeholder-style="color:red;"/>
<textarea placeholder="这是一个可以自动聚焦的textarea"auto-focus/>
<textarea placeholder="这个只有在按钮点击的时候才聚焦"focus="{{focus}}"/>
<button bind:tap="bindButtonTop">使得输入框获取焦点</button>
《<form bindsubmit="bindFormSubmit">
<textarea placeholder="form中的rextarea"name="textarea"/>
<button form-type="submit">提交</button>
</form>
在.JS下输入以下代码:
//textarea.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 标签组件
示例代码:
// 文件js
Page({
data: {
citys:[
{name:'km',value:'昆明'},
{name:'sy',value:'三亚'},
{name:'zh',value:'珠海', checked:"true"},
{name:'dl',value:'大连'},
]
},
cityChange:function(e:any){
console.log(e.detail.value)
var city=e.detail.value;
this.setData({ city:city})
}
})
<!-- ladel.wxml -->
<!-- 单击中国不能选择/ 取消复选框> -->
<view ><checkbox>中国</checkbox></view>
<!-- 单击中国可以选择/ 取消复选框> -->
<view> <label ><checkbox value=""/> 中国</label></view>
<!-- 使用for找到对应的id -->
<checkbox-group bindchange="cityChange">
<label wx:for="{{citys}}">
<checkbox value="{{item.value}}" checked="{{item.checkd}}">{{item.value}}</checkbox>
</label>
</checkbox-group>
<view>您的选择是:{{city}}</view>
运行结果:
4.4.11 form
form组件是表单组件,用来实现将组件内部的用户信息输入进行提交。
示例代码如下:
<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 formType='submit'>提交</button>
<button formrype='reset'>重置</button>
</form>
//form. js
Page({
hobby :"",
data:{
hobbies :[
{name:'jsj',value:'计算机',checked:'true'},
{name:'music',value:'听音乐'},
{name:'game',value:'玩电竟'},
{name:'swim',value:'游泳',checked:'true'}]
},
formSubmit:function(e){
console.log('form发生了submit事件,携带数据为:'.e.detail.value)
},
formReset:function(){
console.log('form发生了reset事件')
}
})
4.5多媒体组件
多媒体组件包括img(图像)、audio(音频)、video(视频)、camera(相机)组件。
4.5.1 image
为图像组件
image组件中的mode模式有13种模式,缩放模式有4种 ,裁剪模式有9种。
1.scaleToFill :不保持横纵比缩放图片,使图片的宽高完全拉伸至填满image元素。
2.aspectFit:保持横纵比缩放图片,使图片的长边能完全显示出来。也就是说,可以将图片完整地显示出来。
3.aspectFill:保持横纵比缩放图片,只保证图片的短边能完全显示出来。也就是说,图片通常只在水平或垂直方向是完整的,在另一个方向将会发生截取。
4.wodthFix:宽度不变,高度自动变化,保持原图宽高比不变。
示例代码如下:
在.WXML下输入以下代码:
<block wx:for ="{{modes}}">
<view>当前图片的模式是:{{item}}</view>
<image mode ="{{item}}" src ="../images/nv.jpg" style ="width:100%,height:100%"/>
</block>
在.JS下输入以下代码:
Page({
data:{
modes:['scaleToFill','aspectFit','aspectFill','widthFrix']
}
})
运行效果图如下:
2 .裁剪模式
top:不缩放图片,只显示图片的顶部区域。
bottom:不缩放图片,只显示图片的底部区域。
center:不缩放图片,只显示图片的中间区域。
left:不缩放图片,只显示图片的左边区域。
right:不缩放图片,只显示图片的右边区域。
top_left:不缩放图片,只显示图片的左上边区域。
top_right:不缩放图片,只显示图片的又上边区域。
bottom_left:不缩放图片,只显示图片的左下边区域。
bottom_right:不缩放图片,只显示图片的右下边区域。
示例代码如下:
在.WXML下输入以下代码:
<block wx:for="{{modes}}">
<view>当前图片的模式是:{{item}}</view>
<image mode="{{item}}"src="/image/5.jpg"style="width:100%,height:100%"/>
</block>
在.JS下输入以下代码:
Page({
data:{
modes:['top','center','left','right','top_left','top_right','bottom_left','bottom_right']
}
})
运行效果图如下:
4.5.2 audio 实现音乐播放,暂停等
示例代码如下:
在.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下输入以下代码:
<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>
运行效果图如下:
4.5.3 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
})
}
})
}
})
运行效果图如下:
4.5.4 camera 系统相机组件
示例代码如下:
在.WXML下输入以下代码:
<camera device-position="back"flash="off"binderror="error"
stype="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 其他组件
4.6.1 显示地图或路径
示例代码如下:
在.WXML下输入以下代码:
<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下输入以下代码:
//.js
Page({
data :{
markers :[{
//标记点
iconPath:"/ages /dw.png",
id:0,
longitude:"108.9290",
latitude:"34.1480",
width:50,
height:50
}],
polyline:[{
points:[{
longitude:"108.9200",
latitude:"34.1400",
},
{
longitude:"108.9200",//线路点2
latitude:"34.1500"
},
{
longitude:"108.9200",//线路点3
latitude:"34.1700",
}
],
color:"#00ff00",
width:2,
dottedLine:true
}],
controls:[{
//控件的相关信息
id:1,
iconPath:'ages/w.png',
position:{
left:0,
top:300,
width:30,
height:30
},
clickable:true
}]
},
regionchange(e){
console.log(e.type)
},
markertap(e){
console.log(e.markerId)
},
controltap(e){
console.log(e.controlId)
}
})
运行效果图如下:
4.6.2 canvas 绘制图片
实现绘图需要三个步骤:
步骤一:创建一个canvas绘图上下文。代码如下:
var context = wx.createCanvasContext('myCanvas')
步骤二:使用canvas绘图上下文进行绘图描述。代码如下:
context.setFillStyle('green')//设置绘图上下文的填充色为绿色
context.fillRect(10.10.200.100)//方法画一个矩形,填充为设置的绿色
步骤三:画图。代码如下:
context.draw()
示例代码如下:
在.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()
}
})
运行效果图如下:
4.7 本章小结
本章介绍了小程序中的常用组件,包括容器组件,基础内容组件,表单组件,多媒体组件,其他自检等。熟练掌握这些组件的属性和方法是开发小程序的必备技能。
第五章 即速应用
本章学习目标
1.了解即速应用的特征
2.掌握即速应用布局组件,基础组件和高级组件
3.掌握即速应用后台管理
4.掌握即速应用小程序打包上传
5.1 即速应用概述
5.1.1 即速应用的优势
1.开发流程简单,零门槛制作
(1)登录即速应用的官网(http://www.jisuapp.cn),进入制作界面,从众多行业模版中选择一个合适的模版。
(2)在模版的基础上进行简单编辑和个性化制作
(3)制作完成后,将代码一键打包并下载
(4)将代码上传至微信开发者工具
(5)上传成功后,等待审核通过即可
2.行业模版多样,种类齐全
3.丰富的功能组件和强大的管理后台
(1)资讯类:新闻,媒体。
(2)电商类:网购(服装,电器,读书,母婴...)
(3)外卖类:餐饮及零售
(4)到店类:餐饮及酒吧
(5)预约类:酒店,KTV,家教,家政,其他服务行业
5.1.2 即速应用界面介绍
1.菜单栏
2.工具栏
3.编辑区
4.属性面板
5.2 即速应用组件
即速应用提供了大量的组件供用户快速布局页面,包括7个布局组件,9个基础组件,18个高级组件和2个其他组件。
5.2.1 布局组件
布局组件用于设计页面布局,主要包括双栏,面板,自由面板,顶部导航,底部导航,分割线和动态分类。
1.双栏组件
2.面板组件
3.自由面板组件
4.顶部导航组件
5.底部导航组件
6.分割线组件
7.动态分类组件
5.2.2 基本组件
基本组件是小程序页面常用的组件,包括文本,图片,按钮,标题,轮播,分类,图片,列表,图文集和视频。
1.文本组件:用于设置文字,点击事件。
2.图片组件:用于页面展示图片
3.按钮组件:用于页面设置按钮
4.标题组件:用于设置页面标题
5.轮播组件:用于实现图片轮播展示
6.公告组件
7.商品列表组件
8.组合组件
9.视频组件:用于展示视频
5.2.3 高级组件
高级组件通常需要后台数据,通过设置后台数据来实现数据后台化,让小程序的数据随时更新,及时修改。
1.动态列表组件
动态列表组件是容纳基础组件来展示后台数据的容器,通过添加基础组件来展示对应的后台数据。
如图所示:
2.个人中心组件
个人中心组件显示个人相关信息,包括图像,昵称,我的订单,收货地址,购物车等。
如图所示:
3.动态表单组件
动态表单组件相当于HTML中的<form>标签,是一个容器组件,可以添加子表单组件和基本组件,用来收集用户提交的相关信息给后台数据对象。如图所示:
4.评论组件
评论组件提供信息发布或回复信息的组件,评论组件的属性面板如图所示:
5.计数组件
计数组件可以用于点赞,统计浏览量等类似的计数功能。计数组件的属性面板如图所示:
6.地图组件
地图组件用于显示指定地址的地图,常用于实现定位及导航功能,地图组件的属性面板如图所示。
7.城市定位组件
城市定位组件通常与列表类组件搭配使用,常见搭配有动态列表和商品列表。
8.悬浮窗组件
悬浮窗组件的固定搭配有:客服,我的订单,购物车,回到顶部。
5.2.4 其他组件
其他组件包括音频组件和动态容器组件。
1. 音频组件
2.动态容器组件
5.3 即速应用后台管理
即速应用后台管理提供了非常强大的后台管理,开发者在后台进行修改操作就可以让数据即时更新,开发者还可以通过后台来查看小程序数据管理,用户管理,商品管理,营销工具,多商家管理等功能。
1.数据管理
数据管理包括数据总览,访客分析和传播数据功能。
2.分享设置
分享设置主要提供可以分享应用的方式。
3.用户管理
用户管理主要用于实现对用户进行添加,分组,群发消息,储值金充值,赠送会员等更能。
4.应用数据
应用数据是后台管理的主要内容,前端组件(动态列表,动态表单)的数据都是通过在应用数据中的数据对象来管理的,类似通过数据库存放和管理数据。
5.轮播管理
轮播管理是前端软播组件的后台数据管理器,通过软播管理来设置前端软播组件展示的图片内容。
6.分类管理
分类管理适用于电商,到店,应用数据。分类管理可以通过选择动态分类组件样式来实现在顶部分类或侧边栏分类以展示应用数据,商品数据等效果。动态分类的二级有图模式只适用于电商。
7.商品管理
商品管理是后台管理的主要内容,前端商品列表组件的数据来源于后台商品管理。商品管理可以管理商品列表,积分商品,位置管理,支付方式,订单管理,拼图订单管理,订单统计,账单明细,运放管理和评价管理功能。
8.经营管理
经营管理主要包括子账号管理,手机端客户关系管理和短信接收管理,便于管理者管理小程序的运营。
9.营销工具
营销工具是小程序营销推广的有力工具,主要有会员卡,优惠券,积分,储值,推广,秒杀,集集乐,拼团活动,大转盘,砸金蛋,刮刮乐等。
10.多商家管理
多商家管理是即速应用为众多商家的商城(如‘华东商城’,‘义乌商城’等)开设的管理功能,方便管理者统计每家店铺的订单及进行收益分析。
5.4 打包上传
即速应用可以将小程序的代码打包,改代码包可以通过微信开发者工具来对接微信小程序。
5.4.1 打包
进入即速应用后台管理,选择左边选项“分享设置”按钮,单击“微信小程序”选项,选择“代码包下载”选项,单击确认按钮 如图所示:
通过“微信小程序-小程序-设置-开发设置”获取appID和appSecret,在“服务器配置”中填写相关信息,选择相应分类,单击“打包按钮,即可成功打包 ”
5.4.2 上传
5.5 本章小结
本章主要讲解微信小程序的第三方工具-即速应用,首先介绍了即速应用的优势及待点,然后介绍了即速应用的布局组件、基础组件、高级组件和其他组件,最后介绍了即速应用的后台管理及包、上传功能。通过对本章的学习,可以为以后使用即速应用制作各类小程序打下坚实的基础。
第六章 API应用
6.1 网络AIP
微信小程序处理的数据通常从后台服务器获取,再将处理过的结果保存到后台服务器,这就要求微信小程序要有与后台进行交互的能力。微信原生API接口或第三方API提供了各类接口实现前后端交互。
微信开发团队提供了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关闭。
在本节,我们将介绍常用的3个网络API。
6.1.1 发起网络请求
wx.request(Object)实现向服务器发送请求,获取数据等各种网络 交互操作,其相关参数如表所示。一个微信小程序同事只能有5个网络请求连接,并且是HTTPS请求。
例如,通过wx.request(Object)获取百度(http://www.baidu.com)首页的数据。
示例代码如下:
在.wxml下输入以下代码:
<button type="primary"bindtap="getbaidutap">获取HTTP数据</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({
that,setData({
html:res,data
})
})
}
})
}
})
效果运行图如下:
通过 wx.request(Object)的GET方法获取邮政编码对应的地址信息。
示例代码如下:
在.xwml下输入以下代码:
<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下输入以下代码:
//postcode.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;
//显示 toast 提示消息
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',//方法为GET
success:function(res){
wx.hideToast();//隐藏toast
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.reasonllres.data.reason,//错误原因分析
error_code:res.data.error_code
})
}
}
})
}
}
})
效果运行图如下:
6.1.2 上传文件
wx.uploadFile(Object)接口用于将本地资源上传到开发者服务器,并在客户端发起一个HTTPS POST请求,相关参数如下表:
通过 wx.uploadFile(Object),可以将图片上传到服务器并显示。示例代码如下:
在.xwml下输入以下代码:
<button type="primary" bind:tap="uploadumage">上传图片</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){
//显示toast提示消息
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:page[0]
})
},
fail:function(e){
console.log(e);
wx.showModal({
title: '提示',
content: '上传失败',
showCancel:false
})
},
complete:function(){
//隐藏Toast
wx.hideToast()
}
})
}
}
})
效果运行图如下:
6.1.3 下载文件
wx.downloadFile(Object)接口用于实现从开发者服务器下载文件资源到本地,在客户端直接发起一个HTTP GET请求,返回文件的本地临时路径。相关参数如表:
通过 wx.downloadFile(Object)实现从服务器中下载图片,后台服务采用WAMP软件在本机搭建。
在.xwml下输入以下代码:
<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
})
}
})
}
})
效果运行图如下:
6.2 多媒体API
多媒体API主要包括图片API,录音API,音频播放控制API,音乐播放控制API等,目的是为了丰富小程序的页面功能。
6.2.1 图片API
图片API实现对相机拍照图片或本地相册图片进行处理,主要包括以下四个API接口:
■ wx.chooseImage(Object)接口用于从本地相册选择图片或使用相机拍照。
■ wx.previewImage(Object)接口 用于预览图片。
■ wx.getImageInfo(Object)接口用于获取图片信息。
■ wx.saveImageToPhotosAlbum(Object)接口 用于保存图片到系统相册。
1.选择图片或拍照
示例代码如下:
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)
}
})
2.预览图片
3.获取图片信息
示例代码如下:
wx.chooseImage({
success:function(res){
wx.getImageInfo({
src:res.tempFilePaths[0],
success:function(e){
console.log(e.width)
console.log(e.height)
}
})
},
})
4.保存图片到系统相册
6.2.2 录音API
录音API提供了语音录制的功能,主要包括以下两个API接口:
■ wx.startRecord(Object)接口用于实现开始录音。
■ wx.stopRecord(Object)接口
1.开始录音:wx.startRecord(Object)
2.停止录音:wx.stopRecord(Object)
示例代码如下:
wx.startRecord)
({
success: function(res){
var tempFilePath= res.tempFilePath},
fail: function(res){
//录音失败
}
})
setTimeout(function(){//结束录音
wx.stopRecord()
},10000)
6.2.3 音频播放控制API
音频播放控制API主要用于对语音媒体文件的控制,包括播放,暂停,停止及audio组件的控制,主义包括以下3个API:
■ wx.playVoice(Object)接口 用于实现开始播放语音。
■ wx.pauseVoice(Object)接口用于实现暂停正在播放的语音。
■ wx.stopVoice(Object)接口 用于结束播放语音。
1.播放语音
示例代码如下:
wx.startRecord({
success: function(res){
var tempFilePath= res.tempFilePath wx.playVoice({//录音完后立即播放
filePath:tempFilePath, complete:function(){
}
})
}
})
2.暂停播放
示例代码如下:
wx.startRecord({
success: function(res){
var tempFilePath = res.tempFilePath
wx.playVoice({ filePath:tempFilePath
})
setTimeout(function(){
//暂停播放
wx.pauseVoice()},5000)
}
})
3.结束播放
示例代码如下:
wx.startRecord({
success: function(res){
var tempFilePath =res.tempFilePath wx.playVoice({
filePath:tempFilePath})
setTimeout(function(){
wx.stopVoice()},5000)
}
})
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.seekBackgroundAudio(Object)接口 用于定位音乐播放进度。
4.暂停播放音乐
wx.pauseBackgroundAudio()接口 用于实现暂停播放音乐。
5.停止播放音乐
wx.stopBackgroundAudio()接口 用于实现停止播放音乐。
6.监听音乐播放
wx.onBackgroundAudioPlay(CallBack)接口 用于实现监听音乐播放。
7.监听音乐暂停
wx.onBackgroundAudioPause(CallBack)接口 用于实现监听音乐暂停。
8.监听音乐停止
wx.onBackgroundAudioStop(CallBack)接口 用于实现监听音乐停止。
9.案例展示
在.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/nv.jpg"bindtap="onPositionTap"data-how= "0 "/>
<image src = "../images/{{isPlaying?'pause':'play'}}.png " bindtap = "onAudioTap"/>
<image src ="../images/log1.png"bindtap = "onStopTap"/><!--使用data-how定义一个1表示快进10秒-->
<image src ="../images/mao.png"bindtap ="onPositionTap"data-how = "1"/>
</view >
</view >
在.wxss代码下输入以下代码:
.bgaudio{
height:350rpx; width:350rpx;
margin-bottom:100rpx;
}
.control-view image{
height:64rpx;
width:64rpx;
margin:30rpx;
}
在.js下输入以下代码:
Page({
data:{
//记录播放状态
isPlaying:false,
//记录coverImg,仅当音乐初始时和播放停止时,使用默认的图片。播放中和暂停时,都使用当前音乐的图片
coverImgchangedImg:false,
//音乐内容
music:{
"url":"../images/打歌妹.mp3",
"title":"航sir-打歌妹",
"coverImg":
"../images/打歌妹.mp3"
},
},
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");
});
}
})
在.json下输入以下代码:
{
"navigationBarBackgroundColor": "#000000",
"navigationBarTitleText": "小程序作业(DaZ)",
"navigationBarTextStyle": "white",
"backgroundTextStyle": "dark"
}
运行效果图如下:
6.3 文件API
从网络上下载或录音的文件都是临时保存的,如果要持久保持,需要用到文件API。文件API提供了打开,保持,删除等操作本地文件的能力,主要包括以下5个API接口:
■ wx.saveFile(Object)接口 用于保存文件到本地。
■ wx.getSavedFileList(Object)接口 用于获取本地已保存的文件列表。
■ wx.getSaveFileInfo(Object)接口 用于获取本地文件的文件信息。
■ wx.removeSaveFile(Object)接口 用于删除本地存储的文件。
■ wx.openDocument(Object)接口 用于新开页面打开文档,支持格式:doc、xls、ppt、pdf、docx、xlsx、ppts。
1.保存文件
示例代码如下:
saveImg:function()
wx.chooseImage(
count:1,/默认值为9
sizeType:['original',compressed],/可以指定是原图还是压缩图,默认者都有
sourceType:[album',camera’],/可以指定来源是相册还是相机,默认二
success:function(res)var tempFilePaths =res.tempFilePaths0wx.saveFile(tempFilePath:tempFilePathssuccess:function(res)var saveFilePath =res.savedFilePath:
console.log(saveFilePath)
2.获取本地文件列表
示例代码如下:
wx. getSavedFileList({
success:function(res){
that.setData({
fileList:res.fileList
})
}
})
3.获取本地文件的文件信息
示例代码如下:
wx.chooseImage({
count:1,//默认值为9
sizeType:['original','compressed'],
sourceType:['album','camera'],
success:function(res){
var tempFilePaths=res.tempFilePaths[0]
wx.saveFile({
tempFilePath:tempFilePaths,
filePath:saveFilePath,
success:function(res){
var saveFilePath=res.saveFilePath;
wx.getSavedFileInfo({
filePath:saveFilePath,
success:function(res){
console.log(res.size)
}
})
}
})
}
})
4.删除本地文件
示例代码如下:
wx.getSavedFileList({
success:function(res){
if(res.fileList.length>0){
wx.removeSavedFile({
filePath:res.fileList[0].filePath,
complete:function(res){
console.log(res)
}
})
}
}
})
5.打开文档
示例代码如下:
wx.downloadFile({
url:"../images/tu2.png",
success:function(res){
var tempFilePath=res.tempFilePath;
wx.openDocument({
filePath: tempFilePath,
success:function(res){
console.log("打开成功")
}
})
}
})
6.4 本地数据及缓存API
小程序提供了以建值对的形式进行本地数据缓存功能,并且永久存储,但最大不超过10MB,其目的是提高加载速度。数据缓存的接口主要有四个:
■ 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({
Key:'name',
data:'sdy',
success:function(res){
console.log(res)
}
})
2.wx.setStorageSync(key,data)
示例代码如下:
wx.getStorageSync('age','25')
6.4.2 获取数据
1.wx.getStorage(Object)
示例代码如下:
wx.getstorage({ key:'name',
success:function(res){
console.log(res.data)
},
})
2.wx.getStorgeSync(key)
示例代码如下:
try{
var value = wx.getstorageSync('age')
if(value){
console.log("获取成功"+value)
}
catch(e){
console.log("获取失败")
}
6.4.3 删除数据
1.wx.removeStorage(Object)
示例代码如下:
wx.removeStorage({
key:'name',
success:function(res){ console.log("删除成功")
},
fail:function(){
console.log("删除失败")
}
})
2.wx.removeStorageSync(key)
示例代码如下:
try {
wx.removeStorageSync('name')
} catch(e){
//Do something when catch error
}
6.4.4 清空数据
1.wx.clearStorage()
示例代码如下:
wwx.getStorage({
key:'name',
success:function(res){
wx.clearStorage()
//清理本地数据缓存
},
})
2.wx.clearStroageSync()
示例代码如下:
try{
wx.clearStorageSync()
}catch(e){
}
6.5 位置信息API
小程序可以通过位置信息API来获取或显示本地地理位置信息,小程序支持WGS84和GCj02标准,WGS84标准为地球坐标系,是国际上通用的坐标系;GCj02标准是中国国家测绘局制定的地理信息系统的坐标系统,是由WGS84标准系经加密后的坐标系,又称为火星坐标系。主要包括以下三个API接口:
■ wx.getLocation(Object)接口用于获取位置信息。
■ wx.chooseLocation(Object)接口 用于选择位置信息。
■ wx.openLocation(Object)接口用于通过地图显示位置。
6.5.1 获取位置信息
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);},
})
6.5.2 选择位置信息
wx.chooseLocation(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号'})
}
})
6.5.3 显示位置信息
6.6设备相关API
设备相关的接口用于获取设备相关信息,主要包括系统信息、网络状态、拨打电话及扫码等。主要包括以下5个接口API:
■ wx.getSystemInfo(Object)接口、wx.getSystemInfoSync()接口 用于获取系统信息。
■ wx.getNetworkType(Object)接口 用于获取网络类型。
■ wx.onNetworkStatusChange(CallBack)接口 用于监测网络状态改变。
■ wx.makePhoneCall(Object)接口 用于拨打电话。
■ wx.scanCode(Object)接口 用于扫描二维码
6.6.1 获取系统信息
wx. getSystemInfo(Object)接口、wx. getSystemInfoSync()接口分别用于异步和同步获取系统信息。wx. getSystemInfo()接口或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)},})
运行效果图如下:
6.6.2 网络状态
1.获取网络状态
wx. getNetworkType(Object)用于获取网络类型。
示例代码如下:
wx.getNetworkType({
success:function(res){
console.log(res.networkType)},})
2.监听网络状态变化
wx. onNetworkStatusChange(CallBack)接口用于监听网络状态变化,当网络状态变化时,返回当前网络状态类型及是否有网络连接。
示例代码如下:
wx.onNetworkStatusChange(function(res){
console.log("网络是否连接:"+res.isConnected)
console.log("变化后的网络类型"+res.networkType)})
6.6.3 拨打电话
wx. makePhoneCall(Object)接口用于实现调用手机拨打电话。
示例代码如下:
wx.makePhoneCall({
phoneNumber:'18092585093'//需要拨打的电话号码
})
6.6.4 扫描二维码
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)
}
})
运行效果图如下: