graceNvueSelectList.vue 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. <template>
  2. <view class="select-list">
  3. <view v-for="(item, index) in dataIn" :key="index" class="select-list-item" :data-index="index" @tap.stop="choose">
  4. <image :src="item.img" class="select-list-img" v-if="item.img" mode="widthFix" :style="{width:imgSize[0], height:imgSize[1]}"></image>
  5. <view class="select-list-body" :class="[isBorder?'grace-border-b':'']">
  6. <text class="select-list-content" :style="{fontSize:fontSize, lineHeight:lineHeight, color:itemColor}">{{item.title}}</text>
  7. <text class="select-list-icon grace-icons" v-if="item.checked" :style="{color:item.checked ? checkColor : '#A5A7B2'}">&#xe60f;</text>
  8. </view>
  9. </view>
  10. </view>
  11. </template>
  12. <script>
  13. export default{
  14. props:{
  15. lists : {type:Array, default:function(){return [];}},
  16. checkColor:{type:String, default:"#3688FF"},
  17. type : { type: String, default: "radio"},
  18. imgSize:{type:Array, default:function(){return ['68rpx','68rpx'];}},
  19. fontSize:{type: String, default: "28rpx"},
  20. isBorder:{type:Boolean, default:true},
  21. lineHeight:{type: String, default: "50rpx"},
  22. itemColor:{type:String, default:"#323232"}
  23. },
  24. data() {
  25. return {
  26. dataIn: []
  27. }
  28. },
  29. created:function(){
  30. this.dataIn = this.lists;
  31. },
  32. watch:{
  33. lists:function(val){
  34. this.dataIn = val;
  35. }
  36. },
  37. methods:{
  38. choose:function(e){
  39. var index = e.currentTarget.dataset.index;
  40. if(this.type == 'radio'){
  41. if(this.dataIn[index].checked){
  42. this.dataIn[index].checked = false;
  43. this.$emit('change', -1);
  44. }else{
  45. for(let i = 0; i < this.dataIn.length; i++){
  46. this.dataIn[i].checked = false;
  47. }
  48. this.dataIn[index].checked = true;
  49. this.$emit('change', index);
  50. }
  51. }else{
  52. if(this.dataIn[index].checked){
  53. this.dataIn[index].checked = false;
  54. }else{
  55. this.dataIn[index].checked = true;
  56. }
  57. var sedArr = [];
  58. for(let i = 0; i < this.dataIn.length; i++){
  59. if(this.dataIn[i].checked){
  60. sedArr.push(i);
  61. }
  62. }
  63. this.$emit('change', sedArr);
  64. }
  65. }
  66. }
  67. }
  68. </script>
  69. <style>
  70. .select-list{}
  71. .select-list-item{flex-direction:row; flex-wrap:nowrap; align-items:center; font-size:0;}
  72. .select-list-icon{width:60rpx; line-height:60rpx; text-align:center; font-size:36rpx; color:#A5A7B2; font-weight:700; margin-left:28rpx;}
  73. .select-list-img{border-radius:60rpx; margin-right:28rpx;}
  74. .select-list-body{width:300rpx; flex:1; flex-wrap:nowrap; flex-direction:row; align-items:center;}
  75. .select-list-content{width:200rpx; flex:1; overflow:hidden; margin-top:25rpx; margin-bottom:25rpx;}
  76. </style>