check-box.vue 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <template>
  2. <div class="check-box">
  3. <div class="common-box list-box">
  4. <div class="title-box">
  5. <h3>{{ typeList[type - 1] }}</h3>
  6. </div>
  7. <div class="list">
  8. <a-checkbox
  9. v-model:checked="checkAll"
  10. :indeterminate="indeterminate"
  11. @change="onCheckAllChange"
  12. >
  13. 全选
  14. </a-checkbox>
  15. <a-checkbox-group style="display: block" v-model:value="checkedList">
  16. <a-checkbox v-for="item in list" :key="item.value" :value="item">{{
  17. item.label
  18. }}</a-checkbox>
  19. </a-checkbox-group>
  20. </div>
  21. </div>
  22. <div class="common-box selected-box">
  23. <div class="title-box">
  24. <span
  25. style="
  26. display: block;
  27. font-weight: bold;
  28. line-height: 30px;
  29. float: left;
  30. font-size: 13px;
  31. "
  32. >已选</span
  33. >
  34. <h3 class="clear-all" @click="clearAll">全部清空</h3>
  35. </div>
  36. <div class="selected">
  37. <p v-for="item in checkedList" :key="item.value">
  38. <span>{{ item.label }}</span>
  39. <i class="iconfont icon-guanbi" @click="deleteItem(item)"></i>
  40. </p>
  41. </div>
  42. </div>
  43. </div>
  44. </template>
  45. <script lang="ts">
  46. import { defineComponent, reactive, toRefs, ref, watch } from "vue";
  47. import {} from "@/api";
  48. import { message } from "ant-design-vue";
  49. const CheckBox = defineComponent({
  50. props: ["compType"],
  51. setup() {
  52. const state = reactive({
  53. list: ref<any[]>([]),
  54. indeterminate: false,
  55. checkAll: false,
  56. checkedList: ref<any[]>([]),
  57. typeList: ["文章分类", "手机品牌", "职业状态", "可开放定向"],
  58. type: 1,
  59. });
  60. const onCheckAllChange = (e: any) => {
  61. state.checkedList = e.target.checked ? state.list : [];
  62. state.checkAll = e.target.checked;
  63. state.indeterminate = false;
  64. };
  65. watch(
  66. () => state.checkedList,
  67. (val) => {
  68. state.indeterminate = !!val.length && val.length < state.list.length;
  69. state.checkAll = val.length === state.list.length;
  70. }
  71. );
  72. return { ...toRefs(state), onCheckAllChange };
  73. },
  74. mounted() {
  75. this.type = this.$props.compType ?? 1;
  76. this.list = [
  77. { label: "测试1", value: 1 },
  78. { label: "测试2", value: 2 },
  79. { label: "测试3", value: 3 },
  80. { label: "测试4", value: 4 },
  81. { label: "测试5", value: 5 },
  82. { label: "测试6", value: 6 },
  83. { label: "测试7", value: 7 },
  84. { label: "测试8", value: 8 },
  85. { label: "测试9", value: 9 },
  86. { label: "测试10", value: 10 },
  87. ];
  88. },
  89. methods: {
  90. // 全部清空
  91. clearAll() {
  92. this.checkedList = [];
  93. },
  94. // 删除单个
  95. deleteItem(val: any) {
  96. this.checkedList.splice(this.checkedList.indexOf(val), 1);
  97. this.indeterminate =
  98. this.checkedList.length === 0 ||
  99. this.checkedList.length === this.list.length
  100. ? false
  101. : true;
  102. this.checkAll = this.checkedList.length === this.list.length;
  103. },
  104. // 全选操作
  105. },
  106. });
  107. export default CheckBox;
  108. </script>
  109. <style lang="scss" scoped>
  110. .check-box {
  111. margin-top: 10px;
  112. width: 550px;
  113. .common-box {
  114. height: 210px;
  115. float: left;
  116. border: 1px solid rgb(210, 210, 210);
  117. border-radius: 2px;
  118. .title-box {
  119. padding: 0 10px;
  120. height: 30px;
  121. border-bottom: 1px solid rgb(210, 210, 210);
  122. h3 {
  123. font-size: 13px;
  124. font-weight: bold;
  125. height: 30px;
  126. line-height: 30px;
  127. float: left;
  128. margin-bottom: 0;
  129. }
  130. .clear-all {
  131. font-size: 13px;
  132. font-weight: normal;
  133. color: gray;
  134. float: right;
  135. cursor: pointer;
  136. }
  137. }
  138. }
  139. .list-box {
  140. width: 320px;
  141. .list {
  142. height: 176px;
  143. overflow: auto;
  144. padding: 0 10px;
  145. .ant-checkbox-wrapper {
  146. display: block;
  147. margin: 0;
  148. line-height: 32px;
  149. height: 32px;
  150. }
  151. }
  152. }
  153. .selected-box {
  154. width: 200px;
  155. margin-left: 20px;
  156. .selected {
  157. height: 176px;
  158. overflow: auto;
  159. padding: 0 10px;
  160. p {
  161. background: rgb(240, 240, 240);
  162. height: 26px;
  163. line-height: 26px;
  164. display: flex;
  165. align-items: center;
  166. justify-content: space-around;
  167. margin-top: 6px;
  168. font-size: 13px;
  169. span {
  170. display: inline-block;
  171. width: 130px;
  172. white-space: nowrap;
  173. text-overflow: ellipsis;
  174. overflow: hidden;
  175. word-break: break-all;
  176. border-radius: 2px;
  177. }
  178. i {
  179. cursor: pointer;
  180. font-size: 13px;
  181. &:hover {
  182. color: skyblue;
  183. }
  184. }
  185. }
  186. }
  187. }
  188. }
  189. </style>