小程序中所有组件学习

视图容器

view

视图容器

属性名类型默认值说明最低版本
hover-classStringnone指定按下去的样式类。当 hover-class="none" 时,没有点击态效果
hover-stop-propagationBooleanfalse指定是否阻止本节点的祖先节点出现点击态1.5.0
hover-start-timeNumber50按住后多久出现点击态,单位毫秒
hover-stay-timeNumber400手指松开后点击态保留时间,单位毫秒
<view class="section">
  <view class="section__title">flex-direction: row</view>
  <view class="flex-wrp" style="flex-direction:row;">
    <view class="flex-item bc_green">1</view>
    <view class="flex-item bc_red">2</view>
    <view class="flex-item bc_blue">3</view>
  </view>
</view>
<view class="section">
  <view class="section__title">flex-direction: column</view>
  <view class="flex-wrp" style="height: 300px;flex-direction:column;">
    <view class="flex-item bc_green">1</view>
    <view class="flex-item bc_red">2</view>
    <view class="flex-item bc_blue">3</view>
  </view>
</view>

tip: 如果需要使用滚动视图,请使用 scroll-view

scroll-view

可滚动视图区域

属性名类型默认值说明
scroll-xBooleanfalse允许横向滚动
scroll-yBooleanfalse允许纵向滚动
upper-thresholdNumber50距顶部/左边多远时(单位px),触发 scrolltoupper 事件
lower-thresholdNumber50距底部/右边多远时(单位px),触发 scrolltolower 事件
scroll-topNumber 设置竖向滚动条位置
scroll-leftNumber 设置横向滚动条位置
scroll-into-viewString 值应为某子元素id(id不能以数字开头)。设置哪个方向可滚动,则在哪个方向滚动到该元素
scroll-with-animationBooleanfalse在设置滚动条位置时使用动画过渡
enable-back-to-topBooleanfalseiOS点击顶部状态栏、安卓双击标题栏时,滚动条返回顶部,只支持竖向
bindscrolltoupperEventHandle 滚动到顶部/左边,会触发 scrolltoupper 事件
bindscrolltolowerEventHandle 滚动到底部/右边,会触发 scrolltolower 事件
bindscrollEventHandle 滚动时触发,event.detail = {scrollLeft, scrollTop, scrollHeight, scrollWidth, deltaX, deltaY}

使用竖向滚动时,需要给<scroll-view/>一个固定高度,通过 WXSS 设置 height。

tip:

1.请勿在 scroll-view 中使用 textarea、map、canvas、video 组件

2.scroll-into-view 的优先级高于 scroll-top

3.在滚动 scroll-view 时会阻止页面回弹,所以在 scroll-view 中滚动,是无法触发 onPullDownRefresh

4.若要使用下拉刷新,请使用页面的滚动,而不是 scroll-view ,这样也能通过点击顶部状态栏回到页面顶部

swiper

滑块视图容器

属性名类型默认值说明最低版本
indicator-dotsBooleanfalse是否显示面板指示点
indicator-colorColorrgba(0, 0, 0, .3)指示点颜色1.1.0
indicator-active-colorColor#000000当前选中的指示点颜色1.1.0
autoplayBooleanfalse是否自动切换
currentNumber0当前所在滑块的 index
current-item-idString""当前所在滑块的 item-id ,不能与 current 被同时指定1.9.0
intervalNumber5000自动切换时间间隔
durationNumber500滑动动画时长
circularBooleanfalse是否采用衔接滑动
verticalBooleanfalse滑动方向是否为纵向1.1.0
previous-marginString"0px"前边距,可用于露出前一项的一小部分,接受 px 和 rpx 值1.9.0
next-marginString"0px"后边距,可用于露出后一项的一小部分,接受 px 和 rpx 值1.9.0
display-multiple-itemsNumber1同时显示的滑块数量1.9.0
skip-hidden-item-layoutBooleanfalse是否跳过未显示的滑块布局,设为 true 可优化复杂情况下的滑动性能,但会丢失隐藏状态滑块的布局信息1.9.0
bindchangeEventHandle current 改变时会触发 change 事件,event.detail = {current: current, source: source}
bindanimationfinishEventHandle 动画结束时会触发 animationfinish 事件,event.detail 同上1.9.0

从 1.4.0 开始,change事件返回detail中包含一个source字段,表示导致变更的原因,可能值如下:

1.autoplay 自动播放导致swiper变化;

2.touch 用户划动引起swiper变化;

3.其他原因将用空字符串表示。

注意:其中只可放置<swiper-item/>组件,否则会导致未定义的行为。

swiper-item

仅可放置在<swiper/>组件中,宽高自动设置为100%

属性名类型默认值说明最低版本
item-idString""该 swiper-item 的标识符1.9.0
<swiper indicator-dots="{{indicatorDots}}"
  autoplay="{{autoplay}}" interval="{{interval}}" duration="{{duration}}">
  <block wx:for="{{imgUrls}}">
    <swiper-item>
      <image src="{{item}}" class="slide-image" width="355" height="150"/>
    </swiper-item>
  </block>
</swiper>
<button bindtap="changeIndicatorDots"> indicator-dots </button>
<button bindtap="changeAutoplay"> autoplay </button>
<slider bindchange="intervalChange" show-value min="500" max="2000"/> interval
<slider bindchange="durationChange" show-value min="1000" max="10000"/> duration

Page({
  data: {
    imgUrls: [
      'http://img02.tooopen.com/images/20150928/tooopen_sy_143912755726.jpg',
      'http://img06.tooopen.com/images/20160818/tooopen_sy_175866434296.jpg',
      'http://img06.tooopen.com/images/20160818/tooopen_sy_175833047715.jpg'
    ],
    indicatorDots: false,
    autoplay: false,
    interval: 5000,
    duration: 1000
  },
  changeIndicatorDots: function(e) {
    this.setData({
      indicatorDots: !this.data.indicatorDots
    })
  },
  changeAutoplay: function(e) {
    this.setData({
      autoplay: !this.data.autoplay
    })
  },
  intervalChange: function(e) {
    this.setData({
      interval: e.detail.value
    })
  },
  durationChange: function(e) {
    this.setData({
      duration: e.detail.value
    })
  }
})

tip: 如果在 bindchange 的事件回调函数中使用 setData 改变 current 值,则有可能导致 setData 被不停地调用,因而通常情况下请在改变 current 值前检测 source 字段来判断是否是由于用户触摸引起

movable-view
movable-area

movable-view 的可移动区域; 基础库 1.2.0 开始支持,低版本需做兼容处理

属性名类型默认值说明最低版本
scale-areaBooleanfalse当里面的movable-view设置为支持双指缩放时,设置此值可将缩放手势生效区域修改为整个movable-area1.9.90

注意:movable-area 必须设置width和height属性,不设置默认为10px

movable-view

可移动的视图容器,在页面中可以拖拽滑动; 基础库 1.2.0 开始支持,低版本需做兼容处理

属性名类型默认值说明最低版本
directionStringnonemovable-view的移动方向,属性值有all、vertical、horizontal、none
inertiaBooleanfalsemovable-view是否带有惯性
out-of-boundsBooleanfalse超过可移动区域后,movable-view是否还可以移动
xNumber / String 定义x轴方向的偏移,如果x的值不在可移动范围内,会自动移动到可移动范围;改变x的值会触发动画
yNumber / String 定义y轴方向的偏移,如果y的值不在可移动范围内,会自动移动到可移动范围;改变y的值会触发动画
dampingNumber20阻尼系数,用于控制x或y改变时的动画和过界回弹的动画,值越大移动越快
frictionNumber2摩擦系数,用于控制惯性滑动的动画,值越大摩擦力越大,滑动越快停止;必须大于0,否则会被设置成默认值
disabledBooleanfalse是否禁用1.9.90
scaleBooleanfalse是否支持双指缩放,默认缩放手势生效区域是在movable-view内1.9.90
scale-minNumber0.5定义缩放倍数最小值1.9.90
scale-maxNumber10定义缩放倍数最大值1.9.90
scale-valueNumber1定义缩放倍数,取值范围为 0.5 - 101.9.90
animationBooleantrue是否使用动画2.1.0
bindchangeEventHandle 拖动过程中触发的事件,event.detail = {x: x, y: y, source: source},其中source表示产生移动的原因,值可为touch(拖动)、touch-out-of-bounds(超出移动范围)、out-of-bounds(超出移动范围后的回弹)、friction(惯性)和空字符串(setData)1.9.90
bindscaleEventHandle 缩放过程中触发的事件,event.detail = {x: x, y: y, scale: scale},其中x和y字段在2.1.0之后开始支持返回1.9.90

除了基本事件外,movable-view提供了两个特殊事件

类型触发条件最低版本
htouchmove初次手指触摸后移动为横向的移动,如果catch此事件,则意味着touchmove事件也被catch1.9.90
vtouchmove初次手指触摸后移动为纵向的移动,如果catch此事件,则意味着touchmove事件也被catch1.9.90

movable-view 必须设置width和height属性,不设置默认为10px

movable-view 默认为绝对定位,top和left属性为0px

当movable-view小于movable-area时,movable-view的移动范围是在movable-area内;当movable-view大于movable-area时,movable-view的移动范围必须包含movable-area(x轴方向和y轴方向分开考虑)

注意:movable-view必须在<movable-area/>组件中,并且必须是直接子节点,否则不能移动

cover-view

覆盖在原生组件之上的文本视图,可覆盖的原生组件包括map、video、canvas、camera、live-player、live-pusher,只支持嵌套cover-view、cover-image,可在cover-view中使用button

属性名类型默认值说明最低版本
scroll-topNumber 设置顶部滚动偏移量,仅在设置了 overflow-y: scroll 成为滚动元素后生效2.1.0
cover-image

覆盖在原生组件之上的图片视图,可覆盖的原生组件同cover-view,支持嵌套在cover-view里。基础库 1.4.0 开始支持,低版本需做兼容处理

属性名类型默认值说明最低版本
srcString 图标路径,支持临时路径、网络地址(1.6.0起支持)、云文件ID(2.2.3起支持)。暂不支持base64格式
bindloadEventHandle 图片加载成功时触发
binderrorEventHandle 图片加载失败时触发

tip:

1.基础库 2.1.0 起支持设置 scale rotate 的css样式,包括transition动画

2.基础库 1.9.90 起 cover-view 支持 overflow: scroll,但不支持动态更新 overflow

3.基础库 1.9.90 起最外层 cover-view 支持 position: fixed

4.基础库 1.9.0 起支持插在 view 等标签下。在此之前只可嵌套在原生组件map、video、canvas、camera内,避免嵌套在其他组件内。

5.基础库 1.6.0 起支持css transition动画,transition-property只支持transform (translateX, translateY)与opacity。

6.基础库 1.6.0 起支持css opacity。

7.事件模型遵循冒泡模型,但不会冒泡到原生组件。

8.文本建议都套上cover-view标签,避免排版错误。

