#表单组件#
>button按钮
>button按钮组件提供3种类型按钮(type属性):
>基本类型
>默认类型
>警告类型
>提供两种大小形状的按钮(size属性):
>默认
>mini
属性 | 类型 | 默认值 | 说明 |
size | string | default | 按钮的大小 |
type | string | default | 按钮的样式类型 |
plain | boolean | false | 按钮是否镂空,背景色透明 |
disabled | boolean | false | 是否禁用 |
loading | boolean | false | 名称前是否带 loading 图标 |
form-type | string | 用于form组件,点击分别会触发组件的 submit/reset 事件 | |
hover-class | string | button-hover | 指定按钮按下去的样式类。当 hover-class="none" 时,没有点击态效果 |
hover-start-time | number | 20 | 按住后多久出现点击态,单位毫秒 |
hover-stay-time | number | 70 | 手指松开后点击态保留时间,单位毫秒 |
示例代码:
//.wxml
<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="onGetUserInfo">获取用户信息</button>
<button open-type="openSetting">打开授权设置页</button>
//.js
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
})
},
onGetUserInfo: 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的容器
>它有一个绑定事件bindchange
><checkbox-group/>中选中项发生改变时触发change事件
>detail={ value:[选中的checkbox的value的数组]}
属性 | 类型 | 默认值 | 说明 |
value | string | checkbox标识,选中时触发 checkbox-group的 change 事件, 并携带 checkbox的 value | |
disabled | boolean | false | 是否禁用 |
checked | boolean | false | 当前是否选中,可用来设置默认选 中 |
color | color | #09BB07 | checkbox的颜色,同css的color |
示例代码:
//.wxml
<view>
<checkbox-group bindchange="checkboxChange">
<label class="checkbox" wx:for="{{items}}">
<checkbox value="{{item.name}}" checked="{{item.checked}}"/>{{item.value}}
</label>
</checkbox-group>
</view>
//.js
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)
}
)}
效果截图:
>radio单项选择器
>该组件是与checkbox对立的一个组件
>每次只能选中一个选项
>选项间是一种互斥关系
>radio-group是用来容纳多个radio的容器
>它有一个绑定事件bindchange
><radio-group/>>中的选中项发生变化时触发 bindchange事件
>event.detail={value:选中的radio的value}
属性 | 类型 | 默认值 | 说明 |
value | string | radio标识,当该radio选中时, radio-group的 change 事件会携 带 radio的 value | |
disabled | boolean | false | 是否禁用 |
checked | boolean | false | 当前是否选中,可用来设置默认选中 |
color | color | #09BB07 | checkbox的颜色,同css的color |
示例代码:
//.wxml
<view>
<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>
</view>
//.js
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)
}
)}
>input单行输入框
>用来输入单行文本内容
>input类型有(type属性):text、number、idcard、digit
>3个常用事件:输入时(bindinput)、光标聚焦时(bindfocus)、光标离开时(bindblur)
属性 | 类型 | 默认值 | 说明 |
value | string | 输入框的初始内容 | |
type | string | text | input 的类型 |
password | boolean | false | 是否是密码类型 |
placeholder | string | 输入框为空时占位符 | |
placeholder-style | string | 指定 placeholder 的样式 | |
placeholder-class | string | input-placeholder | 指定 placeholder 的样式类 |
disabled | boolean | false | 是否禁用 |
maxlength | number | 140 | 最大输入长度,设置为 -1 的时候不限制最大长度 |
cursor-spacing | number | 0 | 指定光标与键盘的距离,取 input 距离底部的距 离和 cursor-spacing 指定的距离的最小值作为光 标与键盘的距离 |
focus | boolean | false | 获取焦点 |
bindinput | eventhandle | 键盘输入时触发,event.detail = {value:value}, 处理函数可以直接 return 一个字符串,将替换输 入框的内容。 | |
bindfocus | eventhandle | 输入框聚焦时触发,event.detail = { value: value } | |
bindblur | eventhandle | 输入框失去焦点时触发,event.detail = {value: value} | |
bindconfirm | eventhandle | 点击完成按钮时触发,event.detail = {value: value} |
示例代码:
//.wxml
<view>
<view class="section">
<input placeholder="这是一个可以自动聚焦的input" auto-focus/>
</view>
<view class="section">
<input placeholder="这个只有在按钮点击的时候才聚焦" focus="{{focus}}" />
<view class="btn-area">
<button bindtap="bindButtonTap">使得输入框获取焦点</button>
</view>
</view>
<view class="section">
<input maxlength="10" placeholder="最大输入长度10" />
</view>
<view class="section">
<view class="section__title">你输入的是:{{inputValue}}</view>
<input bindinput="bindKeyInput" placeholder="输入同步到view中"/>
</view>
<view class="section">
<input placeholder="这是一个可以自动聚焦的input" focus="true"/>
</view>
</view>
//.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
}
}
})
效果截图:
>picker滚动选择器
>从底部弹起的滚动选择器
>支持5种滚动选择器:普通选择器、多列选择器、时间选择器、日期选择器 、省市区选择器
属性 | 类型 | 默认值 | 说明 |
range | array/object array | [] | mode 为 selector 或 multiSelector 时,range 有效 |
range-key | string | 当 range 是一个 Object Array 时,通过 range-key 来指定 Object 中 key 的值作为选择器 显示内容 | |
value | number | 0 | 表示选择了 range 中的第几个 (下标从 0 开始) |
bindchange | eventhandle | value 改变时触发 change 事件, event.detail = {value} |
属性 | 类型 | 默认值 | 说明 |
range | array/object array | [] | mode 为 selector 或 multiSelector 时,range 有效 |
range-key | string | 当 range 是一个 Object Array 时,通过 range-key 来指定 Object 中 key 的值作为选择器 显示内容 | |
value | number | 0 | 表示选择了 range 中的第几个 (下标从 0 开始) |
bindchange | eventhandle | value 改变时触发 change 事件, event.detail = {value} | |
bindcolu mnchange | eventhandle | 列改变时触发 |
属性 | 类型 | 说明 |
value | string | 表示选中的时间,格式为"hh:mm" |
start | string | 表示有效时间范围的开始,字符串格式为 "hh:mm" |
end | string | 表示有效时间范围的结束,字符串格式为 "hh:mm" |
bindchange | eventhandle | value 改变时触发 change 事件, event.detail = {value} |
属性 | 类型 | 默认值 | 说明 |
value | string | 0 | 表示选中的日期,格式为"YYYY-MM-DD" |
start | string | 表示有效日期范围的开始,字符串格式为 "YYYY-MM-DD" | |
end | string | 表示有效日期范围的结束,字符串格式为 "YYYY-MM-DD" | |
fields | string | day | 有效值 year,month,day,表示选择器的 粒度 |
bindchange | eventhandle | value 改变时触发 change 事件, event.detail = {value} |
属性 | 类型 | 默认值 | 说明 |
value | array | [] | 表示选中的省市区,默认选中每一 列的第一个值 |
custom-item | string | 可为每一列的顶部添加一个自定义 的项 | |
bindchange | eventhandle | value 改变时触发 change 事件, event.detail = {value, code, postcode},其中字段 code 是统计 用区划代码,postcode 是邮政编码 |
示例代码:
//.wxml
<view>
<view class="section">
<view class="section__title">普通选择器</view>
<picker bindchange="bindPickerChange" value="{{index}}" range="{{array}}">
<view class="picker">当前选择:{{array[index]}}</view>
</picker>
</view>
<text>\n</text>
<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>
<text>\n</text>
<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>
<text>\n</text>
<view class="section">
<view class="section__title">日期选择器</view>
<!-- start="2000-01-01" end="2023-10-02" -->
<picker mode="date" value="{{date}}" end="2023-10-02" bindchange="bindDateChange">
<view class="picker">当前选择: {{date}}</view>
</picker>
</view>
<text>\n</text>
<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>
</view>
//.js
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: 4,
name: '节肢动物'
}
],
[
{
id: 0,
name: '猪肉绦虫'
},
{
id: 1,
name: '吸血虫'
}
]
],
multiIndex: [0, 0, 0],
date: '2023-10-02',
time: '12:15',
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;
break;
}
console.log(data.multiIndex);
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})
}
})
效果截图:
>slider滑动选择器
>该组件经常用于控制声音的大小、屏幕的亮度等场景
属性 | 类型 | 默认值 | 说明 |
min | number | 0 | 最小值 |
max | number | 100 | 最大值 |
step | number | 1 | 步长,取值必须大于 0,并且可被(max - min) 整除 |
disabled | boolean | false | 是否禁用 |
value | number | 0 | 当前取值 |
color | color | #e9e9e9 | 背景条的颜色(请使用 backgroundColor) |
selected-color | color | #1aad19 | 已选择的颜色(请使用 activeColor) |
show-value | boolean | false | 是否显示当前 value |
bindchange | eventhandle | 完成一次拖动后触发的事件,event.detail = {value} |
示例代码:
//.wxml
<!-- 滚动选择器 -->
<view>
<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>
</view>
//.js
Page({
slider2change:function(e){
console.log('slider2发生change事件,携带值为',e.detail.value)
},
slider3change:function(e){
console.log('slider3发生change事件,携带值为',e.detail.value)
},
slider4change:function(e){
console.log('slider4发生change事件,携带值为',e.detail.value)
}
})
效果截图:
>switch开关选择器
>该组件应用十分普遍,它有两个状态:开和关
>很多场景都会用到它,如微信设置里的新消息提醒 界面:是否接收消息、是否有声音、是否振动
属性 | 类型 | 默认值 | 说明 |
checked | boolean | false | 是否选中 |
type | string | switch | 样式,有效值:switch, checkbox |
color | string | #04BE02 | switch 的颜色,同 css 的 color |
bindchange | eventhandle | checked 改变时触发change 事件,event.detail={ value} |
示例代码:
//.wxml
<view >
<switch checked bindchange="switch1Change"/>
<switch bindchange="switch2Change"/>
</view>
//.js
Page({
switch1Change: function (e) {
console.log('switch1 发生 change 事件,携带值为', e.detail.value)
},
switch2Change: function (e) {
console.log('switch2 发生 change 事件,携带值为', e.detail.value)
}
})
效果截图:
>form表单
>该组件将表单里组件的值提交给js文件进行处理
>可以提交switch、input、checkbox、slider、 radio、picker这些组件的值
>提交表单的时候,会借助于button组件的 formType 为 submit 的属性,将表单组件中的value 值进行提交
>需要在表单组件中加上 name 来作为 key
属性 | 类型 | 默认值 | 说明 |
reportsubmit | boolean | false | 是否返回 formId 用于发送模板消息 |
bindsubmit | eventhandle | 携带 form 中的数据触发submit 事件,event.detail = {value : {'name': 'value'} , formId: ''} | |
bindreset | eventhandle | 表单重置时会触发 reset 事件 |
示例代码:
//.wxml
<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">单选框</view>
<radio-group name="radio-group">
<label><radio value="西瓜"/>西瓜</label>
<label><radio value="葡萄"/>葡萄</label>
</radio-group>
</view>
<view class="section section_gap">
<view class="section__title">复选框</view>
<checkbox-group name="checkbox">
<label><checkbox value="苹果"/>苹果</label>
<label><checkbox value="香蕉"/>香蕉</label>
</checkbox-group>
</view>
<view class="btn-area">
<button form-type="submit">Submit</button>
<button form-type="reset">Reset</button>
</view>
</form>
//.js
Page({
formSubmit: function (e) {
console.log('form发生了submit事件,携带数据为:', e.detail.value)
},
formReset: function () {
console.log('form发生了reset事件')
}
})
效果截图:
...持续学习完善中。
#学无止境#