| <template> | |
|   <view class="flex card"> | |
|     <view> | |
|       <uv-checkbox-group | |
|         v-model="selectCheckboxValue" | |
|         @change="onSelectChange" | |
|       > | |
|         <uv-checkbox | |
|           size="36rpx" | |
|           icon-size="36rpx" | |
|           activeColor="#00A9FF" | |
|           :name="1" | |
|         ></uv-checkbox> | |
|       </uv-checkbox-group> | |
|     </view> | |
|     <view class="info"> | |
|       <view class="flex name"> | |
|         <view>{{ data.name }}</view> | |
|         <view :class="['tag', `tag-${data.type}`]">{{ typeDesc }}</view> | |
|       </view> | |
|       <view class="id">{{ data.idNo }}</view> | |
|     </view> | |
|   </view> | |
| </template> | |
|  | |
| <script> | |
|  | |
|   const MEMBER_TYPE_AND_DESC_MAPPING = { | |
|     0: '成人', | |
|     1: '青少年', | |
|     2: '儿童', | |
|   } | |
|    | |
|   export default { | |
|     props: { | |
|       data: { | |
|         type: Object, | |
|         default() { | |
|           return {} | |
|         } | |
|       }, | |
|     }, | |
|     data() { | |
|       return { | |
|         selectCheckboxValue: [], | |
|       } | |
|     }, | |
|     computed: { | |
|       isSelected: { | |
|         set(val) { | |
|           this.selectCheckboxValue = val ? [1]: [] | |
|  | |
|           if (this.data.isSelected == val) { | |
|             return | |
|           } | |
|  | |
|           this.$emit('selectChange', val) | |
|         }, | |
|         get() { | |
|           return this.selectCheckboxValue.length ? true : false | |
|         } | |
|       }, | |
|       typeDesc() { | |
|         return MEMBER_TYPE_AND_DESC_MAPPING[this.data.type] | |
|       }, | |
|     }, | |
|     watch: { | |
|       data: { | |
|         handler(val) { | |
|           this.isSelected = val.isSelected | |
|         }, | |
|         immediate: true, | |
|         deep: true, | |
|       } | |
|     }, | |
|     methods: { | |
|       onSelectChange(val) { | |
|         this.isSelected = val.length ? true : false | |
|       }, | |
|     } | |
|   } | |
| </script> | |
|  | |
| <style scoped lang="scss"> | |
|   .card { | |
|     justify-content: flex-start; | |
|     column-gap: 24rpx; | |
|     padding: 24rpx; | |
|     background: #F9F9F9; | |
|   } | |
| 
 | |
|   .info { | |
|     .name { | |
|       justify-content: flex-start; | |
|       column-gap: 24rpx; | |
|       font-size: 32rpx; | |
|       color: #181818; | |
| 
 | |
|       .tag { | |
|         padding: 2rpx 14rpx; | |
|         font-size: 24rpx; | |
|         color: #00A9FF; | |
|         background: #E9F8FF; | |
|         border: 2rpx solid #00A9FF; | |
|         border-radius: 8rpx; | |
| 
 | |
|         &-1 { | |
|           color: #03C25C; | |
|           background: #E9FFF5; | |
|           border-color: #03C25C; | |
|         } | |
| 
 | |
|         &-2 { | |
|           color: #EE6E05; | |
|           background: #FFEFE9; | |
|           border-color: #EE6E05; | |
|         } | |
| 
 | |
|       } | |
|     } | |
| 
 | |
|     .id { | |
|       margin-top: 8rpx; | |
|       font-size: 28rpx; | |
|       color: #9B9B9B; | |
|     } | |
|   } | |
| </style> |