9.只支持基本的定位、布局、文本样式。不支持设置单边的border、background-image、shadow、overflow: visible等。

10.建议子节点不要溢出父节点

11.默认设置的样式有:white-space: nowrap; line-height: 1.2; display: block;

12.自定义组件嵌套 cover-view 时,自定义组件的 slot 及其父节点暂不支持通过 wx:if 控制显隐,否则会导致 cover-view 不显示

基本内容

icon

图标

属性名类型默认值说明
typeString icon的类型,有效值:success, success_no_circle, info, warn, waiting, cancel, download, search, clear
sizeNumber23icon的大小,单位px
colorColor icon的颜色,同css的color

text

文本

属性名类型默认值说明最低版本
selectableBooleanfalse文本是否可选1.1.0
spaceStringfalse显示连续空格1.4.0
decodeBooleanfalse是否解码1.4.0

space 有效值:

说明
ensp中文字符空格一半大小
emsp中文字符空格大小
nbsp根据字体设置的空格大小

Tips

1.decode可以解析的有   < > & '    

2.各个操作系统的空格标准并不一致。

3.<text/> 组件内只支持 <text/> 嵌套。

4.除了文本节点以外的其他节点都无法长按选中

bug : 基础库版本低于 2.1.0 时, <text/> 组件内嵌的 <text/> style 设置可能不会生效

rich-text

富文本

基础库 1.4.0 开始支持,低版本需做兼容处理

属性名类型默认值说明最低版本
nodesArray / String[]节点列表 / HTML String1.4.0

支持默认事件,包括:tap、touchstart、touchmove、touchcancel、touchend和longtap

nodes 属性推荐使用 Array 类型,由于组件会将 String 类型转换为 Array 类型,因而性能会有所下降

nodes

现支持两种节点,通过type来区分,分别是元素节点和文本节点,默认是元素节点,在富文本区域里显示的HTML节点

1.元素节点:type = node

属性类型必填说明备注
nameString标签名支持部分受信任的HTML节点
attrsObject属性支持部分受信任的属性,遵循Pascal命名法
childrenArray子节点列表结构和nodes一致

2.元素节点:type = node

属性类型必填说明备注
textString文本支持entities

受信任的HTML节点及属性;全局支持class和style属性,不支持id属性

节点属性
a
abbr
b
blockquote
br
code
colspan,width
colgroupspan,width
dd
del
div
dl
dt
em
fieldset
h1
h2
h3
h4
h5
h6
hr
i
imgalt,src,height,width
ins
label
legend
li
ol
p
q
span
strong
sub
sup
tablewidth
tbody
tdcolspan,height,rowspan,width
tfoot
thcolspan,height,rowspan,width
thead
tr
ul

tip:

1.nodes 不推荐使用 String 类型,性能会有所下降。

2.rich-text 组件内屏蔽所有节点的事件。

3.attrs 属性不支持 id ,支持 class 。

4.name 属性大小写不敏感。

5.如果使用了不受信任的HTML节点,该节点及其所有子节点将会被移除。

6.img 标签仅支持网络图片。

7.如果在自定义组件中使用 rich-text 组件,那么仅自定义组件的 wxss 样式对 rich-text 中的 class 生效

progress

进度条

属性名类型默认值说明最低版本
percentFloat百分比0~100
show-infoBooleanfalse在进度条右侧显示百分比
stroke-widthNumber6进度条线的宽度,单位px
colorcolor#09BB07进度条颜色 (请使用 activeColor)
activeColorColor 已选择的进度条的颜色
backgroundColorColor 未选择的进度条的颜色
activeBooleanfalse进度条从左往右的动画
active-modeStringbackwardsbackwards: 动画从头播;forwards:动画从上次结束点接着播1.7.0

表单组件

button

按钮

属性名类型默认值说明生效时机最低版本
sizeStringdefault按钮的大小
typeStringdefault按钮的样式类型
plainBooleanfalse按钮是否镂空,背景色透明
disabledBooleanfalse是否禁用
loadingBooleanfals名称前是否带 loading 图标
form-typeString 用于 组件,点击分别会触发 组件的 submit/reset 事件 1.1.0
open-typeString 微信开放能力
hover-classStringbutton-hover指定按钮按下去的样式类。当 hover-class="none" 时,没有点击态效果
hover-stop-propagationBooleanfalse指定是否阻止本节点的祖先节点出现点击态 1.5.0
hover-start-timeNumber20按住后多久出现点击态,单位毫秒
hover-stay-timeNumber70手指松开后点击态保留时间,单位毫秒
langStringen指定返回用户信息的语言,zh_CN 简体中文,zh_TW 繁体中文,en 英文open-type="getUserInfo"1.3.0
bindgetuserinfoHandler 用户点击该按钮时,会返回获取到的用户信息,回调的detail数据与wx.getUserInfo返回的一致open-type="getUserInfo"1.3.0
session-fromString 会话来源open-type="contact"1.4.0
send-message-titleString当前标题会话内消息卡片标题open-type="contact"1.5.0
send-message-pathString当前分享路径会话内消息卡片点击跳转小程序路径open-type="contact"1.5.0
send-message-imgString截图会话内消息卡片图片open-type="contact"1.5.0
show-message-cardBooleanfalse显示会话内消息卡片open-type="contact"1.5.0
bindcontactHandler 客服消息回调open-type="contact"1.5.0
bindgetphonenumberHandler 获取用户手机号回调open-type="getPhoneNumber"1.2.0
app-parameterString 打开 APP 时,向 APP 传递的参数open-type="launchApp"1.9.5
binderrorHandler 当使用开放能力时,发生错误的回调open-type="launchApp"1.9.5
bindopensettingHandler 在打开授权设置页后回调open-type="openSetting"2.0.7

注:

1.button-hover 默认为{background-color: rgba(0, 0, 0, 0.1); opacity: 0.7;}

2.bindgetphonenumber 从1.2.0 开始支持,但是在1.5.3以下版本中无法使用wx.canIUse进行检测,建议使用基础库版本进行判断。

3.在bindgetphonenumber 等返回加密信息的回调中调用 wx.login 登录,可能会刷新登录态。此时服务器使用 code 换取的 sessionKey 不是加密时使用的 sessionKey,导致解密失败。建议开发者提前进行 login;或者在回调中先使用 checkSession 进行登录态检查,避免 login 刷新登录态。

4.从 2.1.0 起,button 可作为原生组件的子节点嵌入,以便在原生组件上使用 open-type 的能力

size 有效值
说明
default默认大小
mini小尺寸
type 有效值
说明
primary绿色
default白色
warn红色
form-type 有效值
说明
submit提交表单
reset重置表单
open-type 有效值
说明最低版本
contact打开客服会话1.1.0
share触发用户转发1.2.0
getUserInfo获取用户信息,可以从bindgetuserinfo回调中获取到用户信息1.3.0
getPhoneNumber获取用户手机号,可以从bindgetphonenumber回调中获取到用户信息1.2.0
launchApp打开APP,可以通过app-parameter属性设定向APP传的参数1.9.5
openSetting打开授权设置页2.0.7
feedback打开“意见反馈”页面,用户可提交反馈内容并上传日志,开发者可以登录小程序管理后台后进入左侧菜单“客服反馈”页面获取到反馈内容2.1.0
/** wxss **/
/** 修改button默认的点击态样式类**/
.button-hover {
  background-color: red;
}
/** 添加自定义button点击态样式类**/
.other-button-hover {
  background-color: blue;
}
<button type="default" size="{{defaultSize}}" loading="{{loading}}" plain="{{plain}}" disabled="{{disabled}}" bindtap="default" hover-class="other-button-hover"> default </button>
<button type="primary" size="{{primarySize}}" loading="{{loading}}" plain="{{plain}}" disabled="{{disabled}}" bindtap="primary"> primary </button>
<button type="warn" size="{{warnSize}}" loading="{{loading}}" plain="{{plain}}" disabled="{{disabled}}" bindtap="warn"> warn </button>
<button bindtap="setDisabled">点击设置以上按钮disabled属性</button>
<button bindtap="setPlain">点击设置以上按钮plain属性</button>
<button bindtap="setLoading">点击设置以上按钮loading属性</button>
<button open-type="contact">进入客服会话</button>
<button open-type="getUserInfo" lang="zh_CN" bindgetuserinfo="onGotUserInfo">获取用户信息</button>
<button open-type="openSetting">打开授权设置页</button>
var types = ['default', 'primary', 'warn']
var pageObject = {
  data: {
    defaultSize: 'default',
    primarySize: 'default',
    warnSize: 'default',
    disabled: false,
    plain: false,
    loading: false
  },
  setDisabled: function(e) {
    this.setData({
      disabled: !this.data.disabled
    })
  },
  setPlain: function(e) {
    this.setData({
      plain: !this.data.plain
    })
  },
  setLoading: function(e) {
    this.setData({
      loading: !this.data.loading
    })
  },
  onGotUserInfo: function(e) {
    console.log(e.detail.errMsg)
    console.log(e.detail.userInfo)
    console.log(e.detail.rawData)
  },
}
for (var i = 0; i < types.length; ++i) {
  (function(type) {
    pageObject[type] = function(e) {
      var key = type + 'Size'
      var changedData = {}
      changedData[key] =
        this.data[key] === 'default' ? 'mini' : 'default'
      this.setData(changedData)
    }
  })(types[i])
}
Page(pageObject)
checkbox
checkbox-group

多项选择器,内部由多个checkbox组成

属性名类型默认值说明
bindchangeEventHandle 中选中项发生改变是触发 change 事件,detail = {value:[选中的checkbox的value的数组]}
checkbox

多选项目

属性名类型默认值说明
valueString 标识,选中时触发的 change 事件,并携带 的 value
disabledBooleanfalse是否禁用
checkedBooleanfalse当前是否选中,可用来设置默认选中
colorColor checkbox的颜色,同css的color
<checkbox-group bindchange="checkboxChange">
  <label class="checkbox" wx:for="{{items}}">
    <checkbox value="{{item.name}}" checked="{{item.checked}}"/>{{item.value}}
  </label>
</checkbox-group>
Page({
  data: {
    items: [
      {name: 'USA', value: '美国'},
      {name: 'CHN', value: '中国', checked: 'true'},
      {name: 'BRA', value: '巴西'},
      {name: 'JPN', value: '日本'},
      {name: 'ENG', value: '英国'},
      {name: 'TUR', value: '法国'},
    ]
  },
  checkboxChange: function(e) {
    console.log('checkbox发生change事件,携带value值为:', e.detail.value)
  }
})

form

表单,将组件内用户输入的<switch/> <input/> <checkbox/> <slider/> <radio/> <picker/> 提交。

当点击 <form/> 表单中 formType 为 submit 的 <button/> 组件时,会将表单组件中的 value 值进行提交,需要在表单组件中加上 name 来作为 key。

