微信小程序总结

第一章

认识微信小程序

简介

微信(WeChat) 是腾讯公司于2011 年1月21日推出的一款为智 能终端提供即时通信( Instant Messaging, IM)服务的应用程序。

优势

1.无需安装

2.触手可及

3.用完即走

4.无需卸载

场景

1.以服务商务服务,电子商务和餐饮行业居多,也覆盖了媒体,工具,教育,房地产,旅游,娱乐等行业领域

2.应用场景特点

简单的业务逻辑

低频度的使用场景

我的第一个微信小程序项目

// index.js
const defaultAvatarUrl = 'https://mmbiz.qpic.cn/mmbiz/icTdbqWNOwNRna42FI242Lcia07jQodd2FJGIYQfG0LAJGFxM4FbnQP6yfMxBgJ0F3YRqJCJ1aPAK2dQagdusBZg/0'

Component({
  data: {
    motto: 'Hello World',
    userInfo: {
      avatarUrl: defaultAvatarUrl,
      nickName: '',
    },
    hasUserInfo: false,
    canIUseGetUserProfile: wx.canIUse('getUserProfile'),
    canIUseNicknameComp: wx.canIUse('input.type.nickname'),
  },
  methods: {
    // 事件处理函数
    bindViewTap() {
      wx.navigateTo({
        url: '../logs/logs'
      })
    },
    onChooseAvatar(e) {
      const { avatarUrl } = e.detail
      const { nickName } = this.data.userInfo
      this.setData({
        "userInfo.avatarUrl": avatarUrl,
        hasUserInfo: nickName && avatarUrl && avatarUrl !== defaultAvatarUrl,
      })
    },
    onInputChange(e) {
      const nickName = e.detail.value
      const { avatarUrl } = this.data.userInfo
      this.setData({
        "userInfo.nickName": nickName,
        hasUserInfo: nickName && avatarUrl && avatarUrl !== defaultAvatarUrl,
      })
    },
    getUserProfile(e) {
      // 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认,开发者妥善保管用户快速填写的头像昵称,避免重复弹窗
      wx.getUserProfile({
        desc: '展示用户信息', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
        success: (res) => {
          console.log(res)
          this.setData({
            userInfo: res.userInfo,
            hasUserInfo: true
          })
        }
      })
    },
  },
})
{
  "usingComponents": {
    "navigation-bar": "/components/navigation-bar/navigation-bar"
  }
}
<!--index.wxml-->
<navigation-bar title="Weixin" back="{{false}}" color="black" background="#FFF"></navigation-bar>
<scroll-view class="scrollarea" scroll-y type="list">
  <view class="container">
    <view class="userinfo">
      <block wx:if="{{canIUseNicknameComp && !hasUserInfo}}">
        <button class="avatar-wrapper" open-type="chooseAvatar" bind:chooseavatar="onChooseAvatar">
          <image class="avatar" src="{{userInfo.avatarUrl}}"></image>
        </button>
        <view class="nickname-wrapper">
          <text class="nickname-label">昵称</text>
          <input type="nickname" class="nickname-input" placeholder="请输入昵称" bind:change="onInputChange" />
        </view>
      </block>
      <block wx:elif="{{!hasUserInfo}}">
        <button wx:if="{{canIUseGetUserProfile}}" bindtap="getUserProfile"> 获取头像昵称 </button>
        <view wx:else> 请使用2.10.4及以上版本基础库 </view>
      </block>
      <block wx:else>
        <image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"></image>
        <text class="userinfo-nickname">{{userInfo.nickName}}</text>
      </block>
    </view>
    <view class="usermotto">
      <text class="user-motto">{{motto}}</text>
    </view>
  </view>
</scroll-view>
/**index.wxss**/
page {
  height: 100vh;
  display: flex;
  flex-direction: column;
}
.scrollarea {
  flex: 1;
  overflow-y: hidden;
}

.userinfo {
  display: flex;
  flex-direction: column;
  align-items: center;
  color: #aaa;
  width: 80%;
}

.userinfo-avatar {
  overflow: hidden;
  width: 128rpx;
  height: 128rpx;
  margin: 20rpx;
  border-radius: 50%;
}

.usermotto {
  margin-top: 200px;
}

.avatar-wrapper {
  padding: 0;
  width: 56px !important;
  border-radius: 8px;
  margin-top: 40px;
  margin-bottom: 40px;
}

.avatar {
  display: block;
  width: 56px;
  height: 56px;
}

.nickname-wrapper {
  display: flex;
  width: 100%;
  padding: 16px;
  box-sizing: border-box;
  border-top: .5px solid rgba(0, 0, 0, 0.1);
  border-bottom: .5px solid rgba(0, 0, 0, 0.1);
  color: black;
}

.nickname-label {
  width: 105px;
}

.nickname-input {
  flex: 1;
}

 

 微信开发者工具界面功能介绍

五大区域:工具栏,模拟区,目录文件区,编辑区,调试区

1.工具栏:在工具栏中可以实现多种功能,例如账号的切换,模拟区、编辑区、调试区的显示/隐藏,小程序的编译、预览,切换后台,清理缓存等。

2.模拟区:在模拟区中选择模拟手机的类型、显示比例、网络类型后,模拟器中会显示小程序的运行效果。

3.目录文件区:目录文件区用来显示当前项目的目录结构,单击左上角的“+”按钮可以进行目录和文件的创建,右键单击目录文件区中的文件或目录可以进行“硬盘打开”“重命名”“删除”等相关操作。

4.编辑区:编辑区用来实现对代码的编辑操作,编辑区中支持对.wxml、.wxss、.js及.json 文件的操作,使用组合键能提高代码的编辑效率。常用的组合键

5.调试区:调试区的功能是帮助开发者进行代码调试及非查有问题的区域。小程序系统为开发者提供了9个调试功能模块,分别是Console、Sour rces、Network、Security、Storage、AppData、 Wxml、Sensor和Trace。

第二章

 2.1小程序的基本目录结构

pages 页面文件夹

utils 工具包文件夹

2.1.1 主体文件

微信小程序的主体部分由3个文件组成,该三个文件必须放在项目的主目录中,负责小程序的整体配置,名称是固定的。

app.js 小程序逻辑文件,主要用来注册小程序全局实例,该文件在项目中不可缺少

app.json 小程序公共设置文件,配置小程序全局设置,该文件在项目中不可缺少

app.wxss 小程序主样式文件

2.1.2 页面文件

小程序通常由多个页面组成每个页面包含4个文件,同一页面的4个文件必须有相同的路径和文件名。

.js文件: 页面逻辑文件,在该文件中编写JavaScript代码控制页面的逻辑

.wxml文件: 页面结构文件,用于设计页面布局,数据绑定等,类似HTML页面中的.html文件

.wxss文件: 页面样式表文件,用于定义本业面中用到各类样式表

.json文件: 页面配置文件

2.2小程序的开发框架

小程序MINA框架示意图:

小程序MINA框架将整个系统划分为视图层和逻辑层。

MINA 框架为页面组件提供了bindtap、bindtouchstart等与事件监听相关的属性,并与逻辑层中的事件处理函数绑定在一起,实现面向逻辑层与用户同步交互数据。 

2.2.1 视图层

MINA框架的视图层由WXML与WXSS编写,由组件来进行展示。视图层就是所有.wxml文件与,wxss文件的集合:.wxml文件用于描述页面的结构;.wxss 文件用于描述页面的样式。

2.2.2 逻辑层

逻辑层用于处理事务逻辑。逻辑层就是所有.js脚本文件的集合。微信小程序在逻辑层将数据进行处理后发送给视图层,同时接受视图层的事件反馈。

微信小程序开发框架的逻辑层采用JavaScript编写

2.2.3 数据层

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的API接口,如下:

wx. navigateTo新窗口打开页面。

wx. rediretTo原窗口打开页面。

2.3创建小程序页面

在pages目录下新建一个index目录,并在index目录下新建news.js,news.json,news.wxml,news.wxss空文件 

2.4配置文件

 全局配置项

1. pages配置项

pages配置项接受一个数组,用来指定小程序由哪些页面组成,数组的每一项都是字符串,代表对应页面的“路径”+“文件名”。pages 配置项是必填项。
设置pages 配置项时,应注意以下3点:
(1)数组的第一项用于设定小程序的初始页面。
(2)在小程序中新增或减少页面时,都需要对数组进行修改。
件有相
(3)文件名不需要写文件扩展名。小程序框架会自动寻找路径及对.js、.json、.wxml和.wxss文件进行整合数据绑定。

2.window配置项

window配置项及其描述

3.tabBar配置项 

tabBar配置项及其描述

 tabBar中list选项

4.networkTimeout配置项

networkTimeout配置项

5.debug

debug配置项用于开启开发者工具的调试模式,默认为FALSE。

