index.vue 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. <template>
  2. <div v-if="mount && (msg || $slots.default)" ref="guideRef" class="guide" :class="{ 'floating-mode': floatClass }">
  3. <slot name="content" :show="shouldShow" />
  4. <UIFloating v-if="floatClass" :mount="mountEl" :refer="guideRef" dire="bottom" :class="`guide-floating ${props.floatClass} ${type}`">
  5. <Bubble :show="shouldShow" class="guide-bubble" :type="type">
  6. <template v-if="msg">
  7. <p class="default-msg">{{ msg }}</p>
  8. </template>
  9. <slot v-else />
  10. <span class="guide-close" @click="shouldShow = false">
  11. <ui-icon type="close" ctrl />
  12. </span>
  13. </Bubble>
  14. </UIFloating>
  15. <Bubble v-else :show="shouldShow" class="guide-bubble" :type="type">
  16. <template v-if="msg">
  17. <p class="default-msg">{{ msg }}</p>
  18. </template>
  19. <slot v-else />
  20. <span class="guide-close" @click="shouldShow = false">
  21. <ui-icon type="close" ctrl />
  22. </span>
  23. </Bubble>
  24. </div>
  25. <slot v-else name="content" :show="false" />
  26. </template>
  27. <script setup>
  28. import { ref, watch } from 'vue'
  29. import Bubble from '../bubble'
  30. import UIFloating from '../floating/index.vue'
  31. const props = defineProps({
  32. mark: {
  33. type: String,
  34. },
  35. msg: {
  36. type: String,
  37. },
  38. floatClass: {
  39. type: String,
  40. },
  41. type: {
  42. type: String,
  43. default: 'top',
  44. },
  45. })
  46. const mountEl = document.body
  47. const guideRef = ref()
  48. const shouldShow = ref(true)
  49. if (props.mark) {
  50. shouldShow.value = !localStorage.getItem(props.mark)
  51. if (shouldShow.value) {
  52. watch(shouldShow, (newv, oldv) => {
  53. if (!newv && oldv) {
  54. setTimeout(() => {
  55. localStorage.setItem(props.mark, 1)
  56. })
  57. }
  58. })
  59. }
  60. } else {
  61. shouldShow.value = true
  62. }
  63. const mount = ref(shouldShow.value)
  64. </script>
  65. <script>
  66. export default { name: 'UiGuide' }
  67. </script>