依星源码资源网,依星资源网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

【好消息,好消息,好消息】VIP会员可以发表文章赚积分啦 !
查看: 39|回复: 0

RadioGroup代替方案,类似iOS中UISegmentedControl

[复制链接] 主动推送

2636

主题

2645

帖子

3377

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3377
发表于 昨天 11:29 | 显示全部楼层 |阅读模式
RadioGroup代替方案,类似iOS中UISegmentedControl

RadioGroup代替方案,类似iOS中UISegmentedControl

RadioGroup代替方案,类似iOS中UISegmentedControl

RadioGroup代替方案,类似iOS中UISegmentedControl

RadioGroup代替方案,类似iOS中UISegmentedControl




#布局
##1.样式表
外圈是一个圆角的矩形
内部是第N段取值,其中最后一段为空,声明class为last
选中为底色+白字,普通状态则反之,声明class为selected
  1. /*LXSegmentedControl容器*/
  2. .segmentedControl {
  3.         /*水平居中*/
  4.         margin: 30px auto;
  5.         /*边框为2px 主色调为蓝*/
  6.         border: 2px solid #39f;
  7.         /*圆角6px*/
  8.         border-radius: 6px;
  9.         /*控件宽度*/
  10.         width: 240px;
  11.         /*控件高度*/
  12.         height: 30px;
  13. }

  14. /*普通文本*/
  15. .segmentedControl text {
  16.         /*水平排列*/
  17.         float: left;
  18.         /*宽度为控件宽度的1/3 再减去2px的右边框*/
  19.         width: 78px;
  20.         /*字体大小*/
  21.         font-size: 14px;
  22.         /*主色调*/
  23.         color: #39f;
  24.         /*行高,与控件高度相等*/
  25.         line-height: 30px;
  26.         /*文本水平居中*/
  27.         text-align: center;
  28.         /*右边距*/
  29.         border-right: 2px solid #39f;
  30. }

  31. /*选中状态文本*/
  32. .segmentedControl text.selected {
  33.         /*同主色调*/
  34.         background-color: #39f;
  35.         /*前景色为白色*/
  36.         color: white;
  37. }

  38. /*最后一个分组按钮*/
  39. .segmentedControl text.last {
  40.         /*不必右边框*/
  41.         border-right: 0;
  42.         /*高度也不必减少2px,就是控件高度的1/3*/
  43.         width: 80px;
  44. }
复制代码
##2.写上静态的数据作为测试
  1. <view class="segmentedControl">
  2.         <text>男</text>
  3.         <text class="selected">女</text>
  4.         <text class="last">保密</text>
  5. </view>
复制代码
这里有一个坑:
  1. <text>男</text>
复制代码
不等同于
  1. <text>
  2.         男
  3. </text>
复制代码
后者会变成占据两行
##3.改进为数组
  1. Page({
  2.         data: {
  3.                 radioValues: [
  4.                         {'value': '男','selected': false},
  5.                         {'value': '女','selected': true},
  6.                         {'value': '保密','selected': false},
  7.                 ]
  8.         }
  9. })
复制代码
##4.循环遍历与样式判断
  1. <view class="segmentedControl">
  2.         <!-- 循环遍历 -->
  3.         <block wx:for="{{radioValues}}">
  4.                 <!-- 找出最后一段 -->
  5.                 <text class="last" wx:if="{{index == radioValues.length - 1}}">{{item.value}}</text>
  6.                 <!-- 判断是不是选中状态 -->
  7.                 <text class="selected" wx:elif="{{item.selected}}">{{item.value}}</text>
  8.                 <!-- 普通按钮 -->
  9.                 <text wx:else>{{item.value}}</text>
  10.         </block>
  11. </view>
