AppListItem.vue 822 B

12345678910111213141516171819202122232425262728293031323334
  1. <template>
  2. <div class="app-item" :class="{ active: activeAppId === app.id }" @click="emit('selectApp', app)">
  3. <img :src="useDefaultIcon ? vueIcon : iconUrl" alt="应用图标" @error="useDefaultIcon = true" />
  4. {{ app.title }}
  5. </div>
  6. </template>
  7. <script setup lang="ts">
  8. import { computed, PropType, ref } from 'vue';
  9. import { AppItem } from '../model/App';
  10. import vueIcon from '../assets/vue.svg';
  11. const emit = defineEmits(['selectApp']);
  12. const props = defineProps({
  13. app: {
  14. type: Object as PropType<AppItem>,
  15. default: () => {},
  16. },
  17. activeAppId: {
  18. type: Number,
  19. default: 0,
  20. }
  21. })
  22. const iconUrl = computed(() => {
  23. if (!props.app.url)
  24. return '';
  25. const parsedUrl = new URL(props.app.url);
  26. return `${parsedUrl.origin}/favicon.ico`
  27. })
  28. const useDefaultIcon = ref(false);
  29. </script>