属性名类型说明
report-submitBoolean是否返回 formId 用于发送模板消息
bindsubmitEventHandle携带 form 中的数据触发 submit 事件,event.detail = {value : {'name': 'value'} , formId: ''}
bindresetEventHandle表单重置时会触发 reset 事件
<form bindsubmit="formSubmit" bindreset="formReset">
  <view class="section section_gap">
    <view class="section__title">switch</view>
    <switch name="switch"/>
  </view>
  <view class="section section_gap">
    <view class="section__title">slider</view>
    <slider name="slider" show-value ></slider>
  </view>
  <view class="section">
    <view class="section__title">input</view>
    <input name="input" placeholder="please input here" />
  </view>
  <view class="section section_gap">
    <view class="section__title">radio</view>
    <radio-group name="radio-group">
      <label><radio value="radio1"/>radio1</label>
      <label><radio value="radio2"/>radio2</label>
    </radio-group>
  </view>
  <view class="section section_gap">
    <view class="section__title">checkbox</view>
    <checkbox-group name="checkbox">
      <label><checkbox value="checkbox1"/>checkbox1</label>
      <label><checkbox value="checkbox2"/>checkbox2</label>
    </checkbox-group>
  </view>
  <view class="btn-area">
    <button formType="submit">Submit</button>
    <button formType="reset">Reset</button>
  </view>
</form>
Page({
  formSubmit: function(e) {
    console.log('form发生了submit事件,携带数据为:', e.detail.value)
  },
  formReset: function() {
    console.log('form发生了reset事件')
  }
})

input

输入框。该组件是原生组件,使用时请注意相关限制

属性名类型默认值说明最低版本
valueString 输入框的初始内容
typeString"text"input 的类型
passwordBooleanfalse是否是密码类型
placeholderString 输入框为空时占位符
placeholder-styleString 指定 placeholder 的样式
placeholder-classString"input-placeholder"指定 placeholder 的样式类
disabledBooleanfalse是否禁用
maxlengthNumber140最大输入长度,设置为 -1 的时候不限制最大长度
cursor-spacingNumber0指定光标与键盘的距离,单位 px 。取 input 距离底部的距离和 cursor-spacing 指定的距离的最小值作为光标与键盘的距离
auto-focusBooleanfalse(即将废弃,请直接使用 focus )自动聚焦,拉起键盘
focusBooleanfalse获取焦点
confirm-typeString"done"设置键盘右下角按钮的文字,仅在type='text'时生效1.1.0
confirm-holdBooleanfalse点击键盘右下角按钮时是否保持键盘不收起1.1.0
cursorNumber 指定focus时的光标位置1.5.0
selection-startNumber-1光标起始位置,自动聚集时有效,需与selection-end搭配使用1.9.0
selection-endNumber-1光标结束位置,自动聚集时有效,需与selection-start搭配使用1.9.0
adjust-positionBooleantrue键盘弹起时,是否自动上推页面1.9.90
bindinputEventHandle 键盘输入时触发,event.detail = {value, cursor, keyCode},keyCode 为键值,2.1.0 起支持,处理函数可以直接 return 一个字符串,将替换输入框的内容
bindfocusEventHandle 输入框聚焦时触发,event.detail = { value, height },height 为键盘高度,在基础库 1.9.90 起支持
bindblurEventHandle 输入框失去焦点时触发,event.detail = {value: value}
bindconfirmEventHandle 点击完成按钮时触发,event.detail = {value: value}
type 有效值
说明
text文本输入键盘
number数字输入键盘
idcard身份证输入键盘
digit带小数点的数字键盘
confirm-type 有效值
说明
send右下角按钮为“发送”
search右下角按钮为“搜索”
next右下角按钮为“下一个”
go右下角按钮为“前往”
done右下角按钮为“完成”
<view class="section section_gap">
<view class="section__title">表单组件在label内</view>
<checkbox-group class="group" bindchange="checkboxChange">
  <view class="label-1" wx:for="{{checkboxItems}}">
    <label>
      <checkbox hidden value="{{item.name}}" checked="{{item.checked}}"></checkbox>
      <view class="label-1__icon">
        <view class="label-1__icon-checked" style="opacity:{{item.checked ? 1: 0}}"></view>
      </view>
      <text class="label-1__text">{{item.value}}</text>
    </label>
  </view>
</checkbox-group>
</view>
<view class="section section_gap">
<view class="section__title">label用for标识表单组件</view>
<radio-group class="group" bindchange="radioChange">
  <view class="label-2" wx:for="{{radioItems}}">
    <radio id="{{item.name}}" hidden value="{{item.name}}" checked="{{item.checked}}"></radio>
    <view class="label-2__icon">
      <view class="label-2__icon-checked" style="opacity:{{item.checked ? 1: 0}}"></view>
    </view>
    <label class="label-2__text" for="{{item.name}}"><text>{{item.name}}</text></label>
  </view>
</radio-group>
</view>
Page({
  data: {
    checkboxItems: [
      {name: 'USA', value: '美国'},
      {name: 'CHN', value: '中国', checked: 'true'},
      {name: 'BRA', value: '巴西'},
      {name: 'JPN', value: '日本', checked: 'true'},
      {name: 'ENG', value: '英国'},
      {name: 'TUR', value: '法国'},
    ],
    radioItems: [
      {name: 'USA', value: '美国'},
      {name: 'CHN', value: '中国', checked: 'true'},
      {name: 'BRA', value: '巴西'},
      {name: 'JPN', value: '日本'},
      {name: 'ENG', value: '英国'},
      {name: 'TUR', value: '法国'},
    ],
    hidden: false
  },
  checkboxChange: function(e) {
    var checked = e.detail.value
    var changed = {}
    for (var i = 0; i < this.data.checkboxItems.length; i ++) {
      if (checked.indexOf(this.data.checkboxItems[i].name) !== -1) {
        changed['checkboxItems['+i+'].checked'] = true
      } else {
        changed['checkboxItems['+i+'].checked'] = false
      }
    }
    this.setData(changed)
  },
  radioChange: function(e) {
    var checked = e.detail.value
    var changed = {}
    for (var i = 0; i < this.data.radioItems.length; i ++) {
      if (checked.indexOf(this.data.radioItems[i].name) !== -1) {
        changed['radioItems['+i+'].checked'] = true
      } else {
        changed['radioItems['+i+'].checked'] = false
      }
    }
    this.setData(changed)
  }
})
.label-1, .label-2{
    margin-bottom: 15px;
}
.label-1__text, .label-2__text {
    display: inline-block;
    vertical-align: middle;
}
.label-1__icon {
    position: relative;
    margin-right: 10px;
    display: inline-block;
    vertical-align: middle;
    width: 18px;
    height: 18px;
    background: #fcfff4;
}
.label-1__icon-checked {
    position: absolute;
    top: 3px;
    left: 3px;
    width: 12px;
    height: 12px;
    background: #1aad19;
}
.label-2__icon {
    position: relative;
    display: inline-block;
    vertical-align: middle;
    margin-right: 10px;
    width: 18px;
    height: 18px;
    background: #fcfff4;
    border-radius: 50px;
}
.label-2__icon-checked {
    position: absolute;
    left: 3px;
    top: 3px;
    width: 12px;
    height: 12px;
    background: #1aad19;
    border-radius: 50%;
}
.label-4_text{
    text-align: center;
    margin-top: 15px;
}

picker

从底部弹起的滚动选择器,现支持五种选择器,通过mode来区分,分别是普通选择器,多列选择器,时间选择器,日期选择器,省市区选择器,默认是普通选择器

1.普通选择器:mode = selector

属性名类型默认值说明最低版本
rangeArray / Object Array[]mode为 selector 或 multiSelector 时,range 有效
range-keyString 当 range 是一个 Object Array 时,通过 range-key 来指定 Object 中 key 的值作为选择器显示内容
valueNumber0value 的值表示选择了 range 中的第几个(下标从 0 开始)
bindchangeEventHandle value 改变时触发 change 事件,event.detail = {value: value}
disabledBooleanfalse是否禁用
bindcancelEventHandle 取消选择或点遮罩层收起 picker 时触发1.9.90

2.多列选择器:mode = multiSelector(最低版本:1.4.0)

属性名类型默认值说明最低版本
range二维Array/二维Object Array[]mode为selector或multiSelector时有效。二维数组,长度表示多少列,数组的每项表示每列的数据,如[["a","b"], ["c","d"]]
range-keyString 当 range 是一个 Object Array 时,通过 range-key 来指定 Object 中 key 的值作为选择器显示内容
valueArray[]value 每一项的值表示选择了 range 对应项中的第几个(下标从 0 开始)
bindchangeEventHandle value 改变时触发 change 事件,event.detail = {value: value}
disabledBooleanfalse是否禁用
bindcancelEventHandle 取消选择或点遮罩层收起 picker 时触发1.9.90
bindcolumnchangeEventHandle 某一列的值改变时触发 columnchange 事件,event.detail = {column: column, value: value},column 的值表示改变了第几列(下标从0开始),value 的值表示变更值的下标

3.时间选择器:mode = time

属性名类型默认值说明最低版本
startString 表示有效时间范围的开始,字符串格式为"hh:mm"
endString 表示有效时间范围的结束,字符串格式为"hh:mm"
valueString0表示选中的时间,格式为"hh:mm"
bindchangeEventHandle value 改变时触发 change 事件,event.detail = {value: value}
disabledBooleanfalse是否禁用
bindcancelEventHandle 取消选择时触发1.9.90

4.日期选择器:mode = date

属性名类型默认值说明最低版本
startString 表示有效时间范围的开始,字符串格式为"YYYY-MM-DD"
endString 表示有效时间范围的结束,字符串格式为"YYYY-MM-DD"
valueString0表示选中的时间,格式为"YYYY-MM-DD"
fieldsStringday有效值 year,month,day,表示选择器的粒度
bindchangeEventHandle value 改变时触发 change 事件,event.detail = {value: value}
disabledBooleanfalse是否禁用
bindcancelEventHandle 取消选择时触发1.9.90

fields 有效值

说明
year选择器粒度为年
month选择器粒度为月份
day选择器粒度为天

5.省市区选择器:mode = region(最低版本:1.4.0)

属性名类型默认值说明最低版本
valueArray[]表示选中的省市区,默认选中每一列的第一个值
custom-itemStringday可为每一列的顶部添加一个自定义的项1.5.0
bindchangeEventHandle value 改变时触发 change 事件,event.detail = {value: value, code: code, postcode: postcode},其中字段code是统计用区划代码,postcode是邮政编码
disabledBooleanfalse是否禁用
bindcancelEventHandle 取消选择时触发1.9.90
<view class="section">
  <view class="section__title">普通选择器</view>
  <picker bindchange="bindPickerChange" value="{{index}}" range="{{array}}">
    <view class="picker">
      当前选择:{{array[index]}}
    </view>
  </picker>