2.4.2页面配置文件

页面配置文件(*.json)只能设置本页面的窗口表现,而且只能设置window配置项的内容。

2.5逻辑层文件

2.5.1项目逻辑文件

2.5.2 页面逻辑文件

1.设置初始数据

设置初始数据是对页面的第一次数据绑定

2.定义当前页面的生命周期函数
在Page()函数的参数中,可以定义当前页面的生命周期函数。页面的生命周期函数主要有onLoad、onShow、onReady、onHide、onUnload。
onLoad页面加载函数。当页面加载完成后调用该函数。一个页面只会调用一次。
示效果    该函数的参数可以获取wx.navigateTo和wx. redirectTo 及<navigator/>中的 query。
onShow 页面显示函数。当页面显示时调用该函数。每次打开页面都会调用一次。 onReady 页面数据绑定函数。当页面初次数据绑定完成时调用该函数。一个页面只会调用一次,代表页面已经准备就绪,可以和视图层进行交互。
onHide 页面隐藏函数。当页面隐藏时及当navigateTo或小程序底部进行tab切换时调用该函数。
onUnload 页面卸载函数。当页面卸载、进行navigateBack或redirectTo操作时,调用该函数。 

2.6页面结构文件 

1.数据绑定

简单绑定:使用大括号({{{}}})将变量包起来,在页面中直接作为字符串输出使用

运算:在{{}}内可以做一些简单的运算(主要有算术运算,逻辑运算,三元运算,字符串运算等)

示例代码

<view>算术运算:{{age+num}}</view>
<view>逻辑运算:{{age==40}}</view>
<view>三元运算:{{age==1 ? 3 : num}}</view>

 2.条件数据绑定

wx:if条件数据绑定

block wx:if条件数据绑定 

3.列表数据绑定

wx:for

block wx:for

ru.wxml代码:

<view>姓名:{{name}}</view>
<view>年龄:{{age}}</view>
<view>出生日期:
{{birthday[0].year}}年
{{birthday[1].month}}月
{{birthday[2].date}}日
</view>
<view>算术运算:{{age+num}}</view>
<view>逻辑运算:{{age==40}}</view>
<view>三元运算:{{age==1 ? 3 : num}}</view>

<view wx:if="{{age>40}}">1</view>
<view wx:elif="{{age==40}}">2</view>
<view wx:else>3</view>

ru .js代码:

Page({
  data: {
    name:'lwk',
    age:30,
    num:100,
    birthday:[{year:1988},{month:11},{date:18}],
    object:{hobby:'computer'},
    students:[
      {nickname:"Tom",height:180,weight:150},
      {nickname:"Aiz",height:160,weight:100}
    ]
  }
})

app.js代码:

App({
  onLaunch:function(){
    console.log("小程序初始化完成......")
  },
  onShow:function(options){
    console.log("小程序显示");
    console.log(this.data);
    console.log(this.fun());
  },
  onHide:function(){
    console.log("小程序进入后台");
  },
  onError:function(msg){
  },
  fun:function(){
    console.log("在app.js中定义的方法");
  },
  data:'在app.js中定义属性'
})

运行结果图

 

4.模板

定义模板

调用模板

示例代码

<template name="stu">
<view wx:for="{{students}}">
  <text>姓名:{{item.nickname}}</text> 
  <text>升高:{{item.height}}</text> 
  <text>体重:{{item.weight}}</text> 
</view>
</template>
<template is="stu" data="{{students}}"></template>

2.7页面样式文件

wxss常用属性

第三章 

3.1盒子模型

盒子模型结构图

        css中,一个独立的盒子模型由内容(content),内边距(padding),边框(border)和外边距(margin)4个部分组成 

盒子模型元素

 width和height       内容的宽度和高度。

padding - top、padding - right、padding - bottom 和padding-left    上内边距、右内边距、底内边距和左内边距。
border - top、border - right、border - bottom 和 border-left       上边框、右边框、底边框和左边框。
margin - top、margin - right、margin - bottom 和 margin- left        上外边距、右外边距、底外边距和左外边距。

3.2块级元素与行内元素

3.2.1 块级元素

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

3.2.2 行内元素 

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

行内元素的特点如下:

       1.行内元素不能被设置高度和宽度,其高度和宽度由内容决定。
       2. 行内元素内不能放置块级元素,只级容纳文本或其他行内元素。
       3.同一块内,行内元素和其他行内元素显示在同一行。

块级元素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>

运行结果

 行内元素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.2.3行内块元素 

当元素的display属性被设置为inline-block时,元素被设置为行内块元素。行内块元素可以被设置高度、宽度、内边距和外边距。

行内块元素wxml代码
<view>
元素显示方式的<view style="display:inline-block;border:1px solid #f00;margin:10px;padding:10px;width:200px;">块级元素,行内元素和行内块元素</view>三种类型。
</view>

运行结果 

3.3浮动与定位

3.3.1元素浮动与清除

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

{float:none|left|right;}

其属性值解析如下:

  1. none--默认值,表示元素不浮动;
  2. left--元素向左浮动;
  3. right--元素向右浮动; 

box1,box2,box3 没浮动代码

<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>

运行结果

        通过示例我们发现,当box3左浮动后,父元素的边框未能包裹box3 元素。这时,可以通过清除浮动来解决。 

        由于浮动元素不再占用原文档流的位置,因此它会对页面中其他元素的排列产生影响。在CSS中,clear 属性用于清除浮动元素对其他元素的影响,其基本格式如下:

{clear:left|right|both|none}

其属性值解析如下:

  1. left--清除左边浮动的影响,也就是不允许左侧有浮动元素;
  2. right--清除右边浮动的影响,也就是不允许右侧有浮动元素;
  3. both--同时清除左右两侧浮动的影响;
  4. none--不清除浮动。

box3清除左浮动

<view>box1 box2 box3左浮动 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="clearfloat">
  <view style ="float:left;border:1px solid #0f0">box1</view>
  <view style ="float:left;border:1px solid #0f0">box2</view>
  <view style ="float:left;border:1px solid #0f0">box3</view>
</view>

运行结果

3.3.2元素定位

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

{position:static|relative|absolute|fixed}

具体属性值如下:

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

三个元素均未定位代码

<!--三个元素均未定位-->
<view style ="border:1px solid #0f0;width:100px;height:100px">box1</view>
<view style ="border:1px solid #0f0;width:100px;height:100px">box2</view>
<view style ="border:1px solid #0f0;width:100px;height:100px">box3</view>

 运行结果

相对定位

<!--box2元素相对定位-->
<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>

运行结果

如果将box1,box2,box3的父级元素采用相对定位,将box2采用绝对定位 

<!--如果将box1,box2,box3的父级元素采用相对定位,将box2采用绝对定位-->
<view style ="position:relative;top:50px;left:50px; border:1px solid #00f">
<view style ="border:1px solid #0f0;width:100px;height:100px">box1</view>
<view style ="border:1px solid #0f0;width:100px;height:100px;position:absolute;left:30px;top:30px">box2</view>
<view style ="border:1px solid #0f0;width:100px;height:100px">box3</view>
</view>

运行结果

 如果将box1,box2,box3的父级元素采用相对定位,将box2采用固定定位 

<!--如果将box1,box2,box3的父级元素采用相对定位,将box2采用固定定位-->
<view style ="position:relative;top:50px;left:50px; border:1px solid #00f">
<view style ="border:1px solid #0f0;width:100px;height:100px">box1</view>
<view style ="border:1px solid #0f0;width:100px;height:100px;position:fixed;left:30px;top:30px">box2</view>
<view style ="border:1px solid #0f0;width:100px;height:100px">box3</view>
</view>

 运行结果

 3.4 flex布局

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

        容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end;交叉轴的开始位置叫做 cross start,结束位置叫做 cross end。

        项目默认沿主轴排列。单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size。flex布局模型如图所示:

         设置 display属性可以将一个元素指定为flex布局,设置 flex-direction 属性可以指定主轴方向。主轴既可以是水平方向,也可以是垂直方向。

3.4.1容器属性 

flex容器支持的属性

         1.display 用来指定元素是否为 flex布局,语法格式为:

{display:flex|inline-flex;}

 其中,flex--块级flex布局,该元素变为弹性盒子;
        inline-flex行内flex布局,行内容器符合行内元素的特征,同时在容器内又符合flex 布局规范。设置了 flex 布局之后,子元素的float、clear和 vertical-align 属性将失效。

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

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

 其中

  1. row--主轴为水平方向,起点在左端,当元素设置为flex布局时,主轴默认为row;
  2. row-reverse--主轴为水平方向,起点在右端;
  3. column--主轴为垂直方向,起点在顶端;
  4. column-reverse--主轴为垂直方向,起点在底端。

 元素在不同主轴方向下的显示效果如图

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

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

