TagBar.vue 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. <template>
  2. <!-- 单选标签选择按钮条,可显示一行标签,然后高亮选中项 -->
  3. <div class="d-flex flex-row flex-wrap">
  4. <div
  5. :class="[
  6. 'tag-button',
  7. { 'active': tag.id === selectedTag },
  8. ]"
  9. v-for="tag in tags"
  10. :key="tag.id"
  11. @click="emit('update:selectedTag', tag.id ?? tag)"
  12. >
  13. {{ tag.name?? tag }}
  14. </div>
  15. </div>
  16. </template>
  17. <script setup lang="ts">
  18. import type { PropType } from 'vue';
  19. defineProps({
  20. /**
  21. * 标签列表
  22. */
  23. tags: {
  24. type: Object as PropType<Array<{
  25. id: number|string,
  26. name: string,
  27. }>>,
  28. required: true,
  29. },
  30. /**
  31. * 选中的标签,可双向绑定
  32. */
  33. selectedTag: {
  34. type: [Number,String],
  35. default: null,
  36. }
  37. })
  38. const emit = defineEmits([
  39. "update:selectedTag"
  40. ])
  41. </script>
  42. <style lang="scss">
  43. .tag-button {
  44. display: flex;
  45. flex-direction: row;
  46. align-items: center;
  47. background-color: var(--color-box-inset);
  48. color: var(--color-text);
  49. padding: 10px 15px;
  50. margin-right: 8px;
  51. cursor: pointer;
  52. user-select: none;
  53. &:hover {
  54. background-color: var(--color-box-hover);
  55. }
  56. &:active, &.active {
  57. color: var(--color-text-light);
  58. background-color: var(--color-primary);
  59. }
  60. }
  61. </style>