</view>
<view class="section">
  <view class="section__title">多列选择器</view>
  <picker mode="multiSelector" bindchange="bindMultiPickerChange" bindcolumnchange="bindMultiPickerColumnChange" value="{{multiIndex}}" range="{{multiArray}}">
    <view class="picker">
      当前选择:{{multiArray[0][multiIndex[0]]}},{{multiArray[1][multiIndex[1]]}},{{multiArray[2][multiIndex[2]]}}
    </view>
  </picker>
</view>
<view class="section">
  <view class="section__title">时间选择器</view>
  <picker mode="time" value="{{time}}" start="09:01" end="21:01" bindchange="bindTimeChange">
    <view class="picker">
      当前选择: {{time}}
    </view>
  </picker>
</view>
<view class="section">
  <view class="section__title">日期选择器</view>
  <picker mode="date" value="{{date}}" start="2015-09-01" end="2017-09-01" bindchange="bindDateChange">
    <view class="picker">
      当前选择: {{date}}
    </view>
  </picker>
</view>
<view class="section">
  <view class="section__title">省市区选择器</view>
  <picker mode="region" bindchange="bindRegionChange" value="{{region}}" custom-item="{{customItem}}">
    <view class="picker">
      当前选择:{{region[0]}},{{region[1]}},{{region[2]}}
    </view>
  </picker>
</view>
Page({
  data: {
    array: ['美国', '中国', '巴西', '日本'],
    objectArray: [
      {
        id: 0,
        name: '美国'
      },
      {
        id: 1,
        name: '中国'
      },
      {
        id: 2,
        name: '巴西'
      },
      {
        id: 3,
        name: '日本'
      }
    ],
    index: 0,
    multiArray: [['无脊柱动物', '脊柱动物'], ['扁性动物', '线形动物', '环节动物', '软体动物', '节肢动物'], ['猪肉绦虫', '吸血虫']],
    objectMultiArray: [
      [
        {
          id: 0,
          name: '无脊柱动物'
        },
        {
          id: 1,
          name: '脊柱动物'
        }
      ], [
        {
          id: 0,
          name: '扁性动物'
        },
        {
          id: 1,
          name: '线形动物'
        },
        {
          id: 2,
          name: '环节动物'
        },
        {
          id: 3,
          name: '软体动物'
        },
        {
          id: 3,
          name: '节肢动物'
        }
      ], [
        {
          id: 0,
          name: '猪肉绦虫'
        },
        {
          id: 1,
          name: '吸血虫'
        }
      ]
    ],
    multiIndex: [0, 0, 0],
    date: '2016-09-01',
    time: '12:01',
    region: ['广东省', '广州市', '海珠区'],
    customItem: '全部'
  },
  bindPickerChange: function(e) {
    console.log('picker发送选择改变,携带值为', e.detail.value)
    this.setData({
      index: e.detail.value
    })
  },
  bindMultiPickerChange: function (e) {
    console.log('picker发送选择改变,携带值为', e.detail.value)
    this.setData({
      multiIndex: e.detail.value
    })
  },
  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;
              case 3:
                data.multiArray[2] = ['河蚌', '蜗牛', '蛞蝓'];
                break;
              case 4:
                data.multiArray[2] = ['昆虫', '甲壳动物', '蛛形动物', '多足动物'];
                break;
            }
            break;
          case 1:
            switch (data.multiIndex[1]) {
              case 0:
                data.multiArray[2] = ['鲫鱼', '带鱼'];
                break;
              case 1:
                data.multiArray[2] = ['青蛙', '娃娃鱼'];
                break;
              case 2:
                data.multiArray[2] = ['蜥蜴', '龟', '壁虎'];
                break;
            }
            break;
        }
        data.multiIndex[2] = 0;
        console.log(data.multiIndex);
        break;
    }
    this.setData(data);
  },
  bindDateChange: function(e) {
    console.log('picker发送选择改变,携带值为', e.detail.value)
    this.setData({
      date: e.detail.value
    })
  },
  bindTimeChange: function(e) {
    console.log('picker发送选择改变,携带值为', e.detail.value)
    this.setData({
      time: e.detail.value
    })
  },
  bindRegionChange: function (e) {
    console.log('picker发送选择改变,携带值为', e.detail.value)
    this.setData({
      region: e.detail.value
    })
  }
})

picker-view

嵌入页面的滚动选择器

属性名类型说明最低版本
valueNumberArray数组中的数字依次表示picker-view内的picker-view-column选择的第几项(下标从0开始),数字大于picker-view-column可选项长度时选择最后一项
indicator-styleString设置选择器中间选中框的样式
indicator-classString设置选择器中间选中框的类名1.1.0
mask-styleString设置蒙层的样式1.5.0
mask-classString设置蒙层的类名1.5.0
bindchangeEventHandle当滚动选择,value改变时触发change事件,event.detail = {value: value};value为数组表示picker-view内的picker-view-column当前选择的是第几项(下标从0开始

注意:其中只可放置<picker-view-column/>组件,其他节点不会显示

picker-view-column

仅可放置于中,其孩子节点的高度会自动设置成与picker-view的选中框的高度一致

<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>
</view>
const date = new Date()
const years = []
const months = []
const days = []
for (let i = 1990; i <= date.getFullYear(); 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,
    year: date.getFullYear(),
    months: months,
    month: 2,
    days: days,
    day: 2,
    value: [9999, 1, 1],
  },
  bindChange: function(e) {
    const val = e.detail.value
    this.setData({
      year: this.data.years[val[0]],
      month: this.data.months[val[1]],
      day: this.data.days[val[2]]
    })
  }
})
radio
radio-group

单项选择器,内部由多个<radio/>组成

属性名类型默认值说明
bindchangeEventHandle 中的选中项发生变化时触发 change 事件,event.detail = {value: 选中项radio的value}
radio

单选项目

属性名类型默认值说明
valueString 标识。当该 选中时, 的 change 事件会携带的value
checkedBooleanfalse当前是否选中
disabledBooleanfalse是否禁用
colorcolor radio的颜色,同css的color
<radio-group class="radio-group" bindchange="radioChange">
  <label class="radio" wx:for="{{items}}">
    <radio value="{{item.name}}" checked="{{item.checked}}"/>{{item.value}}
  </label>
</radio-group>
Page({
  data: {
    items: [
      {name: 'USA', value: '美国'},
      {name: 'CHN', value: '中国', checked: 'true'},
      {name: 'BRA', value: '巴西'},
      {name: 'JPN', value: '日本'},
      {name: 'ENG', value: '英国'},
      {name: 'TUR', value: '法国'},
    ]
  },
  radioChange: function(e) {
    console.log('radio发生change事件,携带value值为:', e.detail.value)
  }
})

slider

滑动选择器

属性名类型默认值说明最低版本
minNumber0最小值
maxNumber100最大值
stepNumber1步长,取值必须大于 0,并且可被(max - min)整除
disabledBooleanfalse是否禁用
valueNumber0当前取值
colorColor#e9e9e9背景条的颜色(请使用 backgroundColor)
selected-colorColor#1aad19已选择的颜色(请使用 activeColor)
disabledColor#1aad19已选择的颜色
backgroundColorColor#e9e9e9背景条的颜色
block-sizeNumber28滑块的大小,取值范围为 12 - 281.9.0
block-colorColor#ffffff滑块的颜色1.9.0
show-valueBooleanfalse是否显示当前 value
bindchangeEventHandle 完成一次拖动后触发的事件,event.detail = {value: value}
bindchangingEventHandle 拖动过程中触发的事件,event.detail = {value: value}1.7.0
<view class="section section_gap">
  <text class="section__title">设置step</text>
  <view class="body-view">
    <slider bindchange="slider2change" step="5"/>
  </view>
</view>
<view class="section section_gap">
  <text class="section__title">显示当前value</text>
  <view class="body-view">
    <slider bindchange="slider3change" show-value/>
  </view>
</view>
<view class="section section_gap">
  <text class="section__title">设置最小/最大值</text>
  <view class="body-view">
    <slider bindchange="slider4change" min="50" max="200" show-value/>
  </view>
</view>
var pageData = {}
for (var i = 1; i < 5; i++) {
  (function (index) {
    pageData['slider' + index + 'change'] = function(e) {
      console.log('slider' + 'index' + '发生 change 事件,携带值为', e.detail.value)
    }
  })(i)
}
Page(pageData)

switch

开关选择器

属性名类型默认值说明
checkedBooleanfalse是否选中
typeStringswitch样式,有效值:switch, checkbox
bindchangeEventHandle checked 改变时触发 change 事件,event.detail={ value:checked}
colorColor switch 的颜色,同 css 的 color
<view class="body-view">
    <switch checked bindchange="switch1Change"/>
    <switch bindchange="switch2Change"/>
</view>
Page({
  switch1Change: function (e){
    console.log('switch1 发生 change 事件,携带值为', e.detail.value)
  },
  switch2Change: function (e){
    console.log('switch2 发生 change 事件,携带值为', e.detail.value)
  }
})

tip: switch类型切换时在iOS自带振动反馈,可在系统设置 -> 声音与触感 -> 系统触感反馈中关闭

textarea

多行输入框。该组件是原生组件,使用时请注意相关限制

属性名类型默认值说明最低版本
valueString 输入框的内容
placeholderString 输入框为空时占位符
placeholder-styleString 指定 placeholder 的样式
placeholder-classStringtextarea-placeholder指定 placeholder 的样式类
disabledBooleanfalse是否禁用
maxlengthNumber140最大输入长度,设置为 -1 的时候不限制最大长度
auto-focusBooleanfalse自动聚焦,拉起键盘
focusBooleanfalse获取焦点
fixedBooleanfalse如果 textarea 是在一个 position:fixed 的区域,需要显示指定属性 fixed 为 true
cursor-spacingNumber0指定光标与键盘的距离,单位 px 。取 textarea 距离底部的距离和 cursor-spacing 指定的距离的最小值作为光标与键盘的距离
cursorNumber 指定focus时的光标位置1.5.0
show-confirm-barBooleantrue是否显示键盘上方带有”完成“按钮那一栏1.6.0
selection-startNumber-1光标起始位置,自动聚集时有效,需与selection-end搭配使用1.9.0
selection-endNumber-1光标结束位置,自动聚集时有效,需与selection-start搭配使用1.9.0
adjust-positionBooleantrue键盘弹起时,是否自动上推页面1.9.90
bindfocusEventHandle 输入框聚焦时触发,event.detail = { value, height },height 为键盘高度,在基础库 1.9.90 起支持1.5.0
bindblurEventHandle 输入框失去焦点时触发,event.detail = {value, cursor}1.6.0
bindlinechangeEventHandle 输入框行数变化时调用,event.detail = {height: 0, heightRpx: 0, lineCount: 0}1.9.0
bindinputEventHandle 当键盘输入时,触发 input 事件,event.detail = {value, cursor},bindinput 处理函数的返回值并不会反映到 textarea 上
bindconfirmEventHandle 点击完成时, 触发 confirm 事件,event.detail = {value: value}
<!--textarea.wxml-->
<view class="section">
  <textarea bindblur="bindTextAreaBlur" auto-height placeholder="自动变高" />
