认识微信小程序:
小程序简介:
微信小程序实现了不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或者搜一下即可打开应用。也体现了“用完即走”的理念,用户不用关心是否安装太多应用的问题。应用将无处不在,随时可用,但又无需安装卸载
特征:
1.无需安装
2.触手可及
3.用完即走
4.无需卸载
小程序应用场景的特点:
1.简单的业务逻辑
2.低频度的使用场景
微信小程序开发者工具界面功能介绍
1.工具栏:
在工具栏中可以实现多种功能,例如账号的切换,模拟区、编辑区、调试区的显示/隐藏,小程序的编译、预览,切换后台,清理缓存等
2.模拟区:
在模拟区中选择模拟手机的类型、显示比例、网络类型后,模拟器中会显示小程序的运行效果
3.目录文件区:
目录文件区用来显示当前项目的目录结构,单击左上角的“+”按钮可以进行目录和文件的创建,右键单击目录文件区中的文件或目录可以进行“硬盘打开”“重命名”“删除”等相关操作
4.编辑区:
编辑区用来实现对代码的编辑操作,编辑区中支持对.wxml、.wxss、.js及.json 文件的操作,使用组合键能提高代码的编辑效率
5.调试区:
调试区的功能是帮助开发者进行代码调试及排查有问题的区域。小程序系统为开发者提供了9个调试功能模块,分别是Console、Sourees、Network、Security、Storage、AppDataWxml、Sensor和Trace
面板
1.Console面板:
Comsole面板是调试小程序的控制而板,当代码执行出现错误时,错误信息将显示Consoke面板中,便于开发者排查错误,如图1-25所示。另外,在小程中,开发者可通过console.loe语句将信息输出到Console面板中。此外,开发者可以在 Console 面板直接轮人代码并调试
2.Sources面板:
Sourees面板是源文件调试信息页,用于显示当前项目的脚本文件,如图1-26所示调试区左侧显示的是源文件的目录结构,中间显示的是选中文件的源代码,右侧显示的是调试相关按钮,Sources面板中显示的代码是经过小程序框架编译过的脚本文件,开发者的代码会被包含在defne 函数中。对于Page 代码,在文件尾部通过require 函数主动调用
3.Network面板:
Network面板是网络调试信息页,用于观察和显示网络请求request和socket 等网络相关的详细信息
4.Security面板:
Security面板是安全认证信息页,开发者可以通过该面板调试当前网页的安全和认证等问题。如果设置安全论证,则会显示“The security of this page is unknown.”
5.Storage面板:
Storage 面板是数据存储信息页,开发者可以使用wx.setStorage或者wx.setStorageSyne 将数据存储到本地存储,存储在本地存储中的变量及值可以在Sorage 面板中显示
6.AppData面板:
AppDala面板是实时数据信息页,用于显示项目中被激活的所有页面的数据情况。开发者在这里不仅可以查看数据的使用情况,还可以更改数据。编辑器会实时地将数据的变更情况反映到前端界面
7.Wxml面板:
Wxml面板是布局信息页,主要用于调试Wxm】组件和相关CSS样式,显示Wxm转化后的界面。Wxml面板调试区的左侧部分是Wxm代码,右侧部分是该选择器的CSS样式
8.Sensor面板:
Sensor 面板是重力传感器信息页,开发者可以在这里选择模拟地理位置来模拟移动设备表现,用于调试重力感应 API
9.Trace面板:
Trace面板是路由追踪信息页,开发者在这里可以追踪连接到电脑中的安卓(Android)设备的路由信息
10.扩展菜单项:
最右边的扩展菜单项“:”主要包括开发工具的一些定制与设置,开发者可以在这里设置相关信息
微信小程序开发基础
小程序的基本结构目录
在微信下程序的基本目录结构中,项目主目录下有2个子目录(pages和utils)和4个文(app.js、app.json、app.wxss和project.config.json)
pages:放的是所有的页面
utils:放的是所有的工具包,所有页面都可用
主体文件:
微信小程序的主体由3个文件组成,这三个文件必须放在项目的主目录中,负责小程序的整体配置,它们名字是固定的
app.js:小程序逻辑文件(该文件在项目中不可缺少)
app.json:小程序公共设置文件(该文件在项目中不可缺少)
app.xwss:小程序主样式文件(该文件在项目中不是必须的)
页面文件:
小程序通常是由多个页面组成的,美国页面包含4个文件,同一页面的这4个文件必须具有相同的路径与文件名,进入小程序时或页面跳转时,小程序会根据app.json设置的路径找到对应的资源进行数据绑定
.js文件:页面逻辑文件
.wxml文件:页面结构文件
.wxss文件:页面样式表文件
.json文件:页面配置文件
小程序的开发框架:
微信小程序框架介绍
微信团队为小程序提供的框架命名为MINA。MINA框架通过封装微信客户端提供的文件系统、网络通信、任务管理、数据安全等基础功能,对上层提供一整套JavaScript API,让开发者方便的使用微信客户端提供的各种基础功能与能力,快速构建应用。
微信小程序框架系统分为两部分:逻辑层(App Service)和 视图层(View)。小程序提供了自己的视图层描述语言 WXML 和 WXSS,以及基于 JavaScript 的逻辑层框架,并在视图层与逻辑层间提供了数据传输和事件系统,让开发者能够专注于数据与逻辑
小程序MINA框架将整个系统划分为视图层和逻辑层
1.视图层:MINA框架的视图层由WXML与WXSS编写,由组件来进行展示
2.逻辑层:逻辑层用于处理事务逻辑
1.增加app()和Page()方法,进行程序和页面的注册
2.提供丰富的 API,如扫一扫、支付等微信特有的能力
3.每个页面有独立的作用域,并提供模块化能力
3.数据层:数据层在逻辑上包括页面临时数据或缓存、文件存储(本地存储)和网络存储与调用)和网络存储与调用)和网络存储与调用)和网络存储与调用
1.页面临时数据或缓存
2.文件存储(本地存储)
3.网络存储与调用
创建小程序页面
在pages目录下新建一个index目录,并在index目录下新建index.js、index.json、index.wxml、index.wxss空文件
1.在index.json中输入{} ,保证文件不为空
2.在index.js中输入page({}), 保证文件不为空
配置文件:
小程序的配置文件按其作用范围可以分为全局配置文件(app.json)和页面配置文件(*.json)。全局配置文件作用于整个小程序,页面配置文件只作用于当前页面。由于页面配置文件的优先级高于全局配置文件的优先级,因此,当全局配置文件与页面配置文件有相同配置项时,页面配置文件会覆盖全局配置文件中的相同配置项内容
全局配置文件
小程序的全局配置保存在全局配置文件(appjson)中,使用全局配置文件来配置页面文件(pages)的路径、设置窗口(window)表现、设定网络请求API的超时时间值(networkTimeout)以及配置多个切换页(tabBar)等
1.pages配置项
全局配置
pages配置项接受一个数组,用来指定小程序由哪些页面组成,数组的每一项都是字符串,代表对应页面的“路径”+“文件名”。pages配置项是必填项
"pages": [
"pages/index/index",
"pages/logs/logs"
]
设置 pages 配置项时,应注意以下3点:
1.数组的第一项用于设定小程序的初始页面
2.在小程序中新增或减少页面时,都需要对数组进行修改
3.文件名不需要写文件扩展名。小程序框架会自动寻找路径及对.js、.json、wxml 和wxss 文件进行整合数据绑定
2.window配置项
window 配置项负责设置小程序状态栏、导航条、标题、窗口背景色等系统样式
3.tabBar配置项pages
当需要在程序顶部或底部设置菜单栏时,可以通过配置tabBar配置项来实现
4.networkTimeout配置项
5.debug配置项
页面配置文件
页面配置文件(*.json)只能设置本页面的窗口表现,而且只能设置window 配置项的内容。在配置页面配置文件后,页面中的window 配置值将覆盖全局配置文件(app.json)中的配置值
逻辑层文件
小程序的逻辑层文件分为项目逻辑文件和页面逻辑文件
项目逻辑文件
项目逻辑文件app.js中可以通过App()函数注册小程序生命周期函数、全局属性和全局方法,已注册的小程序实例可以在其他页面逻辑文件中通过getApp()获取
页面逻辑文件
页面逻辑文件的主要功能有:设置初始数据;定义当前页面的生命周期函数;定义事件处理函数等
1. 设置初始数据
设置初始数据是对页面的第一次数据绑定
2.定义当前页面的生命周期函数
在Page()函数的参数中,可以定义当前页面的生命周期函数。页面的生命周期函数主要有onLoad、onShow、onReady、onHide、onUnload
onLoad:页面加载函数
onShow:页面显示函数
onReady:页面数据绑定函数
onHide:页面隐藏函数
onUnload:页面卸载函数
页面结构文件
数据绑定
简单绑定
简单绑定是指使用双大括号({{}})将变量包起来,在页面中直接作为字符串输出使用
简单绑定可以作用于内容、组件属性、控制属性等的输出
运算
在{{}}内可以做一些简单的运算(主要有算术运算、逻辑运算、三元运算、字符串运算等),这些运算均应符合 JavaSeript 运算规则
条件数据绑定
wx:if条件数据绑定
wx:if条件数据绑定是指使用wx:if这个属性来判断是否数据绑定当前组件
<view wx:if = "{{condtion}}">内容</view>
当需要添加多个分支块时,可以使用wx:elif、wx:else 属性。当控制表达式为tue 时数据穿定一个分支:当控制表达式为false时,数据绑定另一个分支
<view wx:if="{{x>0}}">1</view>
<view wx:elif="{{x==0}}">0</view>
<view wx:else>-1</view>
以上代码中,当x的值大于0时输出1;当x的值等于0时,输出0;否则,输出-1
block wx:if条件数据绑定
列表数据绑定
模板:在项目过程中,常常会遇到某些相同的结构在不同的地方反复出现,这时可以将相同的布局代码片段放置到一个模板中,在不同的地方传入到对应的数据进行渲染,这样能避免重复开发,提升开发效率
定义模板:模板代码由wxml组成,因此其定义也是在wxml文件中
调用模板:模板定义后,就可以对其调用了
引用页面文件
import方式,include方式
页面事件
冒泡事件
页面样式文件
页面样式文件(WXSS)是基于CSS拓展的样式语言,用于描述WXML的组成样式,决定WXML的组件如何显示。WXSS具有CSS的大部分特性,小程序对WXSS做了一些扩充和修改
1.尺寸单位
2.样式导入
3.选择器
4.wxss常用属性
页面布局
盒子模型
块级元素与行内元素
块级元素
index.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>
行内元素
news.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>
行内块元素
in.wxml
<view>
元素显示方式的<view style="display: inline-block;border: 1px solid #f00;margin: 10;padding: 10px;width: 200px;">块级元素、行内元素和行内块元素</view>三种类型
</view>
浮动与定位
df.wxml
<view>box1,box2,box3 无浮动</view>
<view style="border: 1px solid #f00;padding: 5px;">
<view style="border: 1px solid #f00;padding: 5px;">box1</view>
<view style="border: 1px solid #f00;padding: 5px;">box2</view>
<view style="border: 1px solid #f00;padding: 5px;">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;">box2</view>
</view>
元素浮动与清除
qcfd.wxml
<view>box1 box2左浮动 box3清除左浮动</view>
<view style="border: 1px solid #f00;padding: 5px;">
<view style="float:left;border: 1px solid#0f0;">box1</view>
<view style="float:left;border: 1px solid#0f0;">box2</view>
<view style="clear:left;border: 1px solid#0f0;">box3</view>
</view>
<view>box1 box2 box3左浮动 在父元素后添加一个空元素</view>
<view style="border: 1px solid #f00;padding: 5px " class= " 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>
qcfd.wxss
.clearfloat::after{display: block;clear: both;height: 0;content: "";}
元素定位
三个元素均未定位
<!--三个元素均未定位 static-->
<view style="border: 1px solid #0f0;width: 100px;height: 100px; ">box1</view>
<view style="border: 1px solid #0f0;width: 100px;height: 100px; ">box2</view>
<view style="border: 1px solid #0f0;width: 100px;height: 100px; ">box3</view>
box2元素相对定位
<!--box2元素相对定位 relative top:30px left:30px-->
<view style="border: 1px solid #0f0;width: 100px;height: 100px; ">box1</view>
<view style="border: 1px solid #0f0;width: 100px;height: 100px; position: relative;top:30px ;left:30px;">box2</view>
<view style="border: 1px solid #0f0;width: 100px;height: 100px; ">box3</view>
box2元素绝对定位
<!--box2元素绝对定位 absolute top:30px left:30px-->
<view style="border: 1px solid #0f0;width: 100px;height: 100px; ">box1</view>
<view style="border: 1px solid #0f0;width: 100px;height: 100px; position: absolute;top:30px ;left:30px;">box2</view>
<view style="border: 1px solid #0f0;width: 100px;height: 100px; ">box3</view>
box2元素固定定位
<!--box2元素固定定位 fixed top:30px left:30px-->
<view style="border: 1px solid #0f0;width: 100px;height: 100px; ">box1</view>
<view style="border: 1px solid #0f0;width: 100px;height: 100px; position: fixed;top:30px ;left:30px;">box2</view>
<view style="border: 1px solid #0f0;width: 100px;height: 100px; ">box3</view>
flex布局
flex布局模型
容器属性
1.display用于指定元素是否为flex布局
.box{display:flex|inline-flex;}
2.flex-direction用于设置主轴方向,即项目的排列方向,语法格式为
.box{flex-direction;row|row-reverse|column|column-reverse;}
(a)row(b)row-reverse(c)column(d)coulumn-reverse
3.flex-wrap
nowrap: 不换行,默认值(a)
wrap: 换行,第一行在上方(b)
wrap-reverse: 换行,第一行在下方(c)
.box{flex-wrap:nowrap|wrap|wrap-reverse;}
4.flex-flow
flex-flow是flex-direction和flex-wrap的简写形式
.box{flex-flow:<flex-direction>||<flex-wrap>;}
5.flex-content
flex-start: 左对齐,默认值(a)
flex-end: 右对齐(b)
center: 居中(c)
space-between: 两端对齐,项目之间的间隔都相等(d)
space-around: 每个项目两侧的间隔相等(e)
6.align-items
flex-start:交叉轴起点对齐
flex-end:交叉轴终点对齐
center:交叉轴中线对齐
baseline:项目根据它们第一行的基线对齐
stertch:如果项目未设置高度或设置为auto,项目将在交叉轴方向拉伸填充容器
bj.wxml
<view class="cont1">
<view class="item">1</view>
<view class="item item2">2</view>
<view class="item item3">3</view>
<view class="item item4">4</view>
</view>
bj.wxss
.cont1{
display: flex;
flex-direction: row;
align-items: baseline;
}
.item{
background-color: #ccc;
border: 1px solid #f00;
height: 100px;
width: 50px;
margin: 2px;
}
.item2{
height: 80px;
}
.item3{
display: flex;
height: 50px;
align-items: flex-end;
}
.item4{
height: 120px;
}
7.align-content
align-content用来定义项目有多根轴线(出现换行后)在交叉轴上的对齐方式,如果只有一根轴线,该属性不起定义
.box{align-content:flex-start|flex-end|center|space-between|space-around|stretch}
(a)flex-start (b)center (c)flex-end
项目属性
1.order :
sx.wxml
<view class="cont1">
<view class="item">1</view>
<view class="item">2</view>
<view class="item">3</view>
<view class="item">4</view>
</view>
<view class="cont1">
<view class="item" style="order: 1;">1</view>
<view class="item" style="order: 3;">2</view>
<view class="item" style="order: 2;">3</view>
<view class="item">4</view>
</view>
sx: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;
}
2.flex-grow :
sx.wxml
<view class="cont1">
<view class="item">1</view>
<view class="item">2</view>
<view class="item">3</view>
<view class="item">4</view>
</view>
<view class="cont1">
<view class="item" style="order: 1;">1</view>
<view class="item" style="flex-grow: 1;">2</view>
<view class="item" style="flex-grow: 2;">3</view>
<view class="item">4</view>
</view>
sx:wxss
.cont1{
display: flex;
flex-direction: row;
width: 240px;
align-items: baseline;
}
.item{
background-color: #ccc;
height:30px;
width: 30px;
margin: 2px;
}
3.flex-shrink :
sx.wxml
<view class="cont1">
<view class="item">1</view>
<view class="item">2</view>
<view class="item">3</view>
<view class="item">4</view>
</view>
<view class="cont1">
<view class="item">1</view>
<view class="item" style="flex-shrink: 2;">2</view>
<view class="item" style="flex-shrink: 1;">3</view>
<view class="item" style="flex-shrink: 4;">4</view>
</view>
sx:wxss
.cont1{
display: flex;
flex-direction: row;
width: 240px;
align-items: baseline;
}
.item{
background-color: #ccc;
height:40px;
width: 80px;
margin: 2px;
}
4.flex-basis :
sx.wxml
<view class="cont1">
<view class="item">1</view>
<view class="item">2</view>
<view class="item">3</view>
<view class="item">4</view>
</view>
<view class="cont1">
<view class="item">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>
sx:wxss
.cont1{
display: flex;
flex-direction: row;
width: 280px;
align-items: baseline;
}
.item{
background-color: #ccc;
height:40px;
width: 80px;
margin: 2px;
}
5.flex :
.item{flex:<flex-grow>|<flex-shrink>|<flex-basis>;}
6.align-self :
align-self属性用来指定单独的伸缩项目在交叉轴上的对齐方式
.item{align-self:auto|flex-start>|flex-end|center|baseline|stretch;}
页面组件
组件的定义及属性
<标签名 属性名 = "属性值" >内容...</标签名>
组件通过属性来进一步细化。 不同的组件可以有不同的属性,但它们也有一此共用属性,如id、class、 style、 hidden、 data- *、bind * /catch*等。
id组件的唯一表示, 保持整个页面唯一 ,不常用。
class组件的样式类,对应WXSS中定义的样式。
style组 件的内联样式,可以动态设置内联样式。
hidden组件是否显示,所有组件默认显示。
data - * 自定义属性,组件触发事件时,会发送给事件处理函数。事件处理函数可
以通过传人参数对象的currentTarget. dataset 方式来获取自定义属性的值。
bind*/catch* 组件的事件, 绑定逻辑层相关事件处理函数。
容器视图组件:
view:块级组件,主要用于布局展示
view组件的特有属性
<view style="text-align: center">默认flex布局</view>
<view style="display: flex">
<view style="border: 1px solid #f00;flex-grow: 1">1</view>
<view style="border: 1px solid #f00;flex-grow: 1">2</view>
<view style="border: 1px solid #f00;flex-grow: 1">3</view>
</view>
<view style="text-align: center">上下混合布局</view>
<view style="display: flex;flex-direction: column">
<view style="border: 1px solid #f00;">1</view>
<view style="display: flex">
<view style="border: 1px solid #f00;flex-grow: 1">2</view>
<view style="border: 1px solid #f00;flex-grow: 2">3</view>
</view>
</view>
<view style="text-align: center">左右混合布局</view>
<view style="display: flex">
<view style="border: 1px solid #f00;flex-grow: 1">1</view>
<view style="display: flex;flex-direction: column;flex-grow: 1">
<view style="border: 1px solid #f00;flex-grow: 1">2</view>
<view style="border: 1px solid #f00;flex-grow: 1">3</view>
</view>
</view>
srcoll-view
通过设置scroll-view组件的相关属性可以实现滚动视图的功能,如图所示:
gd.wxml
<view class="container"style="padding:0rpx"
<scroll-view scroll-top="{{scrollTop}}"scroll-y="true"
style="height: {{scrollHeight}}px;"class="list"bindscrolltolower="bindDownLoad"
bindscrolltolower="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="{{hedden}}"bindchange = "loadingchange">加载中...</loading >
</view >
</view >
gd.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:{
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){
//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(){
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){
this.setData({
scrollTop:event.detail.scrollTop
});
},
topLoad: function(event){
page = 0;
this.setData({
list: [],
scrollTop : 0
});
loadMore( this);
console.log( "lower" );
}
})
gd.wxss
.userinfo{
display :flex;
flex-direction:column;
align-items: center;
}
.userinfo-avatar{
width:128rpx;
width: 128rpx;
height :128rpx;
margin:20rpx;
border-radius:50% ;}
.userinfo-nickname {
color :#aaa;
}
.usermotto{
margin-top:200px;
}
scroll-view {
width:100% ;}
.item{
width:90%;
height :300rpx;
margin:20 rpxauto;
background:brown;
overflow:hidden ;
}
.item.img {
width:430rpx;
margin-right :20rpx;
float :left;
}
.title{
font-size:30rpx;
display:block;
margin:30 rpxauto;
}
.description {
font-size:26rpx;
line-height:15rpx;
}
swiper
hk.js
<swiper indicator-dots="true" autoplay="true" interval="5000" duration="1000">
<swiper-item>
<image src="/image/1.jpg" style="width: 100%;"></image>
</swiper-item>
<swiper-item>
<image src="/image/2.jpg" style="width: 100%;"></image>
</swiper-item>
<swiper-item>
<image src="/image/3.jpg" style="width: 100%;"></image>
</swiper-item>
<swiper-item>
<image src="/image/4.jpg" style="width: 100%;"></image>
</swiper-item>
</swiper>
基础内容组件
icon
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>
icon.js
//pages/icon/icon.js
// pages/icon/icon.js
Page({
/**
* 页面的初始数据
*/
data: {
iconType:["success","success_no_circle","info","warn","waiting","cancel","download","searcj","clear"],
iconSize:[10,20,30,40],
iconColor:['#f00','#0f0','#00f']
},
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}}"> </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>
text.js
data: {
x:[1,2,3,4,5],
y:[1,2,3,4,5,6,7,8,9]
},
progress
progress.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>
表单组件
button
button组件属性:
button.js
// pages/button/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})
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})
button.wxml
<button type="default">type:default</button>
<button type="primary">type:primary</button>
<button type="warn">type:warn</button>
<button type="default" bind:tap="buttonSize" size="{{size}}">改变size</button>
<button type="default" bind:tap="buttonPlain" plain="{{plain}}">改变plain</button>
<button type="default" bind:tap="buttonLoading" size="{{loading}}">改变loading显示</button>
radio
<view>选择你喜爱的城市:</view>
<radio-group bindchange="citychange">
<radio value="西安">西安</radio>
<radio value="北京">北京</radio>
<radio value="上海">上海</radio>
<radio value="广州">广州</radio>
<radio value="深圳">深圳</radio>
</radio-group>
<view>你的选择:{{city}}</view>
<view>选择你喜爱的计算机语言:</view>
<radio-group class="radio-group" bindchange="radiochange">
<label class="radio" wx:for="{{radios}}">
<radio value="{{item.value}}" checked="{{item.chexked}}"/>
{{item.name}}
</label>
</radio-group>
<view>你的选择:{{lang}}</view>
// pages/radio/radio.js
Page({
/**
* 页面的初始数据
*/
data: {
radios:[
{name:'java',value:'JAVA'},
{name:'python',value:'Python',checked:'true'},
{name:'php',value:'PHP'},
{name:'swif',value:'Swif'},
],
},
citychange:function(e){
this.setData({city:e.detail.value});
},
radiochange:function(event){
this.setData({lang:event.detail.value});
console.log(event.detail.value)
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})
checkbox
<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>
// pages/checkbox/checkbox.js
Page({
/**
* 页面的初始数据
*/
data: {
citys:[
{name:'km',value:'昆明'},
{name:'sy',value:'三亚',checked:'true'},
{name:'zh',value:'珠海'},
{name:'dl',value:'大连'}
]},
cityChange:function(e){
console.log(e.detail.value);
var city = e.detail.value;
this.setData({ city:city})
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})
switch
<view>
<switch bindchange="sw1">{{var1}}</switch>
</view>
<view>
<switch checked bindchange="sw2">{{var2}}</switch>
</view>
<view>
<switch type="checkbox" bindchange="sw3">{{var3}}</switch>
</view>
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?'已选':'未选'})
},
slider
<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>
data: {
size:'20'
},
sliderchange:function(e){
this.setData({size:e.detail.value})
},
picker
<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>
// pages/picker/picker.js
Page({
/**
* 页面的初始数据
*/
// 4.4.6.1 js文件
data:{
array:["JAVA","Python","C","C#"],
objArray:[
{id:0,name:"JAVA"},
{id:1,name:"Python"},
{id:2,name:"C"},
{id:3,name:"C#"}
],
index1:0,
index2:0
},
arrayChange:function(e){
console.log("picker值变为",e.detail.value)
var index=0;
this.setData({
index1:e.detail.value
})
},
objArrayChange:function(e){
console.log("picker值变为",e.detail.value)
this.setData({
index2:e.detail.value
})
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})
多列选择器
<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>
Page({
data: {
multiArray:[['陕西省','广东省'],['西安市','汉中市','延安市'],['雁塔区','长安区']],
multiIndex:[0,0,0]
},
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){
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);
},
})
picker组件time选择器属性
picker组件data选择器属性
// pages/picker-datetime/picker-datetime.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)
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})
<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>
<picker mode="region" value="{{region}}" custom-item="{{customitem}}" bindchange="{{changeregion}}" >
选择省市区:"{{region[0]}}","{{region[1]}}","{{region[2]}}"
</picker>
// pages/picker-region/picker-region.js
Page({
/**
* 页面的初始数据
*/
data: {
region:['陕西省','西安市','长安区'],
customitem:'全部'
},
changeregion:function(e){
console.log(e.detail.value),
this.setData({region:e.detail.value});
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})
picker-view
<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>
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)
}
// pages/picker-view/picker-view.js
Page({
/**
* 页面的初始数据
*/
data: {
years:years,
months:months,
days:days,
year:date.getFullYear(),
month:date.getMonth()+1,
day:date.getDate(),
value:[118,0,0],
},
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]]
})
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})
input
<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="占位符字体是红色的"/>
// pages/input/input.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'),
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})
textarea
<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="from中的textarea" name="textarea"/>
<button form-type="submit">提交</button>
</form>
// pages/textarea/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)
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})
label
<!-- 单击中国不能选择/取消复选框 -->
<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>
// pages/label/label.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})
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})
form
//index.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>
// pages/form/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事件')
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})
多媒体组件
image
<block wx:for="{{modes}}">
<view>当前图片的模式是:{{item}}</view>
<image mode="{{item}}"src="/image/1.jpg"style="width:100%,height:100%"/>
</block>
Page({
data:{
modes:['scaleToFill','aspectFit','aspectFill','widthFix']
}
})
audio
<block wx:for="{{modes}}">
<view>当前图片的模式是:{{item}}</view>
<image mode="{{item}}" src="/image/1.jpg" style="width: 200px;height: 20xp;"/>
</block>
Page({
data:{
modes:['top','center','bottom','left','right','top_left','top_right','bottom_left','bottom_right']
}
})
video
<video src="{{src}}"controls></video>
<view class="btn-area">
<button bindtap="bindButtonTap">获取视频</button>
</view>
// pages/video/video.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
})
}
})
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})
camera
// pages/camera/camera.js
Page({
takePhoto(){
const ctx=wx.createCameraContext()
ctx.takePhoto({
quality:'high',
success:(res)=>{
this.setData({
src:res.tempImagePath
})
}
})
},
error(e){
console.log(e.detail)
},
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})
//index.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>
其他组件
map
<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>
// pages/map/map.js
Page({
/**
* 页面的初始数据
*/
data: {
markers:[{
iconPath:"/image/dw.jpg",
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/dw.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)
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})
canvas
1.创建一个canvas绘图上下文
var context=wx.createCanvasContext('MyCanvas')
2.使用canvas绘图上下文进行绘图描述
context.setFillStyle('green')//设置绘图上下文的填充色为绿色
context.fillRect(10,10,200,100)//方法画一个矩形,填充为设置的绿色
3.画图context.draw()
<canvas canvas-id="myCanvas"style="border:1px solid red;"/>
Page({
onLoad:function(options){
var ctx=wx.createCanvasContext('myCanvas')
ctx.setFillStyle('green')
ctx.fillRect(10,10,200,100)
ctx.draw()
}
})
即速应用
优势:
即速应用是深圳市咫尺网络科技开发有限公司开发的一款同时兼具微信小程序和支付宝小程序快速开发能力的工具,用户只需简单拖拽可视化组件,就可以实现在线小程序开发。据不完全统计,在微信小程序正式发布的1年内,在即速应用上打包代码并成功上线的微信小程序已经超过5万个。
功能特点:
主要体现在以下几个方面:
1.开发流程简单,零门槛制作
2.行业模板多样,种类齐全
3.丰富的功能组件和强大的管理后台
界面介绍
即速应用的主界面主要分为4个区域,分别为菜单栏、工具栏、编辑区和属性面板
菜单栏
工具栏
编辑区
属性面板
即速应用组件:
即速应用提供了大量的组件供用户快速布局页面,9个基础组件和11个应用组件
基础组件
应用组件
文本组件
图片组件
按钮组件
标题组件
轮播组件
高级组件
动态列表组件
侧边栏组件
悬浮窗组件
即速应用后台管理
API应用
网络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 关闭
发起网络请求
例如,通过 wx.requesl(0bject)获取百度(https:// www,baidu.com)首页的数据。(需要在微信公众平台小程序服务器配置中的request合法域名中添加“htps:// www.baidu.com”。)
<!--pages/baidu/baidu.wxml-->
<button type="primary" bind:tap="getbaidutap">获取HTML数据</button>
<textarea value="{{html}}" auto-height="" maxlength="0"></textarea>
// pages/baidu/baidu.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方法获取邮政编码对应的地址信息。
<!--pages/postcode/postcode.wxml-->
<view>邮政编码:</view>
<input type="text" bindinput="input" placeholder="6位邮政编码" />
<button type="primary" bindtap="fine">查询</button>
<block wx:for="{{address}}">
<block wx:for="{{item}}">
<text>{{item}}</text>
</block>
</block>
// pages/postcode/postcode.js
Page({
data: {
postcode:'',
address:[],
errMsg:'',
erroe_code:-1
},
input:function(e){
this.setData({
postcode:e.detail.value,
})
console.log(e.detail.value)
},
find:function(){
var postcode = this.data.postcode;
if(postcode != null && postcode !=""){
var self = this;
wx.showToast({
title: '正在查询,请稍后......',
icon: loading,
duration: 10000
});
wx.request({
url: 'https://v.juhe.cn/postcode/query',
data:{
'postcode':postcode,
'key':'0ff9bfccdf147476e067de994eb5496e'
},
header:{
'Content-Type':'application/json',
},
method:'GET',
success:function(res){
wx.hideToast();
if(res.data.error_code==0){
console.log(res);
self.setData({
errMsg:'',
erroe_code:res.data.error_code,
address:res.data.result.list
})
}
else {
self.setData({
errMsg:res.data.reason || res.data.reason,
erroe_code:res.data.error_code
})
}
}
})
}
}
})
上传文件
wx.uploadFile(Object) 接口用于将本地资源上传到开发者服务器, 并在客户端发起一个HTTPSPOST 请求
<!--pages/upload/upload.wxml-->
<button type="primary"bindtap="uploadimage">上传图片</button ><image src="/image/8.png"
mode="widthFix"/>
Page({
data:{
img :null,
uploadimage:function(){
var that =this;
//选择图片
wx.chooseImage({
success:function(res){
var tempFilePaths =res.tempFilePaths
upload(that,tempFilePaths);
}
})
function upload(page,path){
wx.showToast({
icon:"loading",
title:"正在上传"
}),
wx.uploadFile({
url:"http://localhost/",
filePath:path[0],
name:'file',
success:function(res){
console.log(res);
if(res.statusCodel=200){
wx.showModal({
title:'提示',
content:'上传失败',
showCancel:false
})
return;
}
var data =res.data
page.setData({
img:path[0]
})
},
fail:function(e){
console.log(e);
wx.showModal({
title:'提示',
content:'上传失败',
showCancel:false
})
},
complete:function(){
wx.hideToast();
}
})
}}
}
})
下载文件
wx.downloadFile(Objeet)接口用于实现从开发者服务器下载文件资源到本地,在客户端
直接发起一个HITPGET请求,返回文件的本地临时路径
<!--pages/downloadFile/downloadFile.wxml-->
<button type="primary" bind:tap="downloadimage">下载图像</button>
<image src="/image/8.png" mode="widthFix" style="width: 80%;height: 300px;"></image>
// pages/downloadFile/downloadFile.js
Page({
/**
* 页面的初始数据
*/
data: {
img:null
},
downloadimage:function(){
var that=this;
wx.downloadFile({
//通过WAMP软件实现
url: 'http://localhost/1.jpg',
success:function(res){
console.log(res)
that.setData({
img:res.tempFilePath
})
}
})
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})
多媒体API
多媒体API主要包括图片API、录音API、音频播放控制API、音乐播放控制API等,其目的是丰富小程序的页面功能
图片API
选择图片或拍照
wx.chooseImage({
count:2,//默认值为9
sizeType:['original','compressed'],//可以指定是原图还是压缩图,默认者都有
sourceType:['album','camera'],//可以指定来源是相册还是相机,默认二者都有
success:function(res){
//返回选定照片的本地文件路径列表,tempFilePath可以作为img标签的src属性来显示图片
var tempFilePaths =res.tempFilePaths
var tempFiles =res.tempFiles;
console.log(tempFilePaths)
console.log(tempFiles)
}
})
预览图片
wx.previewImage({
//定义显示第二张
current:"http://bmob-cdn-16488.b0.upaiyun.com/2018/02/05/2.png",
urls:["http://bmob-cdn-16488.b0.upaiyun.com/2018/02/05/1.png",
"http://bmob-cdn-16488.b0.upaiyun.com/2018/02/05/2.png",
"http://bmob-cdn-16488.b0.upaiyun.com/2018/02/05/3.jpg"]
})
获取图片信息
wx.chooseImage({
success:function(res){
wx.getImageInfo({
src: res.tempFilePaths[0],
success:function(e){
console.log(e.width)
console.log(e.height)
}
})
},
})
保存图片到系统相册
录音API
开始录音
停止录音
wx.startRecord({
success:function(res){
var tempFilePath=tempFilePath
},
fail:function(res){
//录音失败
}
})
setTimeout(function(){
//结束录音
wx.stopRecord()},10000)
音频播放控制API
音频播放控制API主要用于对语音媒体文件的控制,包括播放、暂停、停止及audio组件的控制,主要包括以下3个API
1.wx.playVoice(Object)接口 用于实现开始播放语音
2.wx.pauseVoice(Object)接口用于实现暂停正在播放的语音
3. wx.stopVoice(Object)接口 用于结束播放语音
播放语音
wx.startRecord({
success:function(res){
var tempFilePath=res.tempFilePath
wx.playVoice({
filePath:tempFilePath,
complete:function(){
}
}) }
})
暂停播放
wx.startRecord({
success:function(res){
var tempFilePath=res.tempFilePath
wx.playVoice({
filePath: tempFilePath
})
setTimeout(function(){
//暂停播放
wx.pauseVoice()
},5000)
}
})
结束播放
wx.startRecord({
success:function(res){
var tempFilePath=res.tempFilePath
wx.playVoice({
filePath:tempFilePath
})
setTimeout(function(){
wx.stopVoice()
},5000)
}
})
音乐播放控制API
播放音乐
wx.playBackgroundAudio({
dataUrl: 'http://bmob-cdn-16488.b0.upaiyun.com/2018/02/09/117e4a1b405195b18061299e2de89597.mp3',
title:'有一天',
coverImgUrl:'http:///bmob-cdn-16488.b0.upaiyun.com/2018/02/09/f604297140c9681880cc3d3e581f7724.jpg',
success:function(res){
console.log(res)//成功返回playBackgroundAudio:ok
}
})
获取音乐播放状态
wx.getBackgroundAudioPlayerState({
success:function(res){
var status=res.status
var dataUrl=res.dataUrl
var currentPosition=res.currentPosition
var duration=res.duration
var downloadPercent=res.downloadPercent
console.log("播放状态:"+status)
console.log("音乐文件地址:"+dataUrl)
console.log("音乐文件当前播放位置:"+currentPosition)
console.log("音乐文件的长度:"+duration)
console.log("音乐文件的下载进度:"+downloadPercent)
}
})
控制音乐播放进度
wx.seekBackgroundAudio({
position: 30,
})
暂停播放音乐
wx.playBackgroundAudio({
dataUrl: '/music/a.mp3',
title:'我的音乐',
coverImgUrl:'images/poster.jpg',
success:function(){
console.log('开始播放音乐了');
}
});
setTimeout(function(){
console.log('暂停播放');
wx.stopBackgroundAudio();
},5000);//5秒后自动停止
停止播放音乐
wx.playBackgroundAudio({
dataUrl: '/music/a.mp3',
title:'我的音乐',
coverImgUrl:'images/poster.jpg',
success:function(){
console.log('开始播放音乐了');
}
});
setTimeout(function(){
console.log('暂停播放');
wx.stopBackgroundAudio();
},5000);//5秒后自动停止
监听音乐播放
wx.playBackgroundAudio({
dataUrl: this.data.musicData.dataUrl,
title:this.data.musicData.title,
coverImgUrl:this.data.musicData.coverImgUrl,
success:function(){
wx.onBackgroundAudioStop(function(){
that.setData({
isplayingMusic:false
})
})
}
})
监听音乐暂停
监听音乐停止
示例
<!--pages/music/music.wxml-->
<view class="container">
<image class="bgaudio"src = "{{changedImg? music.coverImg:'/image/8.png'}}"/>
<view class ="control-view">
<!--使用data-how定义一个0表示快退10秒-->
<image src ="/image/1.jpg"bindtap="onPositionTap"data-how= "0 "/>
<image src = "/image/2.jpg" bindtap = "onAudioTap"/>
<image src ="/image/3.jpg"bindtap = "onStopTap"/><!--使用data-how定义一个1表示快进10秒-->
<image src ="/image/3.jpg"bindtap ="onPositionTap"data-how = "1"/>
</view >
</view >
/* pages/music/music.wxss */
.bgaudio{
height:350rpx; width:350rpx;
margin-bottom:100rpx;
}
.control-view image{
height:64rpx;
width:64rpx;
margin:30rpx;
}
Page({
data:{
//记录播放状态
isPlaying:false,
//记录coverImg,仅当音乐初始时和播放停止时,使用默认的图片。播放中和暂停时,都使用当前音乐的图片
coverImgchangedImg:false,
//音乐内容
music:{
"url":"../images/e e.mp4",
"title":"盛晓玫-有一天",
"coverImg":
"../images/e e.mp4"
},
},
onLoad:function(){
//页面加载时,注册监听事件
this.onAudioState();
},
//点击播放或者暂停按钮时触发
onAudioTap:function(event){
if(this.data.isPlaying){
//如果在正常播放状态,就暂停,并修改播放的状态
wx.pauseBackgroundAudio();
}else{
//如果在暂停状态,就开始播放,并修改播放的状态28
let music = this.data.music;
wx.playBackgroundAudio({
dataUrl: music.url,
title: music.title,
coverImgUrl:music.coverImg
})
}
},
//点击即可停止播放音乐
onStopTap:function(){
let that = this;
wx.stopBackgroundAudio({
success:function(){
//改变coverImg和播放状态
that.setData({ isPlaying:false,changedImg:false});
}
})
},
//点击“快进10秒”或者“快退10秒”时,触发
onPositionTap:function(event){
let how = event.target.dataset.how;//获取音乐的播放状态
wx.getBackgroundAudioPlayerState({
success:function(res){
//仅在音乐播放中,快进和快退才生效
//音乐的播放状态,1表示播放中54
let status = res.status;
if(status === 1){//音乐的总时长
let duration = res.duration;//音乐播放的当前位置
let currentPosition = res.currentPosition;
if(how ==="0"){
//注意:快退时,当前播放位置快退10秒小于0时,直接设置position为1;否则,直接减去10秒//快退到达的位置
let position = currentPosition - 10;
if(position <0){
position =1;//执行快退
}
wx.seekBackgroundAudio({
position: position
});
//给出一个友情提示,在实际应用中,请删除!!!
wx. showToast({title:"快退10s",duration:500});
}
if(how === "1"){//注意:快进时,当前播放位置快进10秒后大于总时长时,直接设置position 为总时长减1
//快进到达的位置
let position =currentPosition +10;
if(position >duration){
position =duration-1;//执行快进
}
wx.seekBackgroundAudio({
position: position});//给出一个友情提示,在实际应用中,请删除!!!
wx.showToast({ title:"快进10s",duration:500});
}
}else { //给出一个友情提示,在实际应用中,请删除!!!
wx.showToast({title:"音乐未播放",duration:800});
}
}
})
},//音乐播放状态
onAudioState:function(){
let that =this;
wx.onBackgroundAudioPlay(function(){//当wx.playBackgroundAudio()执行时触发101 //改变coverImg和播放状态
that.setData({ isPlaying:true,changedImg:true});
console.log("on play");
});
wx.onBackgroundAudioPause(function(){ //当wx.pauseBackgroundAudio()执行时触发//仅改变播放状态
that.setData({isPlaying:false});
console.log("on pause");
});
wx.onBackgroundAudioStop(function(){ //当音乐自行播放结束时触发//改变coverImg和播放状态
that.setData({isPlaying:false,changedImg:false});
console.log("on stop");
});
}
})
{
}
文件API
从网络上下载或录音的文件都是临时保存的,若要持久保存,需要用到文件API。文件API提供了打开、保存、删除等操作本地文件的能力,主要包括以下5个API接口
wx.saveFile(Object)接口 用于保存文件到本地
wx.getSavedFileList(Object)接口 用于获取本地已保存的文件列表
wx.getSaveFileInfo(Object)接口 用于获取本地文件的文件信息
wx.removeSaveFile(Object)接口 用于删除本地存储的文件
wx.openDocument(Object)接口 用于新开页面打开文档支持格式:doc、xls、ppt、pdf、docx、xlsx、ppts
保存文件
saveImg: (function(){
wx.chooseImage({
count:1,
sizeType:['original','compressed'],
sourceType:['album','camera'],
success:function(res){
var tempFilePaths = res.tempFilePaths[0]
wx.saveFile({
tempFilePath:tempFilePaths,
success:function(res){
var saveFilePath = res.saveFilePath;
console.log(saveFilePath)
}
})
}
})
})
获取本地文件列表
//js
wx.getSavedFileList({
success:function(res){
that.setData({
fileList:res.fileList
})
}
})
获取本地文件的信息
wx.chooseImage({
count:1,
sizeType:['original','compressed'],
sourceType:['album','camera'],
success:function(res){
var tempFilePaths = res.tempFilePaths[0]
wx.saveFile({
tempFilePath:tempFilePaths,
success:function(res){
var saveFilePath = res.saveFilePath;
wx.getSavedFileInfo({
filePath:saveFilePath,
success:function(res){
console.log(res.size)
}
})
}
})
}
})
删除本地文件
//js
wx.getSavedFileList({
success:function(res){
if(res.fileList.Length > 0 ){
wx.removeSavedFile({
filePath:res.fileList[0].filePath,
complete:function(res){
console.log(res)
}
})
}
}
})
打开文档
wx.downloadFile({
url: "http://localhost/fm2.pdf",
success:function(res){
var tempFilePath = res.tempFilePath;
wx.openDocument({
filePath: tempFilePath,
success:function(res){
console.log("打开成功")
}
})
}
})
本地数据及缓存API
保存数据
wx.setStorage(0bject)接口将数据存储到本地缓存接口指定的key中,接口执行后会覆盖原来key 对应的内容
// 保存数据 同步 js文件
wx.setStorageSync('age', '25')
wx.setStorage({
key:'name',
data:'sdy',
success:function(res){
console.log(res)
}
})
wx. setStorageSync(key,data)是同步接口,其参数只有 key 和 data
wx.setStorageSync('age', '25')
获取数据
wx.getStorage(0bject)接口是从本地缓存中异步获取指定key对应的内容
wx.getStorage({
key:'name',
success:function(res){
console.log(res.data)
},
})
wx.gelStorageSyne(key)从本地缓存中同步获取指定key 对应的内容。其参数只有key
try{
var value=wx.getStorageSync('age')
if(value){
console.log("获取成功"+value)
}
}catch(e){
console.log("获取失败")
}
删除数据
wx.removeStorage(0bject)接口用于从本地缓存中异步移除指定key
wx.removeStorage({
key: 'name',
success:function(res){
console.log("删除成功")
},
fail:function(){
console.log("删除失败")
}
})
wx.removeStorageSyne(key)接口用于从本地缓存中同步删除指定key对应的内容。其参数只有key
try{
wx.removeStorageSync('name')
}catch(e){
//Do something when catch error
},
清空数据
wx.clearStorage()接口用于异步清理本地数据缓存,没有参数
wx.getStorage({
key:'name',
success:function(res){
//清理本地数据缓存
wx.clearStorage()
}
})
wx.clearStroageSyne()接口用于同步清理本地数据缓存
try{
wx.clearStorageSync()
}catch(e){}
位置信息API
wx.getLocation(Object)接口用于获取位置信息
wx.chooseLocation(Object)接口用于选择位置信息
wx.openLocation(Object)接口用于通过地图显示位置
获取位置信息
wx.getLocation(Object)接口
wx.getLocation(Object)
wx.getLocation({
type:'wgs84',
success:function(res){
console.log("经度:"+res.longitude);
console.log("纬度"+res.latitude);
console.log("速度"+res.longitude);
console.log("位置的精确度" +res.accuracy);
console.log("水平精确度"+res.horizontalAccuracy);
console.log("垂直精确度"+res.verticalAccuracy);
},
})
选择位置信息
wx.chooseLocation(Object)接口用于在打开的地图中选择位置,用户选择位置后可返回当前位置的名称、地址、经纬度信息
wx.chooseLocation(Object)调用成功后,返回的参数如下表所示
wx.chooseLocation({
success:function(res){
console.log("位置的名称"+res.name)
console.log("位置的地址"+res.address)
console.log("位置的经度"+res.longitude)
console.log("位置的纬度"+res.latitude)
}
})
显示位置信息
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号'
})
}
})
设备相关API
设备相关的接口用于获取设备相关信息,主要包括系统信息、网络状态、拨打电话及扫码等。主要包括以下5个接口API:
wx.getSystemInfo(Object)接口、wx.getSystemInfoSync()接口 用于获取系统信息。
wx.getNetworkType(Object)接口 用于获取网络类型。
wx.onNetworkStatusChange(CallBack)接口 用于监测网络状态改变。
wx.makePhoneCall(Object)接口 用于拨打电话。
wx.scanCode(Object)接口 用于扫描二维码
获取系统信息
wx. getSystemInfo(Object)接口、wx. getSystemInfoSync()接口分别用于异步和同步获取系统信息
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)
},
})
网络状态
获取网络状态
wx. getNetworkType(Object)用于获取网络类型
如果wx. getNetworkType()接口被成功调用,则返回网络类型包,有wifi、2G、3G、4G、unknown(Android下不常见的网络类型)、none(无网络)
wx.getNetworkType({
success:function(res){
console.log(res.networkType)
},
})
监听网络状态变换
wx. onNetworkStatusChange(CallBack)接口用于监听网络状态变化,当网络状态变化时,返回当前网络状态类型及是否有网络连接
wx.onNetworkStatusChange(function(res){
console.log("网络是否连接:"+res.isConnected)
console.log("变化后的网络类型:"+res.networkType)
})
拨打电话
wx. makePhoneCall(Object)接口用于实现调用手机拨打电话
wx.makePhoneCall({
phoneNumber:'18092585093' //需要拨打的号码
})
扫描二维码
wx. scanCode(Object)接口用于调起客户端扫码界面,扫码成功后返回相应的内容
//允许从相机和相册扫码
wx.scanCode({
success:(res)=>{
console.log(res.result)
console.log(res.scanType)
console.log(res.charSet)
console.log(res.path)
}
})
//只允许从相机扫码
wx.scanCode({
onlyFromCamera:true,
success:(res)=>{
console.log(res)
}
})