1.创建组件

xtx-checkbox.vue

  1. <template>
  2. <div class="xtx-checkbox" @click="changeChecked()">
  3. <i v-if="checked" class="iconfont icon-checked"></i>
  4. <i v-else class="iconfont icon-unchecked"></i>
  5. <span v-if="$slots.default"><slot /></span>
  6. </div>
  7. </template>
  8. <script>
  9. import { ref } from 'vue'
  10. export default {
  11. name: 'XtxCheckbox',
  12. setup () {
  13. const checked = ref(false)
  14. const changeChecked = () => {
  15. checked.value = !checked.value
  16. }
  17. return { checked, changeChecked }
  18. }
  19. }
  20. </script>
  21. <style scoped lang="less">
  22. .xtx-checkbox {
  23. display: inline-block;
  24. margin-right: 2px;
  25. .icon-checked {
  26. color: @xtxColor;
  27. ~ span {
  28. color: @xtxColor;
  29. }
  30. }
  31. i {
  32. position: relative;
  33. top: 1px;
  34. }
  35. span {
  36. margin-left: 2px;
  37. }
  38. }
  39. </style>

2.实现双向绑定

vue3.0中v-model会拆解成 属性 modelValue 和 事件 update:modelValue

  1. import { ref, watch } from 'vue'
  2. // v-model ====> :modelValue + @update:modelValue
  3. export default {
  4. name: 'XtxCheckbox',
  5. props: {
  6. modelValue: {
  7. type: Boolean,
  8. default: false
  9. }
  10. },
  11. setup (props, { emit }) {
  12. // const checked = ref(false)
  13. const changeChecked = () => {
  14. // checked.value = !checked.value
  15. emit('update:modelValue', !props.modelValue)
  16. }
  17. return { changeChecked }
  18. }
  19. }

3.测试

Playground/index.vue

  1. <div>
  2. <div @click="isAgree=!isAgree">创建二级类目</div>
  3. {{isAgree}}
  4. <xtx-checkbox v-model="isAgree">同意吗?</xtx-checkbox>
  5. </div>
  6. <script>
  7. setup () {
  8. const isAgree = ref(false)
  9. return { isAgree }
  10. }
  11. </script>

4.在sort.vue中补充使用复选框组件

  1. <template>
  2. <!-- 排序区域 -->
  3. <div class='sub-sort'>
  4. // 省略其他...
  5. <div class="check">
  6. <XtxCheckbox v-model="sortParams.inventory">仅显示有货商品</XtxCheckbox>
  7. <XtxCheckbox v-model="sortParams.onlyDiscount">仅显示特惠商品</XtxCheckbox>
  8. </div>
  9. </div>
  10. </template>