</view>
<view class="section">
  <textarea placeholder="placeholder颜色是红色的" placeholder-style="color:red;"  />
</view>
<view class="section">
  <textarea placeholder="这是一个可以自动聚焦的textarea" auto-focus />
</view>
<view class="section">
  <textarea placeholder="这个只有在按钮点击的时候才聚焦" focus="{{focus}}" />
  <view class="btn-area">
    <button bindtap="bindButtonTap">使得输入框获取焦点</button>
  </view>
</view>
<view class="section">
  <form bindsubmit="bindFormSubmit">
    <textarea placeholder="form 中的 textarea" name="textarea"/>
    <button form-type="submit"> 提交 </button>
  </form>
</view>
//textarea.js
Page({
  data: {
    height: 20,
    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)
  }
})

Bug & Tip

1.请注意原生组件使用限制。

2.微信版本 6.3.30,textarea 在列表渲染时,新增加的 textarea 在自动聚焦时的位置计算错误。

3.textarea 的 blur 事件会晚于页面上的 tap 事件,如果需要在 button 的点击事件获取 textarea,可以使用 form 的 bindsubmit。

4.不建议在多行文本上对用户的输入进行修改,所以 textarea 的 bindinput 处理函数并不会将返回值反映到 textarea 上。

导航

navigator

页面链接

属性名类型默认值说明最低版本
targetString 在哪个目标上发生跳转,默认当前小程序2.0.7
urlString 当前小程序内的跳转链接
open-typeStringnavigate跳转方式
deltaNumber当 open-type 为 'navigateBack' 时有效,表示回退的层数
app-idString 当target="miniProgram"时有效,要打开的小程序 appId2.0.7
pathString 当target="miniProgram"时有效,打开的页面路径,如果为空则打开首页2.0.7
extra-dataObject 当target="miniProgram"时有效,需要传递给目标小程序的数据,目标小程序可在 App.onLaunch(),App.onShow() 中获取到这份数据2.0.7
versionversionrelease当target="miniProgram"时有效,要打开的小程序版本,有效值 develop(开发版),trial(体验版),release(正式版),仅在当前小程序为开发版或体验版时此参数有效;如果当前小程序是正式版,则打开的小程序必定是正式版2.0.7
hover-classStringnavigator-hover指定点击时的样式类,当hover-class="none"时,没有点击态效果
hover-stop-propagationBooleanfalse指定是否阻止本节点的祖先节点出现点击态1.5.0
hover-start-timeNumber50按住后多久出现点击态,单位毫秒1.5.0
hover-stay-timeNumber600手指松开后点击态保留时间,单位毫秒1.6.0
bindsuccessString 当target="miniProgram"时有效,跳转小程序成功2.0.7
binderrorString 当target="miniProgram"时有效,跳转小程序失败2.0.7
bindcompleteString 当target="miniProgram"时有效,跳转小程序完成2.0.7

open-type 有效值:

说明最低版本
navigate对应 wx.navigateTo 或 wx.navigateToMiniProgram 的功能
redirect对应 wx.redirectTo 的功能
switchTab对应 wx.switchTab 的功能
reLaunch对应 wx.reLaunch 的功能1.1.0
navigateBack对应 wx.navigateBack 的功能1.1.0
exit退出小程序,target="miniProgram"时生效2.1.0

注:navigator-hover 默认为 {background-color: rgba(0, 0, 0, 0.1); opacity: 0.7;}, <navigator/> 的子节点背景色应为透明色

/** wxss **/
/** 修改默认的navigator点击态 **/
.navigator-hover {
    color:blue;
}
/** 自定义其他点击态样式类 **/
.other-navigator-hover {
    color:red;
}
<!-- sample.wxml -->
<view class="btn-area">
  <navigator url="/page/navigate/navigate?title=navigate" hover-class="navigator-hover">跳转到新页面</navigator>
  <navigator url="../../redirect/redirect/redirect?title=redirect" open-type="redirect" hover-class="other-navigator-hover">在当前页打开</navigator>
  <navigator url="/page/index/index" open-type="switchTab" hover-class="other-navigator-hover">切换 Tab</navigator>
  <navigator target="miniProgram" open-type="navigate" app-id="" path="" extra-data="" version="release">打开绑定的小程序</navigator>
</view>
<!-- navigator.wxml -->
<view style="text-align:center"> {{title}} </view>
<view> 点击左上角返回回到之前页面 </view>
<!-- redirect.wxml -->
<view style="text-align:center"> {{title}} </view>
<view> 点击左上角返回回到上级页面 </view>
// redirect.js navigator.js
Page({
  onLoad: function(options) {
    this.setData({
      title: options.title
    })
  }
})

functional-page-navigator

这个组件从小程序基础库版本 2.1.0 开始支持。仅在插件的自定义组件中有效,用于跳转到插件功能页

属性名类型默认值说明最低版本
versionStringrelease跳转到的小程序版本,有效值 develop(开发版),trial(体验版),release(正式版);线上版本必须设置为 release2.1.0
nameString 要跳转到的功能页2.1.0
argsObjectnull功能页参数,参数格式与具体功能页相关2.1.0
bindsuccessEventHandler 功能页返回,且操作成功时触发, detail 格式与具体功能页相关2.1.0
bindfailEventHandler 功能页返回,且操作失败时触发, detail 格式与具体功能页相关2.1.0

目前支持的功能页和name 有效值:

功能页最低版本
loginAndGetUserInfo用户信息功能页2.1.0
requestPayment支付功能页2.1.0
<!-- sample.wxml -->
<functional-page-navigator name="loginAndGetUserInfo" bind:success="loginSuccess">
  <button>登录到插件</button>
</functional-page-navigator>
// redirect.js navigator.js
Component({
  methods: {
    loginSuccess: function(e) {
      console.log(e.detail.code) // wx.login 的 code
      console.log(e.detail.userInfo) // wx.getUserInfo 的 userInfo
    }
  }
})

Tips:

1.功能页是插件所有者小程序中的一个特殊页面,开发者不能自定义这个页面的外观。

2.在功能页展示时,一些与界面展示相关的接口将被禁用(接口调用返回 fail )。

3.这个组件本身可以在开发者工具中使用,但功能页的跳转目前不支持在开发者工具中调试,请在真机上测试。

媒体组件

audio

音频

注意:1.6.0 版本开始,该组件不再维护。建议使用能力更强的 wx.createInnerAudioContext 接口

属性名类型默认值说明
idString audio 组件的唯一标识符
srcString 要播放音频的资源地址
loopBooleanfalse是否循环播放
controlsBooleanfalse是否显示默认控件
posterString 默认控件上的音频封面的图片资源地址,如果 controls 属性值为 false 则设置 poster 无效
nameString未知音频默认控件上的音频名字,如果 controls 属性值为 false 则设置 name 无效
authorString未知作者默认控件上的作者名字,如果 controls 属性值为 false 则设置 author 无效
binderrorEventHandle 当发生错误时触发 error 事件,detail = {errMsg: MediaError.code}
bindplayEventHandle 当开始/继续播放时触发play事件
bindpauseEventHandle 当暂停播放时触发 pause 事件
bindtimeupdateEventHandle 当播放进度改变时触发 timeupdate 事件,detail = {currentTime, duration}
bindendedEventHandle 当播放到末尾时触发 ended 事件

MediaError.code

返回错误码描述
1获取资源被用户禁止
2网络错误
3解码错误
4不合适资源
<!-- audio.wxml -->
<audio poster="{{poster}}" name="{{name}}" author="{{author}}" src="{{src}}" id="myAudio" controls loop></audio>
<button type="primary" bindtap="audioPlay">播放</button>
<button type="primary" bindtap="audioPause">暂停</button>
<button type="primary" bindtap="audio14">设置当前播放时间为14秒</button>
<button type="primary" bindtap="audioStart">回到开头</button>
// audio.js
Page({
  onReady: function (e) {
    // 使用 wx.createAudioContext 获取 audio 上下文 context
    this.audioCtx = wx.createAudioContext('myAudio')
  },
  data: {
    poster: 'http://y.gtimg.cn/music/photo_new/T002R300x300M000003rsKF44GyaSk.jpg?max_age=2592000',
    name: '此时此刻',
    author: '许巍',
    src: 'http://ws.stream.qqmusic.qq.com/M500001VfvsJ21xFqb.mp3?guid=ffffffff82def4af4b12b3cd9337d5e7&uin=346897220&vkey=6292F51E1E384E06DCBDC9AB7C49FD713D632D313AC4858BACB8DDD29067D3C601481D36E62053BF8DFEAF74C0A5CCFADD6471160CAF3E6A&fromtag=46',
  },
  audioPlay: function () {
    this.audioCtx.play()
  },
  audioPause: function () {
    this.audioCtx.pause()
  },
  audio14: function () {
    this.audioCtx.seek(14)
  },
  audioStart: function () {
    this.audioCtx.seek(0)
  }
})

image

图片

属性名类型默认值说明最低版本
srcString 图片资源地址,支持云文件ID(2.2.3起)
modeString'scaleToFill'图片裁剪、缩放的模式
lazy-loadBooleanfalse图片懒加载。只针对page与scroll-view下的image有效1.5.0
binderrorEventHandle 当错误发生时,发布到 AppService 的事件名,事件对象event.detail = {errMsg: 'something wrong'}
bindloadEventHandle 当图片载入完毕时,发布到 AppService 的事件名,事件对象event.detail = {height:'图片高度px', width:'图片宽度px'}

注:

1.image组件默认宽度300px、高度225px

2.image组件中二维码/小程序码图片不支持长按识别。仅在wx.previewImage中支持长按识别。

mode 有效值:

mode 有 13 种模式,其中 4 种是缩放模式,9 种是裁剪模式

模式说明
缩放scaleToFill不保持纵横比缩放图片,使图片的宽高完全拉伸至填满 image 元素
缩放aspectFit保持纵横比缩放图片,使图片的长边能完全显示出来。也就是说,可以完整地将图片显示出来
缩放aspectFill保持纵横比缩放图片,只保证图片的短边能完全显示出来。也就是说,图片通常只在水平或垂直方向是完整的,另一个方向将会发生截取
缩放widthFix宽度不变,高度自动变化,保持原图宽高比不变
裁剪top不缩放图片,只显示图片的顶部区域
裁剪bottom不缩放图片,只显示图片的底部区域
裁剪center不缩放图片,只显示图片的中间区域
裁剪left不缩放图片,只显示图片的左边区域
裁剪right不缩放图片,只显示图片的右边区域
裁剪top left不缩放图片,只显示图片的左上边区域
裁剪top right不缩放图片,只显示图片的右上边区域
裁剪bottom left宽度不变,高度自动变化,保持原图宽高比不变
裁剪bottom right宽度不变,高度自动变化,保持原图宽高比不变
<view class="page">
  <view class="page__hd">
    <text class="page__title">image</text>
    <text class="page__desc">图片</text>
  </view>
  <view class="page__bd">
    <view class="section section_gap" wx:for="{{array}}" wx:for-item="item">
      <view class="section__title">{{item.text}}</view>
      <view class="section__ctn">
        <image style="width: 200px; height: 200px; background-color: #eeeeee;" mode="{{item.mode}}" src="{{src}}"></image>
      </view>
    </view>
  </view>
