tn-checkbox-group.vue 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. <template>
  2. <view class="tn-checkbox-group-class tn-checkbox-group">
  3. <slot></slot>
  4. </view>
  5. </template>
  6. <script>
  7. import Emitter from '../../libs/utils/emitter.js'
  8. export default {
  9. mixins: [ Emitter ],
  10. name: 'tn-checkbox-group',
  11. props: {
  12. value: {
  13. type: Array,
  14. default() {
  15. return []
  16. }
  17. },
  18. // 可以选中多少个checkbox
  19. max: {
  20. type: Number,
  21. default: 999
  22. },
  23. // 表单提交时的标识符
  24. name: {
  25. type: String,
  26. default: ''
  27. },
  28. // 禁用选择
  29. disabled: {
  30. type: Boolean,
  31. default: false
  32. },
  33. // 禁用点击标签进行选择
  34. disabledLabel: {
  35. type: Boolean,
  36. default: false
  37. },
  38. // 选择框的形状 square 方形 circle 圆形
  39. shape: {
  40. type: String,
  41. default: 'square'
  42. },
  43. // 选中时的颜色
  44. activeColor: {
  45. type: String,
  46. default: '#01BEFF'
  47. },
  48. // 组件大小
  49. size: {
  50. type: Number,
  51. default: 34
  52. },
  53. // 每个checkbox占的宽度
  54. width: {
  55. type: String,
  56. default: 'auto'
  57. },
  58. // 是否换行
  59. wrap: {
  60. type: Boolean,
  61. default: false
  62. },
  63. // 图标大小
  64. iconSize: {
  65. type: Number,
  66. default: 20
  67. }
  68. },
  69. computed: {
  70. // 这里computed的变量,都是子组件tn-checkbox需要用到的,由于头条小程序的兼容性差异,子组件无法实时监听父组件参数的变化
  71. // 所以需要手动通知子组件,这里返回一个parentData变量,供watch监听,在其中去通知每一个子组件重新从父组件(tn-checkbox-group)
  72. // 拉取父组件新的变化后的参数
  73. parentData() {
  74. return [this.value, this.disabled, this.disabledLabel, this.shape, this.activeColor, this.size, this.width, this.wrap, this.iconSize]
  75. }
  76. },
  77. data() {
  78. return {
  79. }
  80. },
  81. watch: {
  82. // 当父组件中的子组件需要共享的参数发生了变化,手动通知子组件
  83. parentData() {
  84. if (this.children.length) {
  85. this.children.map(child => {
  86. // 判断子组件(tn-checkbox)如果有updateParentData方法的话,子组件重新从父组件拉取了最新的值
  87. typeof(child.updateParentData) === 'function' && child.updateParentData()
  88. })
  89. }
  90. }
  91. },
  92. created() {
  93. this.children = []
  94. },
  95. methods: {
  96. initValue(values) {
  97. this.$emit('input', values)
  98. },
  99. // 触发事件
  100. emitEvent() {
  101. let values = []
  102. this.children.map(child => {
  103. if (child.checkValue) values.push(child.name)
  104. })
  105. this.$emit('change', values)
  106. this.$emit('input', values)
  107. // 发出事件,用于在表单组件中嵌入checkbox的情况,进行验证
  108. // 由于头条小程序执行迟钝,故需要用几十毫秒的延时
  109. setTimeout(() => {
  110. // 将当前的值发送到 tn-form-item 进行校验
  111. this.dispatch('tn-form-item', 'on-form-change', values)
  112. }, 60)
  113. }
  114. }
  115. }
  116. </script>
  117. <style lang="scss" scoped>
  118. .tn-checkbox-group {
  119. /* #ifndef MP || APP-NVUE */
  120. display: inline-flex;
  121. flex-wrap: wrap;
  122. /* #endif */
  123. &::after {
  124. content: " ";
  125. display: table;
  126. clear: both;
  127. }
  128. }
  129. </style>