BreadcrumbItem.vue 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. <template>
  2. <span class="breadcrumb__item">
  3. <span ref="linkRef" :class="['breadcrumb__inner', to || isLink ? 'is-link' : '']">
  4. <slot />
  5. </span>
  6. <i v-if="separatorClass" class="breadcrumb__separator" :class="separatorClass"></i>
  7. <span v-else class="breadcrumb__separator">{{ separator }}</span>
  8. </span>
  9. </template>
  10. <script lang="ts">
  11. import { defineComponent, inject, ref, onMounted, unref } from 'vue';
  12. import { useRouter } from 'vue-router';
  13. import { useEvent } from '/@/hooks/event/useEvent';
  14. export default defineComponent({
  15. name: 'BreadcrumbItem',
  16. props: {
  17. to: {
  18. type: [String, Object],
  19. default: '',
  20. },
  21. replace: {
  22. type: Boolean,
  23. default: false,
  24. },
  25. isLink: {
  26. type: Boolean,
  27. default: false,
  28. },
  29. },
  30. setup(props) {
  31. const linkRef = ref<Nullable<HTMLElement>>(null);
  32. const parent = inject('breadcrumb') as {
  33. separator: string;
  34. separatorClass: string;
  35. };
  36. const { push, replace } = useRouter();
  37. onMounted(() => {
  38. const link = unref(linkRef);
  39. if (!link) return;
  40. useEvent({
  41. el: link,
  42. listener: () => {
  43. const { to } = props;
  44. if (!props.to) return;
  45. props.replace ? replace(to) : push(to);
  46. },
  47. name: 'click',
  48. wait: 0,
  49. });
  50. });
  51. return {
  52. linkRef,
  53. separator: parent.separator && parent.separator,
  54. separatorClass: parent.separatorClass && parent.separatorClass,
  55. };
  56. },
  57. });
  58. </script>