</view>
Page({
  data: {
    array: [{
      mode: 'scaleToFill',
      text: 'scaleToFill:不保持纵横比缩放图片,使图片完全适应'
    }, { 
      mode: 'aspectFit',
      text: 'aspectFit:保持纵横比缩放图片,使图片的长边能完全显示出来'
    }, { 
      mode: 'aspectFill',
      text: 'aspectFill:保持纵横比缩放图片,只保证图片的短边能完全显示出来'
    }, { 
      mode: 'top',
      text: 'top:不缩放图片,只显示图片的顶部区域' 
    }, {      
      mode: 'bottom',
      text: 'bottom:不缩放图片,只显示图片的底部区域'
    }, { 
      mode: 'center',
      text: 'center:不缩放图片,只显示图片的中间区域'
    }, { 
      mode: 'left',
      text: 'left:不缩放图片,只显示图片的左边区域'
    }, { 
      mode: 'right',
      text: 'right:不缩放图片,只显示图片的右边边区域'
    }, { 
      mode: 'top left',
      text: 'top left:不缩放图片,只显示图片的左上边区域' 
    }, { 
      mode: 'top right',
      text: 'top right:不缩放图片,只显示图片的右上边区域'
    }, { 
      mode: 'bottom left',
      text: 'bottom left:不缩放图片,只显示图片的左下边区域'
    }, { 
      mode: 'bottom right',
      text: 'bottom right:不缩放图片,只显示图片的右下边区域'
    }],
    src: '../../resources/cat.jpg'
  },
  imageError: function(e) {
    console.log('image3发生error事件,携带值为', e.detail.errMsg)
  }
})

video

视频。该组件是原生组件,使用时请注意相关限制

属性名类型默认值说明最低版本
srcString 要播放视频的资源地址,支持云文件ID(2.2.3起)
initial-timeNumber 指定视频初始播放位置1.6.0
durationNumber 指定视频时长1.1.0
controlsBooleantrue是否显示默认播放控件(播放/暂停按钮、播放进度、时间)
danmu-listObject Array 弹幕列表
danmu-btnBooleanfalse是否显示弹幕按钮,只在初始化时有效,不能动态变更
enable-danmuBooleanfalse是否展示弹幕,只在初始化时有效,不能动态变更
autoplayBooleanfalse是否自动播放
loopBooleanfalse是否循环播放1.4.0
mutedBooleanfalse是否静音播放1.4.0
page-gestureBooleanfalse在非全屏模式下,是否开启亮度与音量调节手势1.6.0
directionNumber 设置全屏时视频的方向,不指定则根据宽高比自动判断。有效值为 0(正常竖向), 90(屏幕逆时针90度), -90(屏幕顺时针90度)1.7.0
show-progressBooleantrue若不设置,宽度大于240时才会显示1.9.0
show-fullscreen-btnBooleantrue是否显示全屏按钮1.9.0
show-play-btnBooleantrue是否显示视频底部控制栏的播放按钮
show-center-play-btnBooleantrue是否显示视频中间的播放按钮1.9.0
enable-progress-gestureBooleantrue是否开启控制进度的手势1.9.0
objectFitStringcontain当视频大小与 video 容器大小不一致时,视频的表现形式。contain:包含,fill:填充,cover:覆盖
posterString 视频封面的图片网络资源地址或云文件ID(2.2.3起支持)如果 controls 属性值为 false 则设置 poster 无效
bindplayEventHandle 当开始/继续播放时触发play事件
bindpauseEventHandle 当暂停播放时触发 pause 事件
bindendedEventHandle 当播放到末尾时触发 ended 事件
bindtimeupdateEventHandle 播放进度变化时触发,event.detail = {currentTime, duration} 。触发频率 250ms 一次
bindfullscreenchangeEventHandle 视频进入和退出全屏时触发,event.detail = {fullScreen, direction},direction取为 vertical 或 horizontal1.4.0
bindwaitingEventHandle 视频出现缓冲时触发1.7.0
binderrorEventHandle 视频播放出错时触发1.7.0

<video /> 默认宽度300px、高度225px,可通过wxss设置宽高

<view class="section tc">
  <video src="{{src}}"   controls ></video>
  <view class="btn-area">
    <button bindtap="bindButtonTap">获取视频</button>
  </view>
</view>
<view class="section tc">
  <video id="myVideo" src="http://wxsnsdy.tc.qq.com/105/20210/snsdyvideodownload?filekey=30280201010421301f0201690402534804102ca905ce620b1241b726bc41dcff44e00204012882540400&bizid=1023&hy=SH&fileparam=302c020101042530230204136ffd93020457e3c4ff02024ef202031e8d7f02030f42400204045a320a0201000400" danmu-list="{{danmuList}}" enable-danmu danmu-btn controls></video>
  <view class="btn-area">
    <button bindtap="bindButtonTap">获取视频</button>
    <input bindblur="bindInputBlur"/>
    <button bindtap="bindSendDanmu">发送弹幕</button>
  </view>
</view>
function getRandomColor () {
  let rgb = []
  for (let i = 0 ; i < 3; ++i){
    let color = Math.floor(Math.random() * 256).toString(16)
    color = color.length == 1 ? '0' + color : color
    rgb.push(color)
  }
  return '#' + rgb.join('')
}
Page({
  onReady: function (res) {
    this.videoContext = wx.createVideoContext('myVideo')
  },
  inputValue: '',
    data: {
        src: '',
    danmuList: [
      {
        text: '第 1s 出现的弹幕',
        color: '#ff0000',
        time: 1
      },
      {
        text: '第 3s 出现的弹幕',
        color: '#ff00ff',
        time: 3
    }]
    },
  bindInputBlur: function(e) {
    this.inputValue = e.detail.value
  },
  bindButtonTap: function() {
    var that = this
    wx.chooseVideo({
      sourceType: ['album', 'camera'],
      maxDuration: 60,
      camera: ['front','back'],
      success: function(res) {
        that.setData({
          src: res.tempFilePath
        })
      }
    })
  },
  bindSendDanmu: function () {
    this.videoContext.sendDanmu({
      text: this.inputValue,
      color: getRandomColor()
    })
  }
})

camera

基础库 1.6.0 开始支持,低版本需做兼容处理

系统相机。该组件是原生组件,使用时请注意相关限制。

需要用户授权 scope.camera

属性名类型默认值说明最低版本
modeStringnormal有效值为 normal, scanCode
device-positionStringback前置或后置,值为front, back
flashStringauto闪光灯,值为auto, on, off
scan-areaArray 扫码识别区域,格式为[x, y, w, h],x,y是相对于camera显示区域的左上角,w,h为区域宽度,单位px,仅在 mode="scanCode" 时生效2.1.0
bindstopEventHandle 摄像头在非正常终止时触发,如退出后台等情况
binderrorEventHandle 是否显示弹幕按钮,只在初始化时有效,不能动态变更
bindscancodeEventHandle 是否展示弹幕,只在初始化时有效,不能动态变更2.1.0

Bug & Tip

1.请注意原生组件使用限制。

tip: 同一页面只能插入一个 camera 组件。

bug: scan-area 属性目前存在识别区域不准的问题,建议先不指定

<!-- camera.wxml -->
<camera device-position="back" flash="off" binderror="error" style="width: 100%; height: 300px;"></camera>
<button type="primary" bindtap="takePhoto">拍照</button>
<view>预览</view>
<image mode="widthFix" src="{{src}}"></image>
// 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)
    }
})

live-player

基础库 1.7.0 开始支持,低版本需做兼容处理

实时音视频播放。该组件是原生组件,使用时请注意相关限制。

暂只针对国内主体如下类目的小程序开放,需要先通过类目审核,再在小程序管理后台,“设置”-“接口设置”中自助开通该组件权限

一级类目二级类目
社交直播
教育在线教育
医疗互联网医院,公立医院
政务民生所有二级类目
金融基金、信托、保险、银行、证券/期货、非金融机构自营小额贷款、征信业务、消费金融
属性名类型默认值说明最低版本
srcString 音视频地址。目前仅支持 flv, rtmp 格式
modeStringlivelive(直播),RTC(实时通话)
autoplayBooleanfalse自动播放
mutedBooleanfalse是否静音
orientationStringvertical画面方向,可选值有 vertical,horizontal
object-fitStringcontain填充模式,可选值有 contain,fillCrop
background-muteBooleanfalse自动播放
min-cacheNumber1最小缓冲区,单位s
max-cacheNumber3最大缓冲区,单位s
bindstatechangeEventHandle 播放状态变化事件,detail = {code}
bindfullscreenchangeEventHandle 全屏变化事件,detail = {direction, fullScreen}
bindnetstatusEventHandle 网络状态通知,detail = {info}1.9.0

注意:

1.<live-player /> 默认宽度300px、高度225px,可通过wxss设置宽高。

2.开发者工具上暂不支持。

状态码

代码说明
2001已经连接服务器
2002已经连接服务器,开始拉流
2003网络接收到首个视频数据包(IDR)
2004视频播放开始
2005视频播放进度
2006视频播放结束
2007视频播放Loading
2008解码器启动
2009视频分辨率改变
-2301网络断连,且经多次重连抢救无效,更多重试请自行重启播放
-2302获取加速拉流地址失败
2101当前视频帧解码失败
2102当前音频帧解码失败
2103网络断连, 已启动自动重连
2104网络来包不稳:可能是下行带宽不足,或由于主播端出流不均匀
2105当前视频播放出现卡顿
2106硬解启动失败,采用软解
2107当前视频帧不连续,可能丢帧
2108当前流硬解第一个I帧失败,SDK自动切软解
3001RTMP -DNS解析失败
3002RTMP服务器连接失败
3003RTMP服务器握手失败
3005RTMP 读/写失败

网络状态数据

键名说明
videoBitrate当前视频编/码器输出的比特率,单位 kbps
audioBitrate当前音频编/码器输出的比特率,单位 kbps
videoFPS当前视频帧率
videoGOP当前视频 GOP,也就是每两个关键帧(I帧)间隔时长,单位 s
netSpeed当前的发送/接收速度
netJitter网络抖动情况,抖动越大,网络越不稳定
videoWidth视频画面的宽度
videoHeight视频画面的高度
<live-player src="https://domain/pull_stream" mode="RTC" autoplay bindstatechange="statechange" binderror="error" style="width: 300px; height: 225px;" />
Page({
  statechange(e) {
    console.log('live-player code:', e.detail.code)
  },
  error(e) {
    console.error('live-player error:', e.detail.errMsg)
  }
})

请注意原生组件使用限制

live-pusher

