小程序表单组件:按钮、复选框、表单等

来自CloudWiki
跳转至: 导航搜索

button

按钮

Alt text

Alt text 示例代码:

.button-hover {

 background-color: red;

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

Alt text

checkbox

多选项目。

Alt text 示例代码:

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

})

.checkbox{

   display:flex;
   flex-direction:row-reverse;

}

Alt text

editor

富文本编辑器,可以对图片、文字进行编辑。

编辑器导出内容支持带标签的 html和纯文本的 text,编辑器内部采用 delta 格式进行存储。

通过setContents接口设置内容时,解析插入的 html 可能会由于一些非法标签导致解析错误,建议开发者在小程序内使用时通过 delta 进行插入。

富文本组件内部引入了一些基本的样式使得内容可以正确的展示,开发时可以进行覆盖。需要注意的是,在其它组件或环境中使用富文本组件导出的html时,需要额外引入这段样式,并维护的结构。

图片控件仅初始化时设置有效。

Alt text 示例代码:

<editor

 id="editor"
 class="ql-container"
 placeholder="模板:Placeholder"
 showImgSize
 showImgToolbar
 showImgResize
 bindstatuschange="onStatusChange"
 read-only="模板:ReadOnly"
 bindready="onEditorReady">

</editor>

Page({

 readOnlyChange() {
   this.setData({
     readOnly: !this.data.readOnly
   })
 },
 onEditorReady() {
   const that = this
   wx.createSelectorQuery().select('#editor').context(function (res) {
     that.editorCtx = res.context
   }).exec()
 },
 format(e) {
   let { name, value } = e.target.dataset
   if (!name) return
   // console.log('format', name, value)
   this.editorCtx.format(name, value)
 },

})

form

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

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

Alt text 示例代码:

<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 form-type="submit">Submit</button>
   <button form-type="reset">Reset</button>
 </view>

</form>

Page({

 formSubmit: function(e) {
   console.log('form发生了submit事件,携带数据为:', e.detail.value)
 },
 formReset: function() {
   console.log('form发生了reset事件')
 }

})

input

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

Alt text 示例代码:

<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  bindinput="bindReplaceInput" placeholder="连续的两个1会变成2" />

</view> <view class="section">

 <input password type="number" />

</view> <view class="section">

 <input password type="text" />

</view> <view class="section">

 <input type="digit" placeholder="带小数点的数字键盘"/>

</view> <view class="section">

 <input type="idcard" placeholder="身份证输入键盘" />

</view> <view class="section">

 <input placeholder-style="color:red" placeholder="占位符字体是红色的" />

</view>

//input.js Page({

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

})

label

用来改进表单组件的可用性。

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

Alt text 示例代码:

<view class="section section_gap"> <view class="section__title">表单组件在label内</view> <checkbox-group class="group" bindchange="checkboxChange">

 <view class="label-1" wx:for="[

http://www.example.com 链接标题

媒体文件:范例.ogg]">

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

}

Alt text

picker

从底部弹起的滚动选择器。

Alt text 示例代码:

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

})

Alt text

radio

单选项目。

Alt text 示例代码:

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

})

Alt text

slider

滑动选择器。

Alt text 示例代码:

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

Alt text

switch

开关选择器。

Alt text 示例代码:

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

})

Alt text

textarea

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

Alt text 示例代码:

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

})