微信小程序 快速(学习/参考)
小程序与公众号的区别
1.定位不同:公众号定位服务与信息传递,小程序面向产品与服务。
2.技术实现区别:公众号基于H5(vue/react/angular/ionin等),小程序基于自身开发环境与开发语言(某些第三方框架也能将vue打包成小程序环境)。
3.用户体验不同(小程序用户体验要比HTML5好,更接近原生app)
4.调用原生能力的不同(公众号可借助jssdk调用手机的摄像头,调用扫描二维码等,能力有限.小程序调用原生的能力强大,几乎能实现所有app能实现的功能)(调用原生的能力强,可不开发app.)
5.微信app入口不同
MINA框架介绍
MINA is not app 是微信开发小程序的框架,其目的是通过尽可能简单、高效的方式让开发者在微信中体验到接近原生的服务。
MINA提供自己的视图层描述语言xwml和wxss,以及基于javascript的逻辑层框架。并在视图层和逻辑层之间提供数据传输和事件系统,可让开发者方便聚焦于数据与逻辑上。
MINA的核心是一个相应数据绑定系统
系统分为视图层和逻辑层
MINA可让数据与视图保持同步非常简单。当做数据修改的时候,只需修改逻辑层数据,视图层就会相应更新
MINA是腾讯给微信小程序命名的框架,其实际上应用的是最推宠的MVVN模式
创建typescript项目
typescript本身就是编译成js的,所以在微信小程序同时生成js与ts文件,手动点击编译就会把ts编译成js文件
新建一页面
根目录app.json文件
{
"pages":[
"pages/news/news", 在此写上新页面路径保存,编辑器会自动创建文件
"pages/index/index"
]
}
微信的标签
无ul li,成对出现
view
<view> </view> 相当于div
text
<text> <text> 相当于span
button
<button size="mini" bindtap="go"></button> size设置按钮大小,给按钮绑定点击事件,执行方法时不加()
数据绑定
for遍历
<view wx:for="{{list}}">{{index}}---{{item}} <view> 微信默认每个遍历的数据赋值给item,
索引赋值给index
-------------
嵌套循环
<view wx:for="{{list}}">
{{item.cart}}
<view wx:for="{{item.reg}}">
{{item}}
<view>
<view>
list:[
{cart:"cart1",reg:["v1","v2"]},
{cart:"cart2",reg:["g1","g2"]}
]
-------------
自定义循环赋值的名字
<view wx:for="{{list}}" wx:for-index="i" wx:for-item="m">
{{i}} --{{m}}
<view>
注意 i 与 m 不加 {{}}
if隐藏
<view wx:if="{{flag}}"></view>
绑定属性
<view data-aid="{{user}}"></view> 微信绑定属性不需要加:或是[]
绑定单选按钮
<checkbox checked="{{false}}"></checkbox>
双向绑定
data:{
user:123
}
go(){
var go=this.data.user
go++;
this.setData({
user:go
})
}
获取元素html
<button bindtap="gethtml" data-id="456">获取按钮HTML<button>
gethtml(e){ e为该事件
e.target.dataset.id 获得元素自定义属性的值
}
微信小程序样式/属性绑定,元素隐藏
隐藏元素类似angular
<view hidden="{{yes}}"></view>
page({
data:{
yes:true
}
})
class绑定
<view class="test {{isavtive ? 'active':''}}"></view>
page({
data:{
isavtive:true
}
})
样式绑定
<view style="display:{{isdis}}"></view>
page({
data:{
isdis:"none" block/flex
}
})
for循环与自定义属性搭配无法获取值
<view bindtap="go" wx:for="{{list}}" wx:key="index" data-id="123"></view>
page({
data:{
list:[...]
},
go(e){
e.target 与for在同一元素内data-id无效
}
})
非冒泡事件
<view bindtap="go1"> 点击1触发1
<view catchtap="go2"> 点击2,触发2
<view bindtap="go3"> 点击3,触发3,2 2为阻止冒泡事件,所以3被阻止
</view>
</view>
</view>
touch冒泡的解决办法
微信小程序的touch事件
https://developers.weixin.qq.com/miniprogram/dev/framework/view/wxml/event.html#%E4%BA%8B%E4%BB%B6%E8%AF%A6%E8%A7%A3
使用catchtouch只能阻止向上冒泡,不能阻止子元素的冒泡
根据冒泡触发的元素有规律可寻
<view class='message' capture-catch:touchstart="clear" data-id="1">
<view class='nav' catchtap="go" data-id="2">
<button wx:for="{{nav}}" wx:key="index">{{item.title}}</button>
</view>
</view>
此时滑动元素message,会向下冒泡触发元素nav,
clear(e){
var id=e.target.dataset.id 滑动message、nav都会触发clear,但可根据他们的属性判断,触发来自哪个元素
if(id=="1"){
父元素
}else if(id=="2"){
子元素
}
}
Tabbar底部导航栏
导航栏最少两个,最多五个,写到根目录app.json
{
"tarBar":{
"custom":true,
"color":"#fff", 按钮的字体颜色
"selectedColor":"#000", 点击后的字体颜色
"backgroundColor":"#eee", 整个底部导航栏的背景颜色
"borderStyle":"black/white", 底部导航框上边框颜色,仅支持白色和黑色
"position":"top/bottom" top跑到最上边
"list":[{
"pagePath":"路由路径",
"text":"首页",
"iconPath":"图片路径",
"selectedIconPath":"被点击后的图片路径"
},
{
"pagePath":"路由路径",
"text":"我的",
"iconPath":"图片路径", 当position为top时,
"selectedIconPath":"被点击后的图片路径"
}
],
suingComponents:{}
}
}
组件跳转+配置当前页面标题
<button bildtap="show">跳转</button>
show(){
wx.navigateTo({
url:"../login/login"
})
}
组件的json文件中配置当前页面标题
{
"navigationBarTitleText":"当前组件标题名称",
"navigationBarBackgroundColor": "#000000",
"navigationBarTextStyle": "white"
}
跳转传值
<view wx:for="{{list}}">
<button size="mini" bindtap="goparams" data-id="{{index}}">跳转传参</button>
</view>
goparams(e){ 因为函数不能加括号传值所以用自定义属性传值
var id=e.target.dataset.id
wx.navigateTo({
url:"../login/login?id="+id
})
}
---------login组件---------
获取页面传过来的值
onLoad:function(options){
console.log(options) 打印结果 {id:xxx}
}
微信发送请求
wx.request({
url:"http://",
data:{ 参数不一定都写成对象
user:"",
pass:""
},
method:"get/post", 默认get
header:{
"content-type":"application/json" 这是微信默认的请求头
},
success:(res)=>{
console.log(res.data)
}
})
微信wxss自定义的字体、图片单位
在app项目中,一般以rem为单位
在微信中,可用rpx为单位,微信小程序会根据设备尺寸自动换算分辨率
设备 | rpx换算px | px换算rpx |
---|---|---|
iphone5 | 1rpx=0.43px | 1px=2.34rpx |
iphone6 | 1rpx=0.5px | 1px=2rpx |
iphone6 plus | 1rpx=0.552px | 1px=1.81rpx |
说明
iphone 6 的屏幕分辨率为 750*1334 物理分辨率为 375 * 667
一般图片分辨率设置成750px
微信小程序的图片路径问题
若图片带有http://127.0.0.1:5050/list/user\go=123 若路径带有\字符会被微信反编译成其他字符,导致图片路径不能被识别
改变服务器端的路径或客户端修改
使用客户端修改的方法
var row=res.data.list
for(var r of row){
r.url=r.url.replace(/\\/g,"/") 截取字符并替换
//replace("\\","/") 若存在多个满足条件的字符,也只能执行一次 "gh\gh\ghg\"有多个\执行到第一个就会停止 \\多加一\是反转义字符,计算机里\是特殊符号,一般不被当做字符,使用\将其转义为字符 正则表达式的g表示全局,会匹配字符下所有\
}
路径里边的变量拼接
url="http://127.0.0.1:5050/"
urls="nav/1.jpg"
<image src="{{url}}{{urls}}"></image> 相当于url+urls
微信小程序swiper轮播组件
主要属性
属性 | 描述 |
---|---|
indicator-dots=“true” | 是否显示导航指示点 |
autoplay=“true” | 是否自动东方播放 |
interval=“5000” | 自动播放间隔时间 |
duration=“1000” | 上一张图切换至下一张图所用时长 |
circular=“true” | 是否无缝链接 |
示例
<swiper class='u-wrp-bnr' indicator-dots='true' autoplay='true' interval='5000' duration='1000' circular='true'>
<block wx:for="{{bnrUrl}}" wx:for-index="index">
<swiper-item>
<image src='{{item.url}}' class='u-img-slide' mode='aspectFill'></image>
</swiper-item>
</block>
</swiper>
----------js-----
Page({
data: {
"bnrUrl": [{
"url": "img/1242x366-1531449084.jpg"
}, {
"url": "img/1242x366_djj_0706-1530871651.jpg"
}, {
"url": "img/1242x366_lyx_0709-1531122892.jpg"
}, {
"url": "img/14540040236323_1_o.jpg"
}]
}
});
autoplay/interval等也可绑定变量后台操作
微信上拉加载刷新
使用微信内置方法
全局app.json文件
{
"enablePullDownRefresh":true, 开启全局的下拉刷新事件,若上拉刷新则不用
"onReachBottomDistance":50 页面上拉触底事件触发时距离页面底部的距离 50为默认值,单位px
}
组件
page({
onReachBottom(){
}
})
使用scroll-view标签
scroll-view必须得给定高度,不然没法实现滚动
scroll-view属性详情
属性 | 默认 | 说明 |
---|---|---|
scroll-x | false | 是否允许水平滚动 |
scroll-y | false | 是否允许垂直滚动 |
upper-threshold | 50(number/string) | 触发scrolltoupper事件的顶部/左边距离 |
lower-threshold | 50(number/string) | 触发scrolltolower事件的底部/右边距离 |
scroll-top | number/string | 设置垂直滚动位置 |
scroll-left | number/string | 设置水平滚动位置 |
scroll-width-animation | false | 设置滚动位置后,是否显示滚动效果 |
scroll-view事件
事件 | 说明 |
---|---|
bindscrolltoupper | 滚动到顶部/左边时触发 |
bindscrolltolower | 滚动到底部/右边时触发 |
bindscroll | 只要处于滚动状态就会触发 |
实例,解决重复请求,this指向问题,数据到底关闭问题
调用系统信息官方文档
https://developers.weixin.qq.com/miniprogram/dev/api/base/system/system-info/wx.getSystemInfo.html
-------------wxml-------------
<scroll-view style="height:{{height}}px" scroll-y bindscrolltolower="getdata">
...
...
...
</scroll-view>
-------------js-------------
page({
data:{
height:"400",
info:true,
list:[]
}
onLoad(options){
wx.getSystemInfo({ 调用系统信息
success:(res)=>{
this.setData(
height:res.windowHeight 获取设备高度
)
}
})
},
quest(){
this.setData({
info:false
})
var that=this 解决下边function的指代问题,
wx.request({
url:"...",
succedd:function(res){
if(res.data.length<10){
var fl=false
}else{
var fl=true
}
var list=that.data.list
list=list.concat(res.data)
that.setData({
list:list,
info:fl 防止网络慢出现重复请求
})
})
},
getdata(e){
if(this.datainfo){
this.quest()
}
}
})
微信小程序解析HTML代码
将普通的HTML代码片段解析为微信小程序标签
使用web-view标签
是一个可用于承载页面的容器,会自动补满小程序页面
但web-view不支持个人类型和海外类型的小程序
<web-view src="https://.."></web-view>
使用wxParse
github搜索wxParse 选择icindy/wxParse下载即可
将wxParse项目目录下的wxParse文件拷贝到自己项目根目录
引入主要文件
var wxparse=require("../../wxParse/wxParse.js")
在要使用的wxss中引入 也可在app.wxss
@import "/wxParse/wxParse.wxss"
数据绑定
var article="<div>HTML片段</div>"
var that=this
wxParse.wxParse("article","html",article,that,5)
对应顺序解释为
bindname绑定的数据名
type输入的数据类型,html或md
target指page对象,一般为this
imagepadding 若当前片段为图片,设置图片的左右内边距值,默认为0
前台渲染
<import src="...../wxParse/wxParse.wxml"/> 在要使用的wxml中引入
<view>
<template is="wxParse" data="{{wxParse.wxParseData:article.nodes}}"/>
</view> wxParseData中的article是bindname
util模块化的使用
把一些公共的代码单独抽至一个单独的js文件中,作为一个模块,必须通过module.export或exports 暴露才能被外只用
自定义模块
在根目录util文件夹中新建一个js文件,在该文件中
var myapp={
host:"http://127.0.0.1:5050", 封装公共域名
getdata(){
return this.host
}
}
module.exports=myapp 将本文件暴露
引入模块
var config=require("../../util/*.js")
console.log(config)
app.js全局数据
根目录app.js文件中
app({
globalData:{
user:"nice"
},
getdata(){
return "kcone"
}
})
要调用数据的组件
var app=getApp() 获取实例
app.getdata() 打印 kcone
app.globalData.user 打印 nice globalData与自定义的方法都是一样的地位,不局限于此
微信wxs脚本语言的使用
wxs是微信小程序的一套脚本语言,结合wxml可构建出页面的结构
wxs中不可调用其他js文件的方法,不可调用微信小程序api
wxs不可作为组件的事件回调
不可用()=>{} 不可用 const 声明时间new Date() 变成 getDate()
类似于js,但wxs有自己的一套方法,方法名字可能不同,具体请参考
https://developers.weixin.qq.com/miniprogram/dev/reference/wxs/
创建 在微信开发者工具右键创建选择wxs即可
mywxs.wxs
var user="kcone"
var getdata=function(e){
return e
}
module.exports={
user:user,
getdata:getdata
}
module.export.msg="what is you name"
wxml文件
<view> {{sky.msg}}</view> 这样是会报错的,还没导入就使用
<wxs src="./mywxs.wxs" module="sky"></wxs> 将引入的数据传给sky
<view> {{sky.getdata(sky.user)}}</view> bindtap点击事件函数不能加括号在此可行
<view>{{sky.msg}}</view>
自定义组件
组件可将公共的功能封装起来,方便其他地方使用
可扩展HTML应用的不足
创建一个组件
微信开发工具在选定的目录下右键选择component即可,此方式只创建四个对应组件(wxml/wxss/json/js)文件,不创建文件夹。
组件的js中为component 与vue类似
br.js
component({
data:{
... 组件数据
},
methods:{
... 存放方法
},
properties:{
... 存放属性
}
})
br.wxml
<view class="br"></view>
br.wxss
.br{
height:200rpx;
}
br.json ...
在需要用到组件的json文件下声明要引用的组件
---------**.json-------
{
"usingComponents":{
"br":"组件的路径", name为组件定义的名字
"search":"../search/search" 可引入多个组件
}
}
----------**.wxml---------
<br/> 即可引用
<br></br> 也可使用双标签
组件传值
父组件传值
父组件
<header title="{{user}}" type="{{list}}" value="{{value}}" fun="{{func}}"></header> 给子组件绑定一个属性
子组件js
component({
data:{
user:"kcone",
num:0
},
properties:{
title:string, 简化定义
/*title:{ 详细的定义法
type:string, 数据类型/string/number...
value:"设置数据默认值",
observer:()=>{} 处理逻辑
type/value/observer都是内置属性,不可自行更改
}*/
},
methods:{ component数据操作和page一样
add:(){
var num=this.data.num
num:num+1
this.setData({
num:num
})
var user=this.data.user
return user
}
}
})
父组件调用子组件方法
调用子组件时定义id
--------子组件js-----------
component({
data:{
list:[...]
},
methods:{
add(){}
}
})
--------父组件wxml--------
<header id="header"><header>
---------父组件js---------
var header=this.selectComponent("#header")
header.add()
header.data.list 调用子组件数据
子组件调用父组件方法
---------父组件wxml-----------
<header bind:futher="myfuther"></header> :可加,可不加
---------父组件js-----------
page({
data(){},
myfuther(){
return "kcone"
}
})
---------子组件js--------------
component({
properties:{},
methods:{
go(){
this.triggerEvent("futher","传入的参数",set) 如有嵌套关注set
}
}
})
子组件调用父组件set内容(可能不重要)
set | 默认值 | 描述 |
---|---|---|
bubbles | false | 事件是否冒泡 |
composed | false |
事件是否可穿越组件边界,为false时, 事件只能在引用组件节点树上触发 不进入其他任何组件内部 |
capturePhase | false | z组件是否拥有可捕获阶段 |
slot的使用
在组价wxml提供一个slot节点,用于承载组件引用时提供的子节点
component.wxml
------子组件header-----
<view>****组件页面</view>
</slot></slot>
page.wxml
<header>
<button>父组件按钮<button> 父组件引用子组件,并向其筛入一个按钮
</header>
自定义Toast组件
子组件wxml
<view class='futher' hidden="{{info}}">
<view class='son'>{{message}}</view>
</view>
子组件wxss
.futher{
position:fixed;top:0; bottom:0;left:0;right:0;表示元素水平垂直居中
flex元素内容水平垂直居中
}
.son{
text-align:center;line-height:120%;
padding:34rpx 50rpx; 子元素靠内边距撑起 字体背景颜色等省略
max-width:70%;min-width:35%; 有最大最小宽}
子组件js
Component({
data: {
info:true,
message:""
},
methods: {
gets(e){
this.setData({
info:false,
message:e
})
setTimeout(() => {
this.setData({
info: true
})
}, 1000)}}})
父组件
<toast id="mytoast"></toast>
<button bindtap='text' size='mini'>toast弹窗</button>
text(e?:any){
var toast:any=this.selectComponent("#mytoast")
toast.gets("hello")
},
微信交互(提示窗口/确认窗/加载窗/底部弹窗)
wx.showToast
wx.showToast({
title:"文字显示内容",
icon:"none/success/loading", 无图标/打钩/加载圆
duration:1000,
image:"图片路径", 自定义图标的路径,优先级高于icon
mask:false, 是否显示遮罩层,默认false
success:()=>{},
fail:(e)=>{e.errMsg},
complete:()=>{}
})
/*setTimeout(()=>{
wx.hideToast() 也可使用hideToast使其关闭
},1000)*/
wx.showModal() 确认窗口
wwx.showModal({
title:"标题内容",
content:"提示内容",
showCancel:true, 是否显示曲线按钮,默认false
cancelText:"", 取消按钮文字内容,最多4字符
cancelColor:"#fff", 取消按钮颜色
confirmText:"", 确定按钮文本内容,最多4字符
confirmColor:"#fff", 确定按钮颜色
success:(res)=>{
res.confirm true为用户确定,false为用户取消,confirm与cancel相反
res.cancel
}
})
wx.showLoading 加载窗口
wx.showLoading({
title:"标题",
mask:false, 是否显示遮罩层
success:()=>{},
fail:(e)=>{e.errMsg},
complate:()=>{} //无论成功失败都加在
})
setTimeout(()=>{
wx.hideLoading() 需手动关闭
},1000)
wx.showActionSheet() 底部显示窗口
wx.showActionSheet({
itemList:["a","b","c"],
itemColor:"",
success:(e)=>{
e.tapIndex 用户点击按钮返回的索引
},
})
只要点击按钮就会自动关闭
微信小程序内置组件
swiper 轮播组件
https://developers.weixin.qq.com/miniprogram/dev/component/swiper.html
属性
属性 | 类型 | 默认值 | 说明 |
---|---|---|---|
indicator-dots | boolean | false | 是否显示导航圆点 |
indicator-color | color | rgba(0,0,0,0.3) | 导航圆点颜色 |
indicator-active-color | color | #fff | 导航点被选中的颜色 |
autoplay | boolean | false | 是否自动播放 |
current | number | 0 | 当前滑块的索引 |
interval | number | 5000 | 自动播放时间间隔 |
duration | number | 500 | 切换至下一张图的时间 |
circular | boolean | false | 是否使用链接滑动 |
vertical | boolean | false | 滑动方向是否为垂直 |
previous-margin | string | 0px | 前边距,可看成margin-left/top |
next-margin | string | 0px | 后边距,可看成margin-right/bottom |
事件
事件 | 描述 |
---|---|
bindchange | 滑动轮播就会触发 |
bindtransition | 滑动动画开始触发 |
bindanimationfinish | 滑动动画结束触发 |
实例
<swiper indicator-dots="true" autoplay="true" interval="3000" duraction="800" circular="true">
<block wx:for="{{list}} wx:key="index">
<swiper-item>
<image src="{{item.src}}"></image>
<swiper-item>
<swiper-item>
<image src="{{item.src}}"></image>
<swiper-item>
</block>
</swiper>
video 视频媒体标签
https://developers.weixin.qq.com/miniprogram/dev/component/video.html
<video src="http://" controls="true" event-model="buble" id="myvideo"></video>
controls 是否使用微信自带播放控件
page({
var myvideo=wx.createVideoContent("#myvideo") 获取视频元素
myvideo.play() 播放视频
myvideo.pause() 停止播放
})
cover-view
是覆盖在原生组件上的文本视图,可覆盖的原生组件包括map/video/canvas/camera等,有些类似position的z-index,cover-view是覆盖在视图之上的
实例自定义视频播放控件
<video src="...">
<cover-view> 要覆盖到视频视图之上,得在video标签内
<cover-image></cover-image> 支持嵌套cover-view/cover-image/button
<button><button>
<cover-view></cover-view>
</cover-view>
</video>
微信基础内容
icon 图标
属性 | 类型 | 说明 |
---|---|---|
type | string(该属性不可空) |
值有success/info/warn/waiting/cancel/download//search/clear success_no_circle |
size | number/string(默认23) | icon的大小 |
color | string | 支持css3的颜色格式 |
实例
演示图 https://res.wx.qq.com/wxdoc/dist/assets/img/icon.d50f3532.png
<icon type="success" size="22" color="#fff"></icon>
text 文本标签
<text selectable="false" space="false" decode="false" ></text>
selectable 文本是否可选 默认false
space 是否显示连续空格 string类型 默认false
decode 是否解码 默认false
rich-text
将html标签解析为微信标签
<rich-text nodes="{{nodes}}"></rich-text>
page({
data:{
nodes:{ 值可为数组,也可为字符串 "<div><span></span><div>"
[{
name: 'div',
attrs: {
class: 'div_class',
style: 'line-height: 60px; color: red;'
},
children: [{
type: 'text',
text: 'Hello World!'
}]
}]
}
}
})
progress 进度条
属性 | 类型 | 默认值 | 说明 |
---|---|---|---|
percent | number | 0~100百分比 | |
show-info | boolean | false | 是否显示右侧进度条百分比 |
border-radius | number/string | 0 | 圆角 |
font-size | number/string | 16 | 百分比字体大小 |
stroke-width | number/string | 6 | 进度条高度 |
color | string | #09BB07 | 百分比颜色 |
activeColor | string | #09BB07 | 选择的进度颜色 |
active | false | c出现从左到右的动画 |
实例
<progress percent="30" color="#fff" show-info bindactiveend="{{end}}"/>
bindactiveend 进度加载完成后触发事件
表单组件
input
https://developers.weixin.qq.com/miniprogram/dev/component/input.html
属性
类型列括号内为默认值
属性名 | 类型 | 描述 |
---|---|---|
value | string | 输入框里的初始值 |
type | string(text) text/number/idcard/digit |
iinput的类型 从左到右为 文本/数字/身份证/带小数数字 |
password | Boolean(false) | 是否为密码类型 |
placeholder | string | 占位符 |
placeholder-style | string | 指定占位符样式 |
placeholder-class | string(input-placeholder) | 指定占位符样式类 |
disabled | Boolean(false) | 是否禁用 |
maxlength | number(140) | 指定最大字符串长度,为-1时无限制 |
focus | boolean(false) | 是否自动获得焦点 |
confirm-type | string(send/search/next/go/done) |
设置右下角键盘文字 发送/搜索/下一个/前往/完成 |
confirm-hold | boolean(false) | d点击键盘右下角按钮是否保持不收起 |
事件
事件 | 说明 |
---|---|
bindinput | 只要输入内容就会触发(e.value/e.cursor/keyCode键值) |
bindfocus | 输入框聚焦事件(value/height键盘高度) |
bindblur | 失去焦点事件 |
bindconfirm | 点击完成按钮触发,也就是confirm-type值为done |
button
属性
属性 | 类型:值(默认值) | 描述 |
---|---|---|
size | string:default/size(default) | 按钮大小 默认/迷你 |
type | string:primary/default/warn(default) | 按钮样式 绿色/红色/白色 |
plain | Boolean(false) | 按钮是否镂空,背景色透明 |
disabled | Boolean(false) | 是否禁用 |
loading | string | 字符前是否带有loading图标 |
form-type | string:submit/reset | 对form组件有效,点击触发submit/reset事件 |
open-type | string | 微信开放能力 |
app-parameter | string | 打开app时,向app传递的参数,open-type=”launchApp”时有效 |
微信开发能力
open-type=“值”
值 | 说明 |
---|---|
contact | 打开客服会话,若用户在会话中消息卡片返回小程序,可从bindcontact回调或得信息 |
share |
触发用户转发 https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/share.html#%E4%BD%BF%E7%94%A8%E6%8C%87%E5%BC%95 |
getPhoneNumber | 获取用户手机号,从bindgetphonenumber回调中获取用户信息 |
getUserInfo | 获取用户信息,bindgetuserinfo中得到 |
launchApp | 打开app,通过app-parameter属性设定传向app的参数 |
openSetting | 打开授权设置页 |
feedback | 打开意见反馈页面 |
事件
事件 | 说明 |
---|---|
bindgetuserinfo |
该按钮被点击返回用户信息,回调数据detail与wx.getUserInfo一致 仅当type=“getUserInfo” 有效 |
bindcontact | 客服消息回调,仅当open-type=“contact” 有效 |
bindgetphonenumber | 获取用户手机回调,open-type=“launchApp” 时有效 |
binderror | 使用开放能力发生错误的回调,open-type=”launchApp”有效 |
bindopensetting | 打开授权设置后执行的回调,open-type=openSetting有效 |
bindlaunchapp | 打开app成功执行的回调,open-type=”launchApp”有效 |
checkbox checkbox-group 多选按钮
checkbox属性
属性 | 类型:值(默认值) | 描述 |
---|---|---|
value | string | 用于标识checkbox 类似 |
disabled | boolean:(false) | 是否禁用 |
checked | boolean:(false) | 当前CheckBox的选择状态 |
color | color:(#09bb07) | check的颜色 |
实例
<checkbox-group bindchange="change"> 多项选择器,内部由多个checked组成
<label wx:for="{{list}}"> 用for绑定对应标签id也可嵌套该标签里边,内部有多个标签的时候默认触发第一个,可绑定的控件有button/checkbox/radio/switch
<checkbox value="{{item.name}}" chacked="{{item.checked}}">{{item.title}}</checkbox>
</label>
</checkbox-group>
page({
data:{
list:[{name:"1",checked:false,title:"男"}, {name:"2",checked:false,title:"女"},
{name:"3",checked:false,title:"保密"}
]
},
change(e){
e.detail.value 返回当前被选定的数组,["1","2"]
}
})
radio 单选按钮
属性与checkbox一致
实例
<radio-group bindchange="change"> 同chackbox-group
<label wx:for="{{list}}" wx:key="index">
<radio value="{{item.name}}" checked="{{item.check}}"></radio>
</label>
</radio-group>
page({
data:{
list:[{name:"1",checked:false,title:"男"}...]
}
change(e){e.detail.value}
})
switch 开关
属性
属性 | 类型:值(默认值) | 说明 |
---|---|---|
checked | boolean:(false) | 选中状态 |
disabled | boolean:(false) | 是否禁用 |
type | string:switch/checkbox(switch) | 开关的样式 |
color | color:(04be02) | switch的颜色 |
bindchange | 选中状态发生改变就会触发 |
实例
<view>
<switch bindchange="channge"></switch>
</view>
change(e){
e.detail.value 当前按钮的点击状态
}
form
所有表单标签的父标签,微信可用form,但vue/angular不推荐用form表单,提交表单会有默认的刷新事件,微信无需阻止
实例
<fomr bindsubmit="submit" bindreset="reset">
<input name="user"></input> 注意表单组件要定义name名称,提交要用
<checkbox-group name="check">
<checkbox></checkbox>...
</checkbox-group>
<button form-type="submit">提交</button>
<button form-type="reset">重置</button>
</form>
submit(e){
e.detail.value 获取全部表单的值
}
reset(){} 表单重置事件
picker
从底部弹起的标签选择器,有时间,日期,地区等
https://developers.weixin.qq.com/miniprogram/dev/component/picker.html
属性
属性 | 类型/值(默认值) | 描述 |
---|---|---|
mode | string:selector/multiSelector/time/date/region(selector) |
选择器的类型 普通/多项选择器/时间/日期/省份 |
disabled | boolean(false) | 是否禁用 |
bindcancel | event | 取消选择触发的事件 |
普通选择器
属性 | 类型:值(默认值) | 描述 |
---|---|---|
range | array/objectarray(array) | mode为selector或multiSelector时,range有效 |
rang-key | string |
若range为数组对象时,通过range-key制定object中key的值 作为选择器显示内容 |
value | number | range值的索引 |
bindchange | event | value改变触发的事件 |
实例
<picker mode="selector" range="{{list}}" value="{{ids}}" bindcolumnchange="change">
<view>触发</view> 必须放置子标签使其点击才能触发选择器
<view>你选择的是{{list[ids]}}</view>
</picker>
page({
data:{list:["北京","上海","广州","天津","重庆"],ids:0},
change(e){
e.detail.value
}
})
多项选择器
<picker mode="multiSelector" range={{list}} value="{{index}}" bindcange="change" bindcolumnchange="column">
<view>选择省份</view>
</picker>
page({
data:{
list:[["广东","广西","山东"],["广州","深圳","汕头"]], 多线选择器数据必须以数组套数组的方式存在,数组里数据的个数与对应下标的个数一致
index:[0,0]
},
change(e){ value改变时触发
e.detail.value value改变时触发change
},
column(e){ 列改变时触发
var raw=e.detail.column 代表列
var col=e.detail.value 代表列下对应的行,可看做表格的列与行间的布局
var obj={
list:this.data.list,
index:this.data.index
}
if(raw==0){
if(col==0){
obj.list[1]=["广州","深圳","汕头"]
}else if(col==1){
obj.list[1]=["南宁","北海","博白"]
}else if(col==2){
obj.list=["太原","石家庄","青岛"]
}
}
this.setData(obj)
}
})
媒体组件
image
图片缩放请参考
https://developers.weixin.qq.com/miniprogram/dev/component/image.html
图片预览
点击图片后进入一个背景内,可在该背景中左右滑动浏览多张图片
<image src="..." bindtap="zoom"></image>
zoom(){
wx.perviewImage({
current:"可能为绝对路径", 当前显示图片的路径
url:["http","http"] 需预览图片的http连接列表
})
}
camera
可自定义拍照页面,默认是会调用系统自带拍照组件
https://developers.weixin.qq.com/miniprogram/dev/component/camera.html
属性
属性 | 类型:值(默认值) | 说明 |
---|---|---|
mode | string:normal/scanCode(normal) |
应用模式只有初始化有效,不可改变 scanCode好似无效 |
device-position | string:back/front(back) | 选择打开的摄像头,前置/后置 |
flash | string:auto(auto) | auto自动/no开/off关 |
bindstop | event | 摄像头不正常退出时触发 |
bindinitdone | event | 相机完成初始化时触发 |
frame-size | string:medium/small/large(medium) | 指定相机的拍照帧数 |
实例
<camera device-position="back" flash="off" binderror="error" style="width:100%;height:600rpx;">
</camera>
<button size="mini" bindtap="take">拍照</button>
<button size="mini" bindtap="startrec">开始录制</button>
<button size="mini" bindtap="stoprec">停止录制</button>
<image wx:if="images" src="{{images}}"></image>
<video wx:if="{{videos}}" src="{{videos}}"></video>
data:{images:"",videos:""},
ctx:null,
take(){
this.ctx=wx.createCameraContext()
this.ctx.takePhoto({
quality:"high",
success:(res)=>{
this.setData({images:res.tempImagePath})
}
})
},
startrec(){
this.ctx.startRecord({
success:(res)=>{
console.log("已开始录制")
}
})
},
stoprec(res){
this.ctx.stopRecord({
success:(res)=>{
this.setData({images:res.tempThumbPath,videos:res.tempVideoPath})
}
})
},
error(e){
e.detail
}
audio 音频控件
https://developers.weixin.qq.com/miniprogram/dev/component/audio.html
属性
属性 | 类型:值(默认值) | 描述 |
---|---|---|
controls | boolean(false) | 是否使用微信自带播放控件 |
loop | boolean(false) | 是否循环播放 |
poster | string | 音频的海报 |
name | string | 默认控件的音频名字,若未开启控件该属性无效 |
author | string | 默认控件的音频作者,未开启控件无效 |
binderror | event: |
音频发生错误的事件e.detail={errMsg:MediaError.code} code表示错误码:1资源被用户禁止2网络错误3解码错误4不适合资源 |
bindplay | event | 音频开始/继续播放时,触发 |
bindpause | event | 停止播放时触发 |
bindtimeupdate | event | 播放进度改变时触发e.detail={currentTime,duration} |
bindended | event | 音频播放结束时触发 |
实例
<audio src='http://127.0.0.1:5050/chat/text.mp3' id="aud"></audio>
<button bindtap="audstart">开始播放</button><button bindtap="audstop">暂停播放</button>
page({
data:{},
onLoad(){
this.ctx=wx.createAudioContext("aud")
},
ctx:null,
audstart(){
this.ctx.play()
},
audstop(){
this.ctx.pause()
}
})
live-player 流视频
通俗讲就是视频直播,微信平台的;流视频需要审核
https://developers.weixin.qq.com/miniprogram/dev/component/live-player.html
open-data
展示开放数据,可获取用户的数据,如城市/性别/头像等
有时无法获得数据可能是由于用户未填写对应信息
https://developers.weixin.qq.com/miniprogram/dev/component/open-data.html
属性
属性 | 类型:值(默认值) | 描述 |
---|---|---|
type | string | 声明开放型数据类型 |
lang | string:en/zh_CN/zh_TW |
使用何语言展示用户数据,type=”user*” type的值以user开头时有效 英文简体中文/简体英文 |
type的合法值
type的值 | 说明 |
---|---|
userNickName | 用户昵称 |
userAvatarUrl | 用户头像 |
userGender | 用户头像 |
userCity | 用户所在城市 |
userProvince | 用户所在省份 |
userCountry | 用户所在国家 |
userLanguage | 用户使用语言 |
实例
<open-data type="groupName" open-gid="xxxxxx"></open-data> 还不知如何使用
<open-data type="userAvatarUrl"></open-data>
<open-data type="userGender" lang="zh_CN"></open-data>
web-view
<web-view src="http://"></web-view> 会把远程的页面放到微信程序里边运行