基础库 1.7.0 开始支持,低版本需做兼容处理

实时音视频录制。该组件是原生组件,使用时请注意相关限制。

需要用户授权 scope.camera、scope.record

暂只针对国内主体如下类目的小程序开放,需要先通过类目审核,再在小程序管理后台,“设置”-“接口设置”中自助开通该组件权限

一级类目二级类目
社交直播
教育在线教育
医疗互联网医院,公立医院
政务民生所有二级类目
金融基金、信托、保险、银行、证券/期货、非金融机构自营小额贷款、征信业务、消费金融
属性名类型默认值说明最低版本
urlString 推流地址。目前仅支持 flv, rtmp 格式
modeStringRTCSD(标清), HD(高清), FHD(超清), RTC(实时通话)
autopushBooleanfalse自动推流
mutedBooleanfalse是否静音
enable-cameraBooleantrue开启摄像头
auto-focusBooleantrue自动聚集
orientationStringverticalvertical,horizontal
beautyNumber0美颜
whitenessNumber0美白
aspectString9:16宽高比,可选值有 3:4, 9:16
min-bitrateNumber200最小码率
max-bitrateNumber1000最大码率
waiting-imageString 进入后台时推流的等待画面
waiting-image-hashString 等待画面资源的MD5值
zoomBooleanfalse调整焦距2.1.0
background-muteBooleanfalse进入后台时是否静音
bindstatechangeEventHandle 状态变化事件,detail = {code}
bindnetstatusEventHandle 网络状态通知,detail = {info}1.9.0
binderrorEventHandle 渲染错误事件,detail = {errMsg, errCode}1.7.4

注意:

1.<live-pusher /> 默认宽度为100%、无默认高度,请通过wxss设置宽高。

2.开发者工具上暂不支持。

错误码(errCode)

代码说明
10001用户禁止使用摄像头
10002用户禁止使用录音

状态码

代码说明
1001已经连接推流服务器
1002已经与服务器握手完毕,开始推流
1003打开摄像头成功
1004录屏启动成功
1005推流动态调整分辨率
1006推流动态调整码率
1007首帧画面采集完成
1008解码器启动
-1301打开摄像头失败
-1302打开麦克风失败
-1303视频编码失败
-1304音频编码失败
-1305不支持的视频分辨率
-1306不支持的音频采样率
-1307网络断连,且经多次重连抢救无效,更多重试请自行重启推流
-1308开始录屏失败,可能是被用户拒绝
-1309录屏失败,不支持的Android系统版本,需要5.0以上的系统
-1310录屏被其他应用打断了
-1311Android Mic打开成功,但是录不到音频数据
-1312录屏动态切横竖屏失败
1101网络状况不佳:上行带宽太小,上传数据受阻
1102网络断连, 已启动自动重连
1103硬编码启动失败,采用软编码
1104视频编码失败
1105新美颜软编码启动失败,采用老的软编码
1106新美颜软编码启动失败,采用老的软编码
3001RTMP -DNS解析失败
3002RTMP服务器连接失败
3003RTMP服务器主动断开,请检查推流地址的合法性或防盗链有效期
3005RTMP 读/写失败

网络状态数据

键名说明
videoBitrate当前视频编/码器输出的比特率,单位 kbps
audioBitrate当前音频编/码器输出的比特率,单位 kbps
videoFPS当前视频帧率
videoGOP当前视频 GOP,也就是每两个关键帧(I帧)间隔时长,单位 s
netSpeed当前的发送/接收速度
netJitter网络抖动情况,抖动越大,网络越不稳定
videoWidth视频画面的宽度
videoHeight视频画面的高度
<live-pusher url="https://domain/push_stream" mode="RTC" autopush bindstatechange="statechange" style="width: 300px; height: 225px;" />
Page({
  statechange(e) {
    console.log('live-pusher code:', e.detail.code)
  }
})

请注意原生组件使用限制

map

地图。该组件是原生组件,使用时请注意相关限制

属性名类型默认值说明最低版本
longitudeNumber 中心经度
latitudeNumber 中心纬度
scaleNumber16缩放级别,取值范围为5-18
mutedBooleanfalse是否静音
markersArray 标记点
coversArray 即将移除,请使用 markers
polylineArray 路线
circlesArray
controlsArray 控件(即将废弃,建议使用 cover-view 代替)
include-pointsArray 缩放视野以包含所有给定的坐标点
show-locationBoolean200显示带有方向的当前定位点
bindmarkertapEventHandle 点击标记点时触发,会返回marker的id
bindcallouttapEventHandle 点击标记点对应的气泡时触发,会返回marker的id1.2.0
bindcontroltapEventHandle 点击控件时触发,会返回control的id
bindregionchangeEventHandle 视野发生变化时触发
bindtapEventHandle 点击地图时触发
bindupdatedEventHandle 在地图渲染更新完成时触发1.6.0

注意: covers 属性即将移除,请使用 markers 替代

markers

标记点用于在地图上显示标记的位置

属性名说明类型必填备注最低版本
id标记点idNumbermarker点击事件回调会返回此id。建议为每个marker设置上Number类型id,保证更新marker时有更好的性能
latitude纬度Number浮点数,范围 -90 ~ 90
longitude经度Number浮点数,范围 -180 ~ 180
title标注点名String
iconPath显示的图标String项目目录下的图片路径,支持相对路径写法,以'/'开头则表示相对小程序根目录;也支持临时路径
rotate旋转角度Number顺时针旋转的角度,范围 0 ~ 360,默认为 0
alpha标注的透明度Number默认1,无透明,范围 0 ~ 1
width标注图标宽度Number默认为图片实际宽度
height标注图标高度Number默认为图片实际高度
callout自定义标记点上方的气泡窗口Object支持的属性见下表,可识别换行符1.2.0
label为标记点旁边增加标签Object支持的属性见下表,可识别换行符1.2.0
anchor经纬度在标注图标的锚点,默认底边中点Object{x, y},x表示横向(0-1),y表示竖向(0-1)。{x: .5, y: 1} 表示底边中点1.2.0

marker 上的气泡 callout

属性名说明类型最低版本
content文本String1.2.0
color文本颜色String1.2.0
fontSize文字大小Number1.2.0
borderRadiuscallout边框圆角Number1.2.0
bgColor背景色String1.2.0
padding文本边缘留白Number1.2.0
display'BYCLICK':点击显示; 'ALWAYS':常显String1.2.0
textAlign文本对齐方式。有效值: left, right, centerString1.6.0

marker 上的气泡 label

属性名说明类型最低版本
content文本String1.2.0
color文本颜色String1.2.0
fontSize文字大小Number1.2.0
xlabel的坐标(废弃)Number1.2.0
ylabel的坐标(废弃)Number1.2.0
anchorXlabel的坐标,原点是 marker 对应的经纬度Number2.1.0
anchorYlabel的坐标,原点是 marker 对应的经纬度Number2.1.0
borderWidth边框宽度Number1.6.0
borderColor边框颜色String1.6.0
borderRadius边框圆角Number1.6.0
bgColor背景色String1.6.0
padding文本边缘留白Number1.6.0
textAlign文本对齐方式。有效值: left, right, centerString1.6.0

polyline

指定一系列坐标点,从数组第一项连线至最后一项

属性名说明类型必填备注最低版本
points经纬度数组Array[{latitude: 0, longitude: 0}]
color线的颜色String8位十六进制表示,后两位表示alpha值,如:#000000AA
width线的宽度Number
dottedLine是否虚线Boolean默认false
arrowLine带箭头的线Boolean默认false,开发者工具暂不支持该属性1.2.0
arrowIconPath更换箭头图标String在arrowLine为true时生效1.6.0
borderColor线的边框颜色String 1.2.0
borderWidth线的厚度Number 1.2.0

circles

在地图上显示圆

属性名说明类型必填备注
latitude纬度Number浮点数,范围 -90 ~ 90
longitude经度Number浮点数,范围 -180 ~ 180
color描边的颜色String8位十六进制表示,后两位表示alpha值,如:#000000AA
fillColor填充颜色String8位十六进制表示,后两位表示alpha值,如:#000000AA
radius半径Number
strokeWidth描边的宽度Number

controls

在地图上显示控件,控件不随着地图移动。即将废弃,请使用 cover-view

属性名说明类型必填备注
id控件idNumber在控件点击事件回调会返回此id
position控件在地图的位置Object控件相对地图位置
iconPath显示的图标String项目目录下的图片路径,支持相对路径写法,以'/'开头则表示相对小程序根目录;也支持临时路径
clickable是否可点击Boolean默认不可点击

position

属性名说明类型必填备注
left距离地图的左边界多远Number默认为0
top距离地图的上边界多远Number默认为0
width控件宽度Number默认为图片宽度
height控件高度Number默认为图片高度

地图组件的经纬度必填, 如果不填经纬度则默认值是北京的经纬度

<!-- map.wxml -->
<map id="map" longitude="113.324520" latitude="23.099994" scale="14" controls="{{controls}}" bindcontroltap="controltap" markers="{{markers}}" bindmarkertap="markertap" polyline="{{polyline}}" bindregionchange="regionchange" show-location style="width: 100%; height: 300px;"></map>
// map.js
Page({
  data: {
    markers: [{
      iconPath: "/resources/others.png",
      id: 0,
      latitude: 23.099994,
      longitude: 113.324520,
      width: 50,
      height: 50
    }],
    polyline: [{
      points: [{
        longitude: 113.3245211,
        latitude: 23.10229
      }, {
        longitude: 113.324520,
        latitude: 23.21229
      }],
      color:"#FF0000DD",
      width: 2,
      dottedLine: true
    }],
    controls: [{
      id: 1,
      iconPath: '/resources/location.png',
      position: {
        left: 0,
        top: 300 - 50,
        width: 50,
        height: 50
      },
      clickable: true
    }]
  },
  regionchange(e) {
    console.log(e.type)
  },
  markertap(e) {
    console.log(e.markerId)
  },
  controltap(e) {
    console.log(e.controlId)
  }
})

Bug & Tip

1.请注意原生组件使用限制。

  1. map 组件使用的经纬度是火星坐标系,调用 wx.getLocation 接口需要指定 type 为 gcj02

canvas

画布。该组件是原生组件,使用时请注意相关限制

属性名类型默认值说明
canvas-idString canvas 组件的唯一标识符
disable-scrollBooleanfalse当在 canvas 中移动时且有绑定手势事件时,禁止屏幕滚动以及下拉刷新
bindtouchstartEventHandle 手指触摸动作开始
bindtouchmoveEventHandle 手指触摸后移动
bindtouchendEventHandle 手指触摸动作结束
bindtouchcancelEventHandle 手指触摸动作被打断,如来电提醒,弹窗
bindlongtapEventHandle 手指长按 500ms 之后触发,触发了长按事件后进行移动不会触发屏幕的滚动
binderrorEventHandle 当发生错误时触发 error 事件,detail = {errMsg: 'something wrong'}

注:

