index.vue 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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 lang="ts" setup>
  28. import { ref, watch } from 'vue'
  29. import UIFloating from '@kankan-components/components/basic/floating'
  30. import Bubble from '../bubble'
  31. defineOptions({
  32. name: 'UIGuide',
  33. })
  34. const props = defineProps({
  35. mark: {
  36. type: String,
  37. },
  38. msg: {
  39. type: String,
  40. },
  41. floatClass: {
  42. type: String,
  43. },
  44. type: {
  45. type: String,
  46. default: 'top',
  47. },
  48. })
  49. const mountEl = document.body
  50. const guideRef = ref()
  51. const shouldShow = ref(true)
  52. if (props.mark) {
  53. shouldShow.value = !localStorage.getItem(props.mark)
  54. if (shouldShow.value) {
  55. watch(shouldShow, (newv, oldv) => {
  56. if (!newv && oldv) {
  57. setTimeout(() => {
  58. localStorage.setItem(props.mark, 1)
  59. })
  60. }
  61. })
  62. }
  63. } else {
  64. shouldShow.value = true
  65. }
  66. const mount = ref(shouldShow.value)
  67. </script>
  68. <!-- <script>
  69. export default { name: 'UiGuide' }
  70. </script> -->