其中 

        nowrap--不换行,默认值;
        wrap--换行,第一行在上分;
        wrap-reverse--换行,第一行在下方。
         当设置换行时,还需要设置 align-item属性来配合自动换行,但align-item的值不能为“ stretch”。

flex-wrap不同值的显示效果如下图所示:

4.flex-flow是flex-direction 和flex-wrap 的简写形式, 默认值为row nowrap。 语法格式如下: 

{flex-flow:<flex-direction>||<flex-wrap>;}

5.justify-content 用于定义项目在主轴上的对齐方式。 语法格式如下: 

{justify-content:flex-start|flex-end|center|space-between|space-around;}

justify-content———与主轴方向有关, 默认主轴水平对齐, 方向从左到右;
flex-start———左对齐, 默认值;
flex-end———右对齐; 
center———居中;
space-between———两端对齐, 项目之间的间隔都相等;
space-around———每个项目两侧的间隔相等。

如下图所示为 justify-content不同值的显示效果。

 

6.align-items用于指定项目在交叉轴上的对齐方式, 语法格式如下: 

{align-items:flex-start|flex-end|center|baseline|stretch;}

其中 

align-items———与交叉轴方向有关, 默认交叉由上到下;
flex-start———交叉轴起点对齐;
flex-end———交叉轴终点对齐;
center———交叉轴中线对齐;
baseline———项目根据它们第一行文字的基线对齐;
stretch———如果项目未设置高度或设置为auto, 项目将在交叉轴方向拉伸填充容器, 此为默认值。

wxml代码 

<view class ="cont1">
<view class="item">1</view>
<view class="item iten2">2</view>
<view class="item item3">3</view>
<view class="item tiem4">4</view>
</view>

wxss代码

.cont1{
  display:flex;
  flex-direction:row;
  align-items:baseline;
}
.item{
  background-color:#ccc;
  border:1px solid #f00;
  height:100px;
  width:50px;
  margin:2px;
}
.item2{
  height:80px;
}
.item3{
  display:flex;
  height:50px;
  align-items:flex-end;
}
.item4{
  height:120px;
}

运行结果

7. align-content 用来定义项目有多根轴线(出现换行后) 在交叉轴上的对齐方式, 如果只有一根轴线, 该属性不起作用。 语法格式如下:

{align-content;flex-start|flex-end|center|space-between|space-around|stretch}

apace-between——与交叉轴两端对齐, 轴线之间的间隔平均分布;
space-around——每根轴线两侧的间隔都相等, 轴线之间的间隔比轴线与边框间隔大一倍。 其余各属性值的含义与align-items属性的含义相同。
        其余个属性值的含义与align-items属性的含义相同。

        如下图所示为align-content不同值的显示效果。 

3.4.2项目属性 

容器内的项目支持6个属性,其名称和功能如下图所示

1.order属性定义项目的排列顺序, 数值越小, 排列越靠前, 默认值为0。 语法格式如下: 

.item{order:<number>;}

示例

wxml代码

<view class="cont">
<view class="item" >1</view>
<view class="item" >2</view>
<view class="item" >3</view>
<view class="item" >4</view>
</view>
<view class="cont">
<view class="item" style="order: 1;">1</view>
<view class="item" style="order: 3;">2</view>
<view class="item" style="order: 2;">3</view>
<view class="item" >4</view>
</view>

wxss代码 

.cont{
  display: flex;
  flex-direction: row;
  align-items: baseline;
}
.item{
  width: 50px;
  height: 50px;
  border: 1px solid #000;
  background-color:skyblue;
  margin: 10px;
}

 运行结果

2.flex-grow 定义项目的放大比例, 默认值为0, 即不放大。 语法格式如下: 

.item{flex-grow:<number>;}

示例代码

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>
<view class="cont">
<view class="item">1</view>
<view class="item "style="flex-grow:1">2</view>
<view class="item "style="flex-grow:2">3</view>
<view class="item">4</view>
</view>

wxss代码

.cont{
  display: flex;
  flex-direction: row;
  align-items: baseline;
}
.item{
  width: 50px;
  height: 50px;
  border: 1px solid #000;
  background-color:skyblue;
  margin: 10px;
}

运行结果

3.flex-shrink用来定义项目的缩小比例, 默认值为1, 如果空间不足, 该项目将被缩小。语法格式如下:

{flex-shrink:<number>;}

示例代码

wxml代码

<view class="cont">
<view class="item">1</view>
<view class="item">2</view>
<view class="item">3</view>
<view class="item">4</view>
</view>
<view class="cont1">
<view class="item">1</view>
<view class="item "style="flex-shrink:1">2</view>
<view class="item "style="flex-shrink:2">3</view>
<view class="item"style="flex-shrink:3">4</view>
</view>

wxss代码

.cont,.cont1{
  display: flex;
  flex-direction: row;
  align-items: baseline;
}
.item{
  width: 50px;
  height: 50px;
  border: 1px solid #000;
  background-color:skyblue;
  margin: 10px;
}
.cont .item{
  width: 70px;
}
.cont1 .item{
  width: 120px;
}

运行结果

4.flex-basis属性用来定义伸缩项目的基准值, 剩余的空间将按比例进行缩放, 它的默认值为auto (即项目的本来大小)。 语法格式如下: 

{flex-basis:<numner>|auto;}

示例代码

wxml代码

<view class="cont">
<view class="item">1</view>
<view class="item">2</view>
<view class="item">3</view>
<view class="item">4</view>
</view>
<view class="cont">
<view class="item">1</view>
<view class="item "style="flex-basis:100px">2</view>
<view class="item "style="flex-basis:200px">3</view>
<view class="item">4</view>
</view>

 wxss代码

.cont{
  display: flex;
  flex-direction: row;
  align-items: baseline;
}
.item{
  width: 50px;
  height: 50px;
  border: 1px solid #000;
  background-color:skyblue;
  margin: 10px;
}

运行结果

5.flex属性是flex-grow、flex-shrink 和flex-basis 的简写, 其默认值分别为0、1、auto。语法格式如下: 

{<flex-grow>|<flex-shrink>|<flex-basis>;}

6.align-self属性用来指定单独的伸缩项目在交叉轴上的对齐方式。 该属性会重写默认的对齐方式。 语法格式如下:

{aligin-self:auto|flex-start|flex-end|center|baseline|stretch;}

        在该属性值中, 除了auto以外, 其余属性值和容器align-items的属性值完全一致。 auto表示继承容器al

3.1盒子模型

盒子模型结构图

        css中,一个独立的盒子模型由内容(content),内边距(padding),边框(border)和外边距(margin)4个部分组成 

盒子模型元素

 width和height       内容的宽度和高度。

padding - top、padding - right、padding - bottom 和padding-left    上内边距、右内边距、底内边距和左内边距。
border - top、border - right、border - bottom 和 border-left       上边框、右边框、底边框和左边框。
margin - top、margin - right、margin - bottom 和 margin- left        上外边距、右外边距、底外边距和左外边距。

3.2块级元素与行内元素

3.2.1 块级元素

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

3.2.2 行内元素 

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

行内元素的特点如下:

       1.行内元素不能被设置高度和宽度,其高度和宽度由内容决定。
       2. 行内元素内不能放置块级元素,只级容纳文本或其他行内元素。
       3.同一块内,行内元素和其他行内元素显示在同一行。

块级元素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>

运行结果

 行内元素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.2.3行内块元素 

当元素的display属性被设置为inline-block时,元素被设置为行内块元素。行内块元素可以被设置高度、宽度、内边距和外边距。

行内块元素wxml代码
<view>
元素显示方式的<view style="display:inline-block;border:1px solid #f00;margin:10px;padding:10px;width:200px;">块级元素,行内元素和行内块元素</view>三种类型。
</view>

运行结果 

3.3浮动与定位

3.3.1元素浮动与清除

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

{float:none|left|right;}

其属性值解析如下:

  1. none--默认值,表示元素不浮动;
  2. left--元素向左浮动;
  3. right--元素向右浮动; 

box1,box2,box3 没浮动代码

<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>

运行结果

        通过示例我们发现,当box3左浮动后,父元素的边框未能包裹box3 元素。这时,可以通过清除浮动来解决。 

        由于浮动元素不再占用原文档流的位置,因此它会对页面中其他元素的排列产生影响。在CSS中,clear 属性用于清除浮动元素对其他元素的影响,其基本格式如下:

{clear:left|right|both|none}

其属性值解析如下:

  1. left--清除左边浮动的影响,也就是不允许左侧有浮动元素;
  2. right--清除右边浮动的影响,也就是不允许右侧有浮动元素;
  3. both--同时清除左右两侧浮动的影响;
  4. none--不清除浮动。

box3清除左浮动