1.canvas 标签默认宽度300px、高度225px

2.同一页面中的 canvas-id 不可重复,如果使用一个已经出现过的 canvas-id,该 canvas 标签对应的画布将被隐藏并不再正常工作

<!-- canvas.wxml -->
<canvas style="width: 300px; height: 200px;" canvas-id="firstCanvas"></canvas>
<!-- 当使用绝对定位时,文档流后边的 canvas 的显示层级高于前边的 canvas -->
<canvas style="width: 400px; height: 500px;" canvas-id="secondCanvas"></canvas>
<!-- 因为 canvas-id 与前一个 canvas 重复,该 canvas 不会显示,并会发送一个错误事件到 AppService -->
<canvas style="width: 400px; height: 500px;" canvas-id="secondCanvas" binderror="canvasIdErrorCallback"></canvas>
// canvas.js
Page({
  canvasIdErrorCallback: function (e) {
    console.error(e.detail.errMsg)
  },
  onReady: function (e) {
    // 使用 wx.createContext 获取绘图上下文 context
    var context = wx.createCanvasContext('firstCanvas')
    
    context.setStrokeStyle("#00ff00")
    context.setLineWidth(5)
    context.rect(0, 0, 200, 200)
    context.stroke()
    context.setStrokeStyle("#ff0000")
    context.setLineWidth(2)
    context.moveTo(160, 100)
    context.arc(100, 100, 60, 0, 2 * Math.PI, true)
    context.moveTo(140, 100)
    context.arc(100, 100, 40, 0, Math.PI, false)
    context.moveTo(85, 80)
    context.arc(80, 80, 5, 0, 2 * Math.PI, true)
    context.moveTo(125, 80)
    context.arc(120, 80, 5, 0, 2 * Math.PI, true)
    context.stroke()
    context.draw()
  }
})

Bug & Tip

1.请注意原生组件使用限制。

2.避免设置过大的宽高,在安卓下会有crash的问题

开放能力

open-data

用于展示微信开放的数据;基础库 1.4.0 开始支持,低版本需做兼容处理

属性名类型默认值说明
typeString 开放数据类型
open-gidString 当 type="groupName" 时生效, 群id
langStringen当 type="user*" 时生效,以哪种语言展示 userInfo,有效值有:en, zh_CN, zh_TW

type 有效值:

说明最低版本
groupName拉取群名称1.4.0
userNickName用户昵称1.9.90
userAvatarUrl用户头像1.9.90
userGender用户性别1.9.90
userCity用户所在城市1.9.90
userProvince用户所在省份1.9.90
userCountry用户所在国家1.9.90
userLanguage用户的语言1.9.90

Tips: 只有当前用户在此群内才能拉取到群名称

web-view

web-view 组件是一个可以用来承载网页的容器,会自动铺满整个小程序页面。个人类型与海外类型的小程序暂不支持使用

基础库 1.6.4 开始支持,低版本需做兼容处理。客户端 6.7.2 版本开始,navigationStyle: custom 对 <web-view> 组件无效

属性名类型默认值说明
srcString webview 指向网页的链接。可打开关联的公众号的文章,其它网页需登录小程序管理后台配置业务域名
bindmessageEventHandler 网页向小程序 postMessage 时,会在特定时机(小程序后退、组件销毁、分享)触发并收到消息。e.detail = { data }
<!-- wxml -->
<!-- 指向微信公众平台首页的web-view -->
<web-view src="https://mp.weixin.qq.com/"></web-view>
相关接口1
接口名说明最低版本
wx.miniProgram.navigateTo参数与小程序接口一致1.6.4
wx.miniProgram.navigateBack参数与小程序接口一致1.6.4
wx.miniProgram.switchTab参数与小程序接口一致1.6.5
wx.miniProgram.reLaunch参数与小程序接口一致1.6.5
wx.miniProgram.redirectTo参数与小程序接口一致1.6.5
wx.miniProgram.postMessage向小程序发送消息1.7.1
wx.miniProgram.getEnv获取当前环境1.7.1
<!-- html -->
<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.3.2.js"></script>
// javascript
wx.miniProgram.navigateTo({url: '/path/to/page'})
wx.miniProgram.postMessage({ data: 'foo' })
wx.miniProgram.postMessage({ data: {foo: 'bar'} })
wx.miniProgram.getEnv(function(res) { console.log(res.miniprogram) // true })
相关接口 2

<web-view/>网页中仅支持以下JSSDK接口:

接口模块接口说明具体接口
判断客户端是否支持js checkJSApi
图像接口拍照或上传chooseImage
预览图片previewImage
上传图片uploadImage
下载图片getLocalImgData
获取本地图片previewImage
音频接口开始录音startRecord
停止录音stopRecord
监听录音自动停止onVoiceRecordEnd
播放语音playVoice
暂停播放pauseVoice
停止播放stopVoice
监听语音播放完毕onVoicePlayEnd
上传接口uploadVoice
下载接口downloadVoice
智能接口识别音频translateVoice
设备信息获取网络状态getNetworkType
地理位置使用内置地图getLocation
获取地理位置openLocation
摇一摇周边开启ibeaconstartSearchBeacons
关闭ibeaconstopSearchBeacons
监听ibeacononSearchBeacons
微信扫一扫调起微信扫一扫scanQRCode
微信卡券拉取使用卡券列表chooseCard
批量添加卡券接口addCard
查看微信卡包的卡券openCard
长按识别小程序圆形码
相关接口 3

用户分享时可获取当前<web-view/>的URL,即在onShareAppMessage回调中返回webViewUrl参数

Page({
  onShareAppMessage(options) {
    console.log(options.webViewUrl)
  }
})
相关接口 4

在网页内可通过window.__wxjs_environment变量判断是否在小程序环境,建议在WeixinJSBridgeReady回调中使用,也可以使用JSSDK 1.3.2提供的getEnv接口

// web-view下的页面内
function ready() {
  console.log(window.__wxjs_environment === 'miniprogram') // true
}
if (!window.WeixinJSBridge || !WeixinJSBridge.invoke) {
  document.addEventListener('WeixinJSBridgeReady', ready, false)
} else {
  ready()
}
// 或者
wx.miniProgram.getEnv(function(res) {
  console.log(res.miniprogram) // true
})

Bug & Tip

1.网页内iframe的域名也需要配置到域名白名单。

2.开发者工具上,可以在 组件上通过右键 - 调试,打开 组件的调试。

3.每个页面只能有一个,会自动铺满整个页面,并覆盖其他组件。

4.网页与小程序之间不支持除JSSDK提供的接口之外的通信。

5.在iOS中,若存在JSSDK接口调用无响应的情况,可在的src后面加个#wechat_redirect解决。

ad

广告。目前暂时以邀请制开放申请,请留意后续模板消息的通知

基础库 1.9.94 开始支持,低版本需做兼容处理

| 属性名 | 类型 | 默认值 | 说明 | 版本 |
|:---------:|:-------:|:------:|:----------------------------------------------------------------------------------------------------:|:-----:|
| unit-id | String | | 广告单元id,可在小程序管理后台的流量主模块新建 | |
| bindload | Handler | | 广告加载成功的回调 | 2.2.1 |
| binderror | Handler | | 当广告发生错误时,触发的事件,可以通过该事件获取错误码及原因,事件对象event.detail = {errCode: 1002} | 2.2.1 |

注1:监听到error回调后,开发者可以针对性的处理,比如隐藏广告组件的父容器,以保证用户体验,但不要移除广告组件,否则将无法收到bindload的回调

错误码信息与解决方案表:错误码是通过binderror回调获取到的错误信息

| 代码 | 异常情况 | 理由 | 解决方案 |
|:----:|:----------------:|:------------------------------------------------------------------:|:--------------------------------------------------------------------------:|
| 1000 | 后端错误调用失败 | 该项错误不是开发者的异常情况 | 一般情况下忽略一段时间即可恢复 |
| 1001 | 参数错误 | 使用方法错误 | 可以前往developers.weixin.qq.com确认具体教程(小程序和小游戏分别有各自的教程.可以在顶部选项中,“设计”一栏的右侧进行切换 |
| 1002 | 广告单元无效 | 可能是拼写错误、或者误用了其他APP的广告ID | 请重新前往mp.weixin.qq.com确认广告位ID |
| 1003 | 内部错误 | 该项错误不是开发者的异常情况 | 一般情况下忽略一段时间即可恢复 |
| 1004 | 无适合的广告 | 广告不是每一次都会出现,这次没有出现可能是由于该用户不适合浏览广告 | 属于正常情况,且开发者需要针对这种情况做形态上的兼容 |
| 1005 | 广告组件审核中 | 你的广告正在被审核,无法展现广告 | 请前往mp.weixin.qq.com确认审核状态,且开发者需要针对这种情况做形态上的兼容 |
| 1006 | 广告组件被驳回 | 你的广告审核失败,无法展现广告 | 请前往mp.weixin.qq.com确认审核状态,且开发者需要针对这种情况做形态上的兼容 |
| 1007 | 广告组件被驳回 | 你的广告能力已经被封禁,封禁期间无法展现广告 | 请前往mp.weixin.qq.com确认小程序广告封禁状态 |
| 1008 | 广告单元已关闭 | 该广告位的广告能力已经被关闭 | 请前往mp.weixin.qq.com重新打开对应广告位的展现 |

注意

1.目前可以给 ad 标签设置 wxss 样式调整广告宽度,以使广告与页面更融洽,但请遵循小程序流量主应用规范

2.在无广告展示时,ad 标签不会占用高度

3.ad 组件不支持触发 bindtap 等触摸相关事件

原生组件

小程序中的部分组件是由客户端创建的原生组件,这些组件有:

camera canvas input live-player live-pusher map textarea video

原生组件的使用限制

由于原生组件脱离在 WebView 渲染流程外,因此在使用时有以下限制:

1.原生组件的层级是最高的,所以页面中的其他组件无论设置 z-index 为多少,都无法盖在原生组件上。

1).后插入的原生组件可以覆盖之前的原生组件。

2.原生组件还无法在 scroll-view、swiper、picker-view、movable-view 中使用。

3.部分CSS样式无法应用于原生组件,例如:

1).无法对原生组件设置 CSS 动画

2).无法定义原生组件为 position: fixed

3).不能在父级节点使用 overflow: hidden 来裁剪原生组件的显示区域

4.原生组件的事件监听不能使用 bind:eventname 的写法,只支持 bindeventname。原生组件也不支持 catch 和 capture 的事件绑定方式

5.在iOS下,原生组件暂时不支持触摸相关事件

在工具上,原生组件是用web组件模拟的,因此很多情况并不能很好的还原真机的表现,建议开发者在使用到原生组件时尽量在真机上进行调试

cover-view 与 cover-image

为了解决原生组件层级最高的限制。小程序专门提供了 cover-view 和 cover-image 组件,可以覆盖在部分原生组件上面。这两个组件也是原生组件,但是使用限制与其他原生组件有所不同

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值