复制代码
注意:以上判断是错的,当最后一个高亮时却不出selected效果,于是后文再重写。
##5.点击text处理高亮与否
  1. indexChanged: function(e){
  2.                 // 点中的是组中第个元素
  3.                 var index = e.target.dataset.index;
  4.                 // 读取原始的数组
  5.                 var radioValues = this.data.radioValues;
  6.                 for (var i = 0; i < radioValues.length; i++){
  7.                         // 全部改为非选中
  8.                         radioValues[i].selected = false;
  9.                         // 当前那个改为选中
  10.                         radioValues[index].selected = true;
  11.                 }
  12.                 // 写回数据
  13.                 this.setData({
  14.                         radioValues: radioValues
  15.                 });
  16.                 // clazz状态
  17.                 this.clazzStatus();
  18.         },
复制代码
##6.第4条判断样式表逻辑错误
索性改为提供数据源的方式来实现,wxml中就不做判断了,wx:if只能对等标签上判断,实在不好用。
  1. clazzStatus: function(){
  2.                 /* 此方法分别被加载时调用,点击某段时调用 */
  3.                 // class样式表如"selected last","selected"
  4.                 var clazz = [];
  5.                 // 参照数据源
  6.                 var radioValues = this.data.radioValues;
  7.                 for (var i = 0; i < radioValues.length; i++){
  8.                         // 默认为空串,即普通按钮
  9.                         var cls = '';
  10.                         // 高亮,追回selected
  11.                         if (radioValues[i].selected) {
  12.                                 cls += 'selected ';
  13.                         }
  14.                         // 最后个元素, 追加last
  15.                         if (i == radioValues.length - 1) {
  16.                                 cls += 'last ';
  17.                         }
  18.                         //去掉尾部空格
  19.                         cls = cls.replace(/(\s*$)/g,'');
  20.                         clazz[i] = cls;
  21.                 }
  22.                 // 写回数据
  23.                 this.setData({
  24.                         clazz: clazz
  25.                 });
  26.         }
复制代码
然后分别在onLoad与indexChanged调用它即可。
而布局文件也变得异常清晰,数据与视图分离了:
  1. <view class="segmentedControl">
  2.         <!-- 循环遍历 -->
  3.         <block wx:for="{{radioValues}}">
  4.                 <text data-index="{{index}}" bindtap="indexChanged" class="{{clazz[index]}}">{{item.value}}</text>
  5.         </block>
  6. </view>
复制代码
提取码下载:
文件名称:提取码下载.txt 
下载次数:0  文件大小:12 Bytes  售价:10金钱 [记录]
下载权限: 不限 [购买VIP]   [充值]   [在线充值]   【VIP会员6折;永久VIP4折】
安全检测,请放心下载






相关帖子

扫码关注微信公众号,及时获取最新资源信息!下载附件优惠VIP会员6折;永久VIP4折
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明:
1、本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
2、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,请勿任何商业目的与商业用途。
3、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
4、论坛的所有内容都不保证其准确性,完整性,有效性,由于源码具有复制性,一经售出,概不退换。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
5、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担
6、本站所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站
7、本站使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,本站不承担任何责任。
8、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束。
9、本站以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!
10、本网站如无意中侵犯了某个企业或个人的知识产权,请来信【站长信箱312337667@qq.com】告之,本站将立即删除。
郑重声明:
本站所有资源仅供用户本地电脑学习源代码的内含设计思想和原理,禁止任何其他用途!
本站所有资源、教程来自互联网转载,仅供学习交流,不得商业运营资源,不确保资源完整性,图片和资源仅供参考,不提供任何技术服务。
本站资源仅供本地编辑研究学习参考,禁止未经资源商正版授权参与任何商业行为,违法行为!如需商业请购买各资源商正版授权
本站仅收集资源,提供用户自学研究使用,本站不存在私自接受协助用户架设游戏或资源,非法运营资源行为。
 
在线客服
点击这里给我发消息 点击这里给我发消息 点击这里给我发消息
售前咨询热线
312337667

微信扫一扫,私享最新原创实用干货

QQ|免责声明|小黑屋|依星资源网 ( 鲁ICP备2021043233号-3 )|网站地图

GMT+8, 2025-2-5 16:40

Powered by Net188.com X3.4

邮箱:312337667@qq.com 客服QQ:312337667(工作时间:9:00~21:00)

快速回复 返回顶部 返回列表