<view>box1 box2 box3左浮动 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="clearfloat">
  <view style ="float:left;border:1px solid #0f0">box1</view>
  <view style ="float:left;border:1px solid #0f0">box2</view>
  <view style ="float:left;border:1px solid #0f0">box3</view>
</view>

运行结果

3.3.2元素定位

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

{position:static|relative|absolute|fixed}

具体属性值如下:

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

三个元素均未定位代码

<!--三个元素均未定位-->
<view style ="border:1px solid #0f0;width:100px;height:100px">box1</view>
<view style ="border:1px solid #0f0;width:100px;height:100px">box2</view>
<view style ="border:1px solid #0f0;width:100px;height:100px">box3</view>

 运行结果

相对定位

<!--box2元素相对定位-->
<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>

运行结果

如果将box1,box2,box3的父级元素采用相对定位,将box2采用绝对定位 

<!--如果将box1,box2,box3的父级元素采用相对定位,将box2采用绝对定位-->
<view style ="position:relative;top:50px;left:50px; border:1px solid #00f">
<view style ="border:1px solid #0f0;width:100px;height:100px">box1</view>
<view style ="border:1px solid #0f0;width:100px;height:100px;position:absolute;left:30px;top:30px">box2</view>
<view style ="border:1px solid #0f0;width:100px;height:100px">box3</view>
</view>

运行结果

 如果将box1,box2,box3的父级元素采用相对定位,将box2采用固定定位 

<!--如果将box1,box2,box3的父级元素采用相对定位,将box2采用固定定位-->
<view style ="position:relative;top:50px;left:50px; border:1px solid #00f">
<view style ="border:1px solid #0f0;width:100px;height:100px">box1</view>
<view style ="border:1px solid #0f0;width:100px;height:100px;position:fixed;left:30px;top:30px">box2</view>
<view style ="border:1px solid #0f0;width:100px;height:100px">box3</view>
</view>

 运行结果

 3.4 flex布局

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

        容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end;交叉轴的开始位置叫做 cross start,结束位置叫做 cross end。

        项目默认沿主轴排列。单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size。flex布局模型如图所示:

         设置 display属性可以将一个元素指定为flex布局,设置 flex-direction 属性可以指定主轴方向。主轴既可以是水平方向,也可以是垂直方向。

3.4.1容器属性 

flex容器支持的属性

         1.display 用来指定元素是否为 flex布局,语法格式为:

{display:flex|inline-flex;}

 其中,flex--块级flex布局,该元素变为弹性盒子;
        inline-flex行内flex布局,行内容器符合行内元素的特征,同时在容器内又符合flex 布局规范。设置了 flex 布局之后,子元素的float、clear和 vertical-align 属性将失效。

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

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

 其中

  1. row--主轴为水平方向,起点在左端,当元素设置为flex布局时,主轴默认为row;
  2. row-reverse--主轴为水平方向,起点在右端;
  3. column--主轴为垂直方向,起点在顶端;
  4. column-reverse--主轴为垂直方向,起点在底端。

 元素在不同主轴方向下的显示效果如图

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

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

其中 

        nowrap--不换行,默认值;
        wrap--换行,第一行在上分;
        wrap-reverse--换行,第一行在下方。
         当设置换行时,还需要设置 align-item属性来配合自动换行,但align-item的值不能为“ stretch”。

flex-wrap不同值的显示效果如下图所示:

4.flex-flow是flex-direction 和flex-wrap 的简写形式, 默认值为row nowrap。 语法格式如下: 

{flex-flow:<flex-direction>||<flex-wrap>;}

5.justify-content 用于定义项目在主轴上的对齐方式。 语法格式如下: 

{justify-content:flex-start|flex-end|center|space-between|space-around;}

justify-content———与主轴方向有关, 默认主轴水平对齐, 方向从左到右;
flex-start———左对齐, 默认值;
flex-end———右对齐; 
center———居中;
space-between———两端对齐, 项目之间的间隔都相等;
space-around———每个项目两侧的间隔相等。

如下图所示为 justify-content不同值的显示效果。

 

6.align-items用于指定项目在交叉轴上的对齐方式, 语法格式如下: 

{align-items:flex-start|flex-end|center|baseline|stretch;}

其中 

align-items———与交叉轴方向有关, 默认交叉由上到下;
flex-start———交叉轴起点对齐;
flex-end———交叉轴终点对齐;
center———交叉轴中线对齐;
baseline———项目根据它们第一行文字的基线对齐;
stretch———如果项目未设置高度或设置为auto, 项目将在交叉轴方向拉伸填充容器, 此为默认值。

wxml代码 

<view class ="cont1">
<view class="item">1</view>
<view class="item iten2">2</view>
<view class="item item3">3</view>
<view class="item tiem4">4</view>
</view>

wxss代码

.cont1{
  display:flex;
  flex-direction:row;
  align-items:baseline;
}
.item{
  background-color:#ccc;
  border:1px solid #f00;
  height:100px;
  width:50px;
  margin:2px;
}
.item2{
  height:80px;
}
.item3{
  display:flex;
  height:50px;
  align-items:flex-end;
}
.item4{
  height:120px;
}

运行结果

7. align-content 用来定义项目有多根轴线(出现换行后) 在交叉轴上的对齐方式, 如果只有一根轴线, 该属性不起作用。 语法格式如下:

{align-content;flex-start|flex-end|center|space-between|space-around|stretch}

apace-between——与交叉轴两端对齐, 轴线之间的间隔平均分布;
space-around——每根轴线两侧的间隔都相等, 轴线之间的间隔比轴线与边框间隔大一倍。 其余各属性值的含义与align-items属性的含义相同。
        其余个属性值的含义与align-items属性的含义相同。

        如下图所示为align-content不同值的显示效果。 

3.4.2项目属性 

容器内的项目支持6个属性,其名称和功能如下图所示

1.order属性定义项目的排列顺序, 数值越小, 排列越靠前, 默认值为0。 语法格式如下: 

.item{order:<number>;}

示例

wxml代码

<view class="cont">
<view class="item" >1</view>
<view class="item" >2</view>
<view class="item" >3</view>
<view class="item" >4</view>
</view>
<view class="cont">
<view class="item" style="order: 1;">1</view>
<view class="item" style="order: 3;">2</view>
<view class="item" style="order: 2;">3</view>
<view class="item" >4</view>
</view>

wxss代码 

.cont{
  display: flex;
  flex-direction: row;
  align-items: baseline;
}
.item{
  width: 50px;
  height: 50px;
  border: 1px solid #000;
  background-color:skyblue;
  margin: 10px;
}

 运行结果

2.flex-grow 定义项目的放大比例, 默认值为0, 即不放大。 语法格式如下: 

.item{flex-grow:<number>;}

示例代码

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>
<view class="cont">
<view class="item">1</view>
<view class="item "style="flex-grow:1">2</view>
<view class="item "style="flex-grow:2">3</view>
<view class="item">4</view>
</view>

wxss代码

.cont{
  display: flex;
  flex-direction: row;
  align-items: baseline;
}
.item{
  width: 50px;
  height: 50px;
  border: 1px solid #000;
  background-color:skyblue;
  margin: 10px;
}

运行结果

3.flex-shrink用来定义项目的缩小比例, 默认值为1, 如果空间不足, 该项目将被缩小。语法格式如下:

{flex-shrink:<number>;}

示例代码

wxml代码

<view class="cont">
<view class="item">1</view>
<view class="item">2</view>
<view class="item">3</view>
<view class="item">4</view>
</view>
<view class="cont1">
<view class="item">1</view>
<view class="item "style="flex-shrink:1">2</view>
<view class="item "style="flex-shrink:2">3</view>
<view class="item"style="flex-shrink:3">4</view>
</view>

wxss代码

.cont,.cont1{
  display: flex;
  flex-direction: row;
  align-items: baseline;
}
.item{
  width: 50px;
  height: 50px;
  border: 1px solid #000;
  background-color:skyblue;
  margin: 10px;
}
.cont .item{
  width: 70px;
}
.cont1 .item{
  width: 120px;
}

运行结果

4.flex-basis属性用来定义伸缩项目的基准值, 剩余的空间将按比例进行缩放, 它的默认值为auto (即项目的本来大小)。 语法格式如下: 

{flex-basis:<numner>|auto;}

示例代码

wxml代码

<view class="cont">
<view class="item">1</view>
<view class="item">2</view>
<view class="item">3</view>
<view class="item">4</view>
</view>
<view class="cont">
<view class="item">1</view>
<view class="item "style="flex-basis:100px">2</view>
<view class="item "style="flex-basis:200px">3</view>
<view class="item">4</view>
</view>

 wxss代码

.cont{
  display: flex;
  flex-direction: row;
  align-items: baseline;
}
.item{
  width: 50px;
  height: 50px;
  border: 1px solid #000;
  background-color:skyblue;
  margin: 10px;
}

运行结果

5.flex属性是flex-grow、flex-shrink 和flex-basis 的简写, 其默认值分别为0、1、auto。语法格式如下: 

{<flex-grow>|<flex-shrink>|<flex-basis>;}

6.align-self属性用来指定单独的伸缩项目在交叉轴上的对齐方式。 该属性会重写默认的对齐方式。 语法格式如下:

{aligin-self:auto|flex-start|flex-end|center|baseline|stretch;}

        在该属性值中, 除了auto以外, 其余属性值和容器align-items的属性值完全一致。 auto表示继承容器align-items的属性, 如果没有父元素, 则等于stretch (默认值)。 

ign-items的属性, 如果没有父元素, 则等于stretch (默认值)。 

第四章 

 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和swiper组件。

  4.2.1 view

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

 通过<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>
  <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 style="text-align:center">左右混合布局</view>
  <view style="display:flex">
    <view style="border:1px solid #f00;flex-grow:1">1</view>
    <view style="display:flex;flex-direction:column;flex-grow:1">
      <view style="border:1px solid #f00;flex-grow:1">2</view>
      <view style="border:1px solid #f00;flex-grow:2">3</view>
    </view>
  </view>

运行结果 

4.2.2scroll-view 

scroll-view组件属性 

[注意]
(1)在使用竖向滚动时,如果需要给scroll - view 组件设置一个固定高度,可以通过 WXSS设置 height来完成。
(2)请勿在 scroll -view组件中使用textarea、map、canvas、video组件。(3) scroll -into -view属性的优先级高于scr oll-top。
(4)由于在使用scroll-view组件时会阻止页面回弹,所以在scroll - view组件滚动时无法触发 onPullDownRefresh。
(5)如果要实现页面下拉刷新,请使用页面的滚动,而不是设置scroll-view组件。这样做,能通过单击顶部状态栏回到页面顶部。 

示例代码

//index.wxml
<view class="container" style="padding: 0rpx;">
<!--垂直滚动,这里必须设置高度-->
<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">
    <loading hidden="{{hidden}}"bindchange="loadingChange">
    加载中...
    </loading>
  </view>
</view>
 
//index.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.setDate({
    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
    },
    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,
    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");
  }
})
//index.wxss
.userinfo{
  display: flex;
  flex-direction: column;
  align-items: center;
}
.userinfo-avatar{
  width: 128rpx;
  height: 128rpx;
  margin: 20rpx;
  border-radius: 50%;
}
.userinfo-nickname{
  colro:#aaa;
}
.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.3swiper 

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

swiper组件的属性如表所示。

示例代码

wxml代码

<swiper indicator-dots='true' autoplay='true' interval='5000' duration='1000'>
  <swiper-item>
    <image src="/image/tu.jpg" style="width: 100%;"></image>
  </swiper-item>
  <swiper-item>
    <image src="/image/xiao.jpeg" style="width: 100%;"></image>
  </swiper-item>
  <swiper-item>
    <image src="/image/xion.jpeg" style="width: 100%;"></image>
  </swiper-item>
</swiper>

运行结果

4.3基础内容组件 

        基础内容组件包括icon,text和progress,主要用于在视图页面中展示图标,文本和进度条等信息。

4.3.1icon

        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_on_circle","info","warn","waiting","cancel","download","search","clear"],
    iconSize:[10,20,30,40],
    iconColor:['#f00','#0f0','#00f']
  }
})

 运行结果

4.3.2text

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

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}}">&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="{{19+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>

js代码

Page({
  data:{
      x:[1,2,3,4,5],
      y:[1,2,3,4,5,6,7,8,9]
  }
})

 运行结果

4.3.3progress 

        progress组件用于显示进度状态,如资源加载,用户资料完成度,媒体资源播放进度等。

progress组件属于块级元素属性如表

progrss组件属性

实例代码

wxml代码

<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.1button

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

button组件属性 

 示例代码

wxml代码

<button type="default">type:default</button>
<button type="primary">type:primary</button>
<button type="warn">type:warn</button>
<button type="default" bindtap='buttonSize' size="{{size}}">改变Size</button>
<button type="default" bindtap='buttonPlain' plain="{{plain}}">改变plain</button>
<button type="default" bindtap='buttonLoading' loading="{{loading}}">改变loading显示</button>

js代码

Page({
  data:{
      size:'default',
      plain:'false',
      loading:'false'
  },
  buttonSize:function(){
    if(this.data.size =="default")
    this.setData({size:'mini'})
    else
    this.setData({size:'default'})
  },
  buttonPlain:function(){
    this.setData({plain:!this.data.plain})
  },
  buttonLoading:function(){
    this.setData({loading:! this.data.loading})
  }
})

 运行结果

4.4.2radio

        单选框用来从一组选项中选取一个选项。在小程序中,单选框由<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>
<radio-group class="radio-group" bindchange="radiochange">
  <label class="radio" wx:for="{{radios}}">
    <radio value="{{item.value}}" checked="{{item.checked}}"/>{{item.name}}
  </label>
</radio-group>
<view>你的选择:{{lang}}</view>

 js代码

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

运行结果

4.4.3checkbox

        复选框用于从一组选项中选取多个选项,小程序中复选框由< checkbox-group/>(多项择器)和<checkbox/>(多选项目)两个组件组合而成。一个<checkbox - group/>表示一组选项,可以在一组选项中选中多个选项。它们的属性如表

checkbox-growp及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({
  city:"",
  data:{
    citys:[
      {name:'km',value:'昆明'},
      {name:'sy',value:'三亚'},
      {name:'zh',value:'珠海',checked:'true'},
      {name:'d1',value:'大连'}
    ]
  },
  cityChange:function(e){
    console.log(e.detail.value);
    var city =e.detail.value;
    this.setData({city:city})
  }
})

运行结果 

4.4.4switch 

        switch组件的作用类似于开关选择器,其属性如表

switch组件属性

示例代码

wxml代码

<view>
  <switch bindchange="swl">{{var1}}</switch>
</view>
<view>
  <switch checked bindchange="sw2">{{var2}}</switch>
</view>
<view>
  <switch type="checkbox" bindchange="sw3">{{var3}}</switch>
</view>

js代码

Page({
  data:{
    var1:'关',
    var2:'开',
    var3:'未选'
  },
  sw1: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.5sider

        sider组件为滑动选择器,可以通过滑动来设置相应的值,其属性如表

sider组件属性

示例代码

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 bimndchange='sliderchange'></slider>
<icon type="success"Size='{{size}}'></icon>

js代码

Page({
    data:{
      size:'20'
    },
    sliderchange:function(e){
      this.setData({size:e.detail.value})
    }
  })

运行结果

4.4.6picker

        picker组件为滚动选择器,当用户点击picker组件时,系统从底部弹出选择器供用户选择。picker组件目前支持5种选择器,分别是:selector(普通选择器)、multiSelector(多列选择器)、time(时间选择器)、date(日期选择器)、region(省市选择器)。

1.普通选择器

picker组件中selector选择器属性

示例代码

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].name}}</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.多列选择器

        多列选择器(mode=multiSelector)允许用户从不同列中选择不同的选择项,其选项是二维数组或数组对象。多列选择器的属性如下表所示。

示例代码

wxml代码

<view>多列选择器</view>
<picker mode="multiSelector" bindchange="bindMultiPickerChange" bindcolumnchange="bindMultiPickerChange" 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.multiArryay,
      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);
},
})

运行结果

3.时间选择器,日期选择器 

时间选择器(mode=time)可以用于从提供的时间选项中选择相应的时间,其属性如下表所示。

日期选择器(mode=date)可以用于从提供的日期选项中选择相应的日期,其属性如下表所示。

示例代码

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.省市选择器

省市选择器(mode=region)是小程序的新版本提供的选择快速地区的组件,其属性如下表所示。

示例代码

wxml代码

<picker mode="region" value="{{region}}" custom-item="{{customitem}}" bindchange="changeregion">
  选择省市区:{{region[0]}},{{region[1]}},{{region[2]}}
</picker>

js代码

Page({
  data:{
    region:['陕西省','西安市','长安区'],
    customitem:'全部'
  },
  changeregion:function(e){
    console.log(e.detail.value)
    this.setData({
      region:e.detail.value
    })
  }
})

运行结果

4.4.7picker-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>
 

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.8input

        input组件为输入框,用户可以输入相应的信息,其属性如下表所示。

示例代码

wxml代码 

<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
    })
  },
  bindKeyInput:function(e){
  this.setData({
  inputValue:e.detail.value
  })
},
  bindReplaceInput:function(e){
  var value =e.detail.value
  var pos =e.detail.cursor
  if(pos!=-1){
  //光标在中间
  var left =e.detail.value.slice(0,pos)
  //计算光标的位置
  pos =left.replace(/11/g,'2').length
  }
  //直接返回对象,可以对输入进行过滤处理,同时可以控制光标的位置
  return{
value:value.replace(/11/g,'2'),
Cursor:pos
  }
//或者直接返回字符串,光标在最后边
//return value.replace( /11 /g,'2'),
  }
})

