u-checkbox-group.vue 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. <template>
  2. <view class="u-checkbox-group u-clearfix" :class="uFromData.inputAlign == 'right' ? 'flex-end' : ''"><slot></slot></view>
  3. </template>
  4. <script>
  5. import Emitter from "../../libs/util/emitter.js";
  6. /**
  7. * checkboxGroup 开关选择器父组件Group
  8. * @description 复选框组件一般用于需要多个选择的场景,该组件功能完整,使用方便
  9. * @tutorial https://www.uviewui.com/components/checkbox.html
  10. * @property {String Number} max 最多能选中多少个checkbox(默认999)
  11. * @property {String Number} size 组件整体的大小,单位rpx(默认40)
  12. * @property {Boolean} disabled 是否禁用所有checkbox(默认false)
  13. * @property {String Number} icon-size 图标大小,单位rpx(默认20)
  14. * @property {Boolean} label-disabled 是否禁止点击文本操作checkbox(默认false)
  15. * @property {String} width 宽度,需带单位
  16. * @property {String} width 宽度,需带单位
  17. * @property {String} shape 外观形状,shape-方形,circle-圆形(默认circle)
  18. * @property {Boolean} wrap 是否每个checkbox都换行(默认false)
  19. * @property {String} active-color 选中时的颜色,应用到所有子Checkbox组件(默认#2979ff)
  20. * @event {Function} change 任一个checkbox状态发生变化时触发,回调为一个对象
  21. * @example <u-checkbox-group></u-checkbox-group>
  22. */
  23. export default {
  24. name: "u-checkbox-group",
  25. emits: ["update:modelValue", "input", "change"],
  26. mixins: [Emitter],
  27. props: {
  28. // 匹配某一个radio组件,如果某个radio的name值等于此值,那么这个radio就被会选中
  29. value: {
  30. type: [String, Number, Array, Boolean],
  31. default: ""
  32. },
  33. modelValue: {
  34. type: [String, Number, Array, Boolean],
  35. default: ""
  36. },
  37. // 最多能选中多少个checkbox
  38. max: {
  39. type: [Number, String],
  40. default: 999
  41. },
  42. // 所有选中项的 name
  43. // value: {
  44. // default: Array,
  45. // default() {
  46. // return []
  47. // }
  48. // },
  49. // 是否禁用所有复选框
  50. disabled: {
  51. type: Boolean,
  52. default: false
  53. },
  54. // 在表单内提交时的标识符
  55. name: {
  56. type: [Boolean, String],
  57. default: ""
  58. },
  59. // 是否禁止点击提示语选中复选框
  60. labelDisabled: {
  61. type: Boolean,
  62. default: false
  63. },
  64. // 形状,square为方形,circle为圆型
  65. shape: {
  66. type: String,
  67. default: "square"
  68. },
  69. // 选中状态下的颜色
  70. activeColor: {
  71. type: String,
  72. default: "#2979ff"
  73. },
  74. // 组件的整体大小
  75. size: {
  76. type: [String, Number],
  77. default: 34
  78. },
  79. // 每个checkbox占u-checkbox-group的宽度
  80. width: {
  81. type: String,
  82. default: "auto"
  83. },
  84. // 是否每个checkbox都换行
  85. wrap: {
  86. type: Boolean,
  87. default: false
  88. },
  89. // 图标的大小,单位rpx
  90. iconSize: {
  91. type: [String, Number],
  92. default: 20
  93. }
  94. },
  95. data() {
  96. return {
  97. values: [],
  98. uFromData: {
  99. inputAlign: "left"
  100. }
  101. };
  102. },
  103. created() {
  104. // 如果将children定义在data中,在微信小程序会造成循环引用而报错
  105. this.children = [];
  106. },
  107. mounted() {
  108. // 支付宝、头条小程序不支持provide/inject,所以使用这个方法获取整个父组件,在created定义,避免循环应用
  109. let parent = this.$u.$parent.call(this, "u-form");
  110. if (parent) {
  111. Object.keys(this.uFromData).map(key => {
  112. this.uFromData[key] = parent[key];
  113. });
  114. }
  115. },
  116. methods: {
  117. emitEvent(obj) {
  118. let values = this.values || [];
  119. if (obj.value) {
  120. let index = values.indexOf(obj.name);
  121. if (index === -1) {
  122. values.push(obj.name);
  123. }
  124. } else {
  125. let index = values.indexOf(obj.name);
  126. if (index > -1) {
  127. values.splice(index, 1);
  128. }
  129. }
  130. this.$emit("change", values);
  131. // 通过emit事件,设置父组件通过v-model双向绑定的值
  132. this.$emit("input", values);
  133. this.$emit("update:modelValue", values);
  134. // 发出事件,用于在表单组件中嵌入checkbox的情况,进行验证
  135. // 由于头条小程序执行迟钝,故需要用几十毫秒的延时
  136. setTimeout(() => {
  137. // 将当前的值发送到 u-form-item 进行校验
  138. this.dispatch("u-form-item", "onFieldChange", values);
  139. }, 60);
  140. },
  141. _emitEvent(obj) {
  142. let values = this.values || [];
  143. if (obj.value) {
  144. let index = values.indexOf(obj.name);
  145. if (index === -1) {
  146. values.push(obj.name);
  147. }
  148. } else {
  149. let index = values.indexOf(obj.name);
  150. if (index > -1) {
  151. values.splice(index, 1);
  152. }
  153. }
  154. //this.$emit("change", values);
  155. }
  156. }
  157. };
  158. </script>
  159. <style lang="scss" scoped>
  160. @import "../../libs/css/style.components.scss";
  161. .u-checkbox-group {
  162. /* #ifndef MP || APP-NVUE */
  163. display: inline-flex;
  164. flex-wrap: wrap;
  165. /* #endif */
  166. }
  167. .u-checkbox-group.flex-end {
  168. /* #ifndef APP-NVUE */
  169. display: inline-flex;
  170. justify-content: flex-end;
  171. flex-wrap: wrap;
  172. /* #endif */
  173. }
  174. </style>