运行结果 

4.4.9textarea

        textarea组件为多行输入框文件,可以实现多行内容的输入。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 bindtap="bindButtonTap">使得输入框获取焦点</button>
<form bindsubmit="bindFormsubmit">
  <textarea placeholder="form中的textarea" name="textarea"/>
  <button form-type="submit">提交</button>
</form>
 

js代码


Page({
  data:{
    height:10,
    focus:false
  },
  bindButtonTap:function(){
    this.setData({
      focus:true
    })
  },
  bindTextAreaBlur:function(e){
    console.log(e.detail.value)
  },
  bindFormSubmit:function(e){
    console.log(e.detail.value.textarea)
  }

 运行结果

4.4.10label

        label组件为标签组件,用于提升表单组件的可用性。label组件支持使用for属性找到对应的id,或者将控件放在该标签下,当点击label组件时,就会触发对应的控件。for属性的优先级高于内部控件,内部有多个控件的时候默认触发第一个控件。目前,label组件可以绑定的控件有<button/ >、<checkbox/ >、<radio/>、<switch/ >。

示例代码

wxml代码

<!-- 单击中国不能选择/取消复选框 -->
<view><checkbox></checkbox>中国</view>
<!-- 单击"中国"可以选择/取消复选框 -->
<view><label><checkbox></checkbox>中国</label></view>
<!-- 使用for找到对应的id -->
<checkbox-group bindchange="cityChange">
<label wx:for="{{citys}}">
<checkbox value="{{item.value}}" checked='{{item.checked}}'>{{item.value}}</checkbox>
</label>
</checkbox-group>
<view>您的选择是:{{city}}</view>
 

js代码

Page({
  city:"",
  data:{
    citys: [
      {name:'km',value:'昆明'},
      {name:'sy',value:'三亚'},
      {name:'zh',value:'珠海',checked:'true'},
      {name:'dl',value:'大连'}
    ]
  },
  cityChange:function(e){
    console.log(e.detail.value);
    var city=e.detail.value;
    this.setData({city:city})
  }
})

 运行结果

 4.4.11form

        form组件为表单组件,用来实现将组件内的用户输入信息进行提交。当<form/ >表单中formType为submit的<button/ >组件时,会将表单组件中的value值进行提交。form组件的属性如下表所示。

示例代码

wxml代码

<form bindsubmit="formsubmit" bindreset="formReset">
<view>姓名:
  <input type="text" name="xm"/>
</view>
<view>性别:
  <radio-group name="xb">
    <label>
    <radio value="男" checked/>男
    </label>
    <label>
    <radio value="女" checked/>女
    </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 formType='reset'>重置</button>
</form>

js代码

Page({
  hobby:"",
  data:{
    hobbies:[
      {name:'jsj',value:'计算机',checked:'true'},
      {name:'music',value:'听音乐'},
      {name:'game',value:'玩电竞'},
      {name:'sulm',value:'游泳',checked:'true'}
    ]
  },
  formSubmit:function(e){
    console.log('form发生了submit事件,携带数据为:'.e.detail.value)
  },
  formReset:function(){
    console.log('form发生了reset事件')
  }
})

运行结果

4.5 多媒体组件 

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

4.5.1image

        image组件为图像组件,与HTML中的 <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/Ai.png" style="width: 100%"/>
</block>

js代码

Page({
  data:{
    modes:['scaleToFill','aspectFit','aspectFill','widthFix']
  }
})

运行结果

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/Ai.png" style="width: 100%"/>
</block>

js代码

Page({
  data:{
    modes:['top','center','bottom','left','right','top_left','top_right','bottom_left','bottom_right']
  }
})

运行结果

4.5.2audio

        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代码

Page({
  data:{
    poster:'http://y.gtimg.cn/music/photo_new/T002R300x300M000003rsKF44GyaSk.jpg? max_age=2592000',
    name:'此时此刻',
    autor:'许巍',
    src:'http://ws.stream.qqmusic.qq.com/M500001VfvsJ21xFqb.mp3?  guid=ffffffff82def4af4b12b3cd9337d5e7&uin=346897220&vkey=6292F51E1E384E061FF02C31F716658E5C81F5594D561F2E88B854E81CAAB7806D5E4F103E55D33C16F3FAC506D1AB172DE8600B37E43FAD&fromtag=46',
  },
  play:function(){
    this.setData({
      action:{
        method:'play'
      }
    })
  },
  pause:function(){
    this.setData({
      action:{
        method:'pause'
      }
    })
  },
  playRate:function(){
    this.setData({
      action:{
        method:'setplaybackRate',
        data:10//速率
      }
    })
    console.log('当前速率:'+this.data.action.data)
  },
  currentTime:function(e){
    this.setData({
      action:{
        method:'setCurrentTime',
        data:120
 
      }
    })
  }
})

运行结果

4.5.3video

        video组件用来实现视频的播放、暂停等。视频的默认宽度为300px,高度为225px,video组件的属性如下表所示。

示例代码

wxml代码

<video src="{{src}}" controls=""></video>
<view class="btn-area">
<button bindtap="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.4camera

        camera组件为系统相机组件,可以实现拍照或录像功能。在一个页面中,只能有一个camera 组件。在开发工具中运行时,使用电脑摄像头实现拍照或录像;在手机中运行时,使用手机前后摄像头实现拍照或录像。camera组件的属性如下表所示。

示例代码

wxml代码

<camera device-position="back" flash="off" binderror="error" style="width: 100%;height: 350px;">
</camera>
<button type="primary" bindtap="takePhoto">拍照</button>
<view>预览</view>
<image mode="widthFix" src="{{src}}"></image>

js代码

Page({
  takePhoto(){
    const ctx=wx.createCameraContext()//创建并返回camera上下文对象
    ctx.takePhoto({
      quality:'high',
      success:(res)=>{
        this.setData({
          src:res.tempImagePath
        })
      }
    })
  },
  error(e){
    console.log(e.detail)
  }
})

运行结果

4.6其他组件

        在小程序中,除了前面介绍的组件以来,map组件和canvas组件比较常用。

4.6.1map

        map组件用于在页面中显示地图或路径,常用于LBS(基于位置服务)或路径指引,功能相对百度地图、高德地图较简单,目前具备绘制图标、路线、半径等能力,不能在croll-view、swiper、picker-view、movable-view组件中使用。

map组件的属性如下表所示。

map组件的markers属性用于在地图上显示标记的位置,其相关属性如下表所示。

        map组件的 polyline属性用来指定一系列坐标点,从数组第一项连线到最后一项,形成一条路线,可以指定线的颜色、宽度、线型以及是否带箭头等,其相关属性如下表所示。

示例代码

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代码

Page({
  data:{
    markers:[{
      iconPath:"/image/Ai.png",
      id:0,
      longitude:"108.9290",
      latitude:"34.1480",
      width:50,
      height:50
    }],
    polyline:[{
      points:[
        {
          longitude:"108.9290",
          latitude:"34.1400",
        },
        {
          longitude:"108.9290",
          latitude:"34.1500",
        },
        {
          longitude:"108.9290",
          latitude:"34.1700",
        }
      ],
      color:"#00ff00",
      width:2,
      dotteLine:true
    }],
    controls:[{
      id:1,
      iconPath:"/image/Ai.png",
      position:{
        left:0,
        top:300,
        width:30,
        height:30
      },
      clickable:true
    }]
  },
  regionchange(e){
    console.log(e.type)
  },
  markertap(e){
    console.log(e.markertap)
  },
  controltap(e){
    controls.loh(e.controltap)
  }
})

运行结果

4.6.2cannvas

        canvas组件用来绘制图形,相当于一块无色透明的普通图布。canvas组件本身并没有绘图能力,仅仅是图形容器,通过绘图API实现绘图功能。在默认情况下,canvas组件的默认宽度为300px,高度为225px,同一页面中的canvas-id不能重复,否则会出错。canvas组件的属性如下表所示。

示例代码

wxml代码

<canvas canvas-id="myCanvas" style="border: 1px solid red;"></canvas>

js代码

Page({
   onLoad:function(options){
     var ctx=wx.createCanvasContext('myCanvas')
       ctx.setFillStyle('green')
       ctx.fillRect(10,10,200,100)
       ctx.draw()
   }
 })

运行结果

第五章

 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 即速应用界面介绍

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

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

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

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

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

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

5.2 即速应用组件

        即速应用提供了大量的组件供用户快速布局页面,包括7个布局组件、9个基本组件18个高级组件和2个其他组件

5.2.1 布局组件

        布局组件用于设计页面布局,主要包括双栏、面板自由面板、顶部导航、底部导航、分割线和动态分类如图所示

(1)双栏组件
        双栏组件用来布局整体,它可以把一个区块分为两部分,操作时显示一个分隔的标志,便于操作,预览时国则不会出现。双栏组件默认设置每个栏占50%总宽,也可以按实际需要调整比例。双栏里面可以添加基本的组件,从而达到整体的布局效果。双栏还可以嵌套双栏,即可以在其中的一个栏里嵌入一个双栏,从面将整体分成3部分(若需要将整体分成4部分,就再嵌套一个双栏,依次类推)。双栏组件的属性面板如图所示

(2)面板组件

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

(3)自由面板组件

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

 

(4)分割线组件

        分割线组件被放置于任意组件之间,用于实现分割分割线组件的属性面板如图所示

 (5)弹窗组件

(6) 滑动面板

(7)动态分类组件

(8) 分类导航

(9)侧边栏

(10)悬浮窗

(11) 分类横滑

5.2.2 基本组件 

        基本组件是小程序页面常用的组件,包括文本、图片、按钮、标题、轮播、分类、图片列表、图文集和视频,如图所示

1.文本组件

        文本组件用于展示文字、设置点击事件,是小程序页面中最常用的组件。文本组件的属性面板如图所示

2.图片组件

        图片组件用于在页面中展示图片,其属性面板如图所示

 

3.按钮组件

按钮组件用于在页面中设置按钮,其属性面板如图所示 

4.标题组件

标题组件用于在页面中设置标题,其属性面板如图所示

5.轮播组件

        轮播组件用于实现图片的轮播展示,其属性面板如图所示

        单击“添加轮播分组”按钮进人管理后台,然后单击“轮播管理”一“新建分组”选项可以创建轮播分组如图所示

 6.商品列表组件

7.视频组件

8.公告组件

 

 9.添加组合组件

5.2.3高级组件 

        高级组件通常需要后台数据,通过设置后台数据来实现数据后台化,让小程序的数据随时更新,及时修改,如图5-32所示。下面介绍其中的几种常用组件

1.动态列表组件 

动态列表组件是容纳基础组件来展示后台数据的容器,通过添加基础组件来展示对应的后台数据。

要使用动态列表组件,必须在后台进行数据管理,点击“新建数据对象”按钮

5.3即速应用后台管理

1.数据统计

2.用户管理

 3.商品管理

4.订单管理

5.售后订单

6.营销推广

7.账单总览

8. 店铺管理

9.功能模块

10.系统设置

5.4打包上传 

后台管理单机发布

单机打包按钮

 

第六章

6.1 网络API

 微信小程序处理的数据通常从后台服务器获取,再将处理过的结果保存到后台服务器,这就要求微信小程序要有与后台进行交互的能力。微信原生AP接口或第三方APL提供了各类接口实现前后端交互

        网络API可以帮助开发者实现网络URL访问调用、文件的上传和下载、网络套接字的使用等功能处理。微信开发团队提供了10个网络API接口

(1)wx.request(0bject)接口 用于发起HTTPS 请求。

(2)wx.uploadFile(Object)接口 用于将本地资源上传到后台服务器。

(3)wx.downloadFile(Object)接口用于下载文件资源到本地。

(4)wx.connectSocket(0bject)接口用于创建一个WehSocket 连接。

(5)wx.sendSocketMessage(0bject)接口 用于实现通过 WehSocket连接发送数据

(6)wx.closeSocket(0bject)接口用于关闭WebSocket 连接。

(7)wx.onSocketOpen(CallBack)接口用于监听WebSocket 连接打开事件。

(8)wx.onSocketEror(CallBack)接口用于监听WebSocket 错误。

(9)wx.onSocketMessage(CallBack)接口 用于实现监听WebSocket 接收到服务器的消息
事件。

(10)wx.onSocketClose(CallBack)接口用于实现监听WebSocket 关闭。
        在本节,我们将介绍常用的3个网络API

6.1.1 发起网络请求

        wx.request(0bject)实现向服务器发送请求、获取数据等各种网络交互操作,其相关参数如表所示。一个微信小程序同时只能有5个网络请求连接,并且是HTTPS请求

        例如,通过 wx.requesl(0bject)获取百度(https:// www,baidu.com)首页的数据。(需要在微信公众平台小程序服务器配置中的request合法域名中添加“htps:// www.baidu.com”。) 

示例代码

wxml代码

<button type="primary" bind:tap="getbaidutap">获取HTML数据</button>
<textarea value="{{html}}" auto-height="" maxlength="0"></textarea>

js代码

Page({
  data:{
    html:''
  },
  getbaidutap:function(){
    var that=this;
    wx.request({
      url: 'https://www.baidu.com',//百度网址
      data:{},//发送数据为空
      header:{"Content-Type":"application/json"},
      success:function(res){
        console.log(res);
        that.setData({
          html:res.data
        })
      }
    })
  }
})

运行结果

 通过wx.request(Object)的GET方法获取邮政编码对应的地址信息。示例代码如下:

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,this.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.request(0bject)的POST方法获取邮政编码对应的地址信息示例代码如下: 

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,this.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
           })
         }
       }
     })
   }
 }
 })

运行结果

6.1.2 上传文件 

         wx.uploadFile(Object)接口用于将本地资源上传到开发者服务器,并在客户端发起一个HTTPS POST请求,其相关参数如表所示

 示例代码

wxml代码

<button type="primary" bind:tap="uploadimage">上传图片</button>
<image src="{{img}}" mode="widthFix"></image>

 js代码

Page({
  data:{
    img:null,
  },
  uploadumage: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({
      filePath: path[0],
      name: 'file',
      url: 'http://localhost/',
      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(Objeet)接口用于实现从开发者服务器下载文件资源到本地,在客户端
直接发起一个HITPGET请求,返回文件的本地临时路径。其相关参数如表所示

示例代码

wxml代码

<button type="primary" bind:tap="downloadimage">下载图像</button>
<image src="{{img}}" mode="widthFix" style="width: 90%;height: 500px;"></image>

js代码

Page({
  datd:{
    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、音频播放控制AP1、音乐播放控制API等,其目的是丰富小程序的页面功能

6.2.1 图片API

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

(1)wx.chooselmage(Object)接口 用于从本地相册选择图片或使用相机拍照

(2)wx.previewlmage(Object)接口用于预览图片

(3)wx.getlmagelnfo(0bject)接口 用于获取图片信息。

(4)wx.saveImageToPhotosAlbum(0bject)接口 用于保存图片到系统相册。

1.选择图片或拍照

        wx.chooselmage(Object)接口用于从本地相册选择图片或使用相机拍照。拍照时产生的临时路径在小程序本次启动期间可以正常使用,若要持久保存,则需要调用wsaveFile保存图片到本地。其相关参数如表所示

        若调用成功,则返回tempFilePaths和tempFiles,tempFilePaths表示图片在本地临时文件路径列表。tempFiles表示图片的本地文件列表,包括path和size,示例代码如下:

js代码

Page({
  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.previewlmage(0bject)接口主要用于预览图片,其相关参数如表所示 

示例代码

js代码

page({
wx.previewImage({
    current:"http://bomob-cdn-16488.b0.upaiyun.com/2018/02/05/2.png",
    urls: ["http://bomob-cdn-16488.b0.upaiyun.com/2018/02/05/1.png",
           "http://bomob-cdn-16488.b0.upaiyun.com/2018/02/05/2.png",
           "http://bomob-cdn-16488.b0.upaiyun.com/2018/02/05/3.png"
  ],
  })
})

3.获取图片信息

wx.getlmagelnfo(Object)接口用于获取图片信息,其相关参数如表所示 

 示例代码

js代码

  wx.chooseImage({
    success:function(res){
      wx.getImageInfo({
        src: res.tempFilePaths[0],
        success:function(e){
          console.log(e.width)
          console.log(e.height)
        }
      })
    },
  })

4.保存图片到系统相册

         wx.savelmageToPhotosAlbum(Objee)接日用于保存图片到系统相册,需要得到用户授权scope.wriePhotesAlbum。其相关参数如表所示 

示例代码

js代码

  wx.chooseImage({
    success:function(res){
      wx.saveImageToPhotosAlbum({
        filePath: res.tempFilePaths[0],
        success:function(e){
          console.log(e)
        }
      })
    },
  })

6.2.2  录音API

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

(1)wx.stariRecord(Object)接口 用于实现开始录音。

(2)wx.stopRecord(Objeet)接日 用于实现主动调用停止录音

1.开始录音

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

2.停止录音

 ws.slopReeord(Objeet)接口用于实现主动调用停止录音,示例代码如下:

示例代码

js代码

  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;

(1)wx,playVoice(Object)接口 用于实现开始播放语音

(2)wx.pauseVoice(Object)接日 用于实现暂停正在播放的语音

(3)wx, slopVoice(Objec)接日 用于结束播放语音

1.播放语音

        wx.playVoice(Object)接口用于开始播放语音,同时只允许一个语音文件播放,如果前一个语音文件还未播放完,则中断前一个语音文件的播放。其相关参数如表所示

示例代码

 js代码

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

2.暂停播放

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

  
  wx.startRecord({
    success:function(res) {
      var tempFilePath=res.tempFilePath
      wx.playVoice({
        filePath: tempFilePath,
      })
      setTimeout(function() {
        wx.pauseVoice()
      },5000)
    }
  })

3.结束播放

        wx.stopVoice(Object)用于结束播放语音,示例代码如下:


  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:

(1)wx.playBackgroundAudio(Object)接 用于播放音乐。

(2)wx. getBackgroundAudioPlayerState(Object)接口 用于获取音乐播放状态,

(3)wx.seekBackgroundAudio(0bject)接口 用于定位音乐播放进度。

(4)wx.pauseBackgroundAudio()接口 用于实现暂停播放音乐。

(5)wx.stopBackgroundAudio()接口 用于实现停止播放音乐。

(6)wx.onBackgroundAudioPlay(CallBack)接日 用于实现监听音乐播放

(7)wx.onBaekgroundAudioPause(CalBack)接口 用于实现监听音乐暂停

(8)wx.onBackgroundAudioStop(CallBack)接口 用于实现监听音乐停止。

1.播放音乐

         wx.playBackgroundudio(Object)用于播放音乐,同一时间只能有一首音乐处于播放状态,其相关参数如表所示

2.获取音乐播放状态

        wx. getBackgroundAudioPlayerState(Object)接口用于获取音乐播放状态,其相关参数如表所示

 

        接口调用成功后返回的参数如表所示

 

3.控制音乐播放进度

        wx,seekBackgroundAudio(0bject)接口用于控制音乐播放进度,其相关参数如表所示 

4.暂停播放音乐

        wx.pauseBackgroundAudio()接口用于暂停播放音乐 

5.停止播放音乐

        wx.stopBackgroundAudio()接口用于停止播放音乐

6.监听音乐播放

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

7.监听音乐暂停

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

8.监听音乐停止

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

6.3 文件API

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

(1)wx.saveFile(Object)接口 用于保存文件到本地。

(2)wx.geiSavedFileList(0bject)接口 用于获取本地已保存的文件列表

(3)wx.getSaveFilelnfo(Object)接口 用于获取本地文件的文件信息。

(4)wx.removeSaveFile(Object)接口 用于删除本地存储的文件。

(5)wx.openDocument(0bject)接口用于新开页面打开文档,支持格式:doc、xlsppt、pdf、docx 、xlsx 、ppts.

1.保存文件

        wz.saveFile(0bject)用于保存文件到本地,其相关参数如表所示

部分示例代码

js代码

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

2.获取本地文件列表

         wx. getSavedFileList(Object)接口用于获取本地已保存的文件列表,如果调用成功,则返回文件的本地路径、文件大小和文件保存时的时间戳(从1970/01/0108:00:00到当时间的秒数)文件列表。其相关参数如表所示

示例代码

js代码

wx.getSavedFileList({
  success:function(res){
    that.setData({
      fileList:res.fileList
    })
  }
})

3.获取本地文件的文件信息

         wx getsaveFilelnto(0bjeet)接口用于获取本地文件的文件信息,此接口只能用于获取R保存到本地的文件,若需要获取临时文件信息,则使用wx.getFilelnfo(Object)接口。其相关参数如表所示。 

 

示例代码

js代码

 wx.chooseImage({
   count:1,//默认值为9
      sizeType:["original","compressed"],
      sourceType:["album","camera"],
      success:function(res){
        var tempFilePath=res.tempFilePath[0]
        wx.saveFile({
          tempFilePath:tempFilePaths,
          success:function(res){
            var saveFilePath=res.saveFilePath;
            wx.getSavedFileInfo({
              filePath:saveFilePath,
              success:function(res){
                console.log(res.size)
              }
            })
          }
        })
      }
    })

4.删除本地文件

        wx.removeSavefile(0bjecl)接口用于删除本地存储的文件,其相关参数如表所示 

从文件列表中删除第一个文件,示例代码如下:

js代码

 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. openDocument(Object)接口用于新开页面打开文档,支持格式有 doe、xs、ppt、pdf、docx、xlsx、pptx,其相关参数如表所示

示例代码

js代码


    wx.downloadFile({
      url: 'http://localhost/fm2.pdf',
      success:function(res){
        var tempFilePath=res.tempFilePath;
        wx.openDocument({
          filePath: tempFilePath,
          success:function(res){
            console.log("打开成功")
          }
        })
      }
    })

6.4 本地数据及缓存API

         小程序提供了以键值对的形式进行本地数据缓存功能,并且是永久存储的,但最大不超过10MB,其目的是提高加载速度。数据缓存的接口主要有4个:

        wx.setStorage(0bject)或wx.setStorageSync(key,data)接口 用于设置缓存数据

        wx.getStorage(0bject)或wx.getStorageSync(key)接口 用于获取缓存数据。

        wx.removeStorage(Object)或wx.removeStorageSync(key)接口用于删除指定缓存数据。

        wx.clearStorage()或wx.clearStorageSync()接口用于清除缓存数据。

        其中,带 Symc 后缀的为同步接口,不带Sync后缀的为异步接口

6.4.1 保存数据

1.wx. setStorage( Object )

        wx.setStorage(0bject)接口将数据存储到本地缓存接口指定的key中,接口执行后会覆盖原来key 对应的内容。其参数如表所示

示例代码

js代码


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

2. wx. setStorageSync ( key , data )

        wx. setStorageSync(key,data)是同步接口,其参数只有 key 和 data。示例代码如下: 


wx.setStorageSync('age', '25')

6.4.2 获取数据

1.wx. getStorage( Object )

        wx.getStorage(0bject)接口是从本地缓存中异步获取指定key 对应的内容。其相关参数如表所示

 

 示例代码

js代码


wx.getStorage({
  key:'name',
  success:function(res){
    console.log(res.data)
  },
})

2.wx. getStorageSync( key)

        wx.gelStorageSyne(key)从本地缓存中同步获取指定key 对应的内容。其参数只有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(0bject)接口用于从本地缓存中异步移除指定key。其相关参数如表所示

示例代码

js代码


wx.removeStorage({
  key: 'name',
  success:function(res){
    console.log("删除成功")
  },
  fail:function(){
    console.log("删除失败")
  }
})

 2.wx.removeSlorageSyne( key )

        wx.removeStorageSyne(key)接口用于从本地缓存中同步删除指定key对应的内容。其参数只有key

示例代码


try{
  wx.removeStorageSync('name')
}catch(e){
  //Do something when catch error
},

6.4.4 清空数据

1.wx.clearStorage( )

        wx.clearStorage()接口用于异步清理本地数据缓存,没有参数。示例代码如下:


wx.getStorage({
  key:'name',
  success:function(res){
    //清理本地数据缓存
    wx.clearStorage()
  }
})

2.wx.clearStroageSyne( )

        wx.clearStroageSyne()接口用于同步清理本地数据缓存。示例代码如下:


try{
  wx.clearStorageSync()
}catch(e){
}

6.5 位置信息API

        小程序可以通过位置信息API来获取或显示本地位置信息,小程序支持WGS84和GCj02标准,WGS84标准为地球坐标系,是国际上通用的坐标系;GCj02标准是中国国家测绘局制定的地理信息系统的坐标系统,是由WGS84坐标系经加密后的坐标系,又称为火星坐标系。默认为WGS84标准,若要查看位置需要使用GCj02标准。主要包括以下3个API接口:

  1. wx.getLocation(Object)接口用于获取位置信息。
  2.  wx.chooseLocation(Object)接口 用于选择位置信息。
  3.  wx.openLocation(Object)接口用于通过地图显示位置。

6.5.1 获取位置信息

        wx.getLocation(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);
  },
})

6.5.2 选择位置信息

        wx.chooseLocation(Object)接口用于在打开的地图中选择位置,用户选择位置后可返回当前位置的名称、地址、经纬度信息。其相关参数如下表所示。

         wx.chooseLocation(Object)调用成功后,返回的参数如下表所示.

示例代码

wx.chooseLocation({
  success:function(res){
    console.log("位置的名称"+res.name)
    console.log("位置的地址"+res.address)
    console.log("位置的经度"+res.longitude)
    console.log("位置的纬度"+res.latitude)
  }
})

 6.5.3 显示位置信息

        wx.openLocation(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.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()接口被成功调用,则返回网络类型包,有wifi、2G、3G、4G、unknown(Android下不常见的网络类型)、none(无网络)。 

示例代码

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值