knowledge-guide.tsx 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. import { Button, Popup } from "vant";
  2. import { } from "vant";
  3. import { defineComponent, nextTick, onMounted, onUnmounted, reactive, ref, watch } from "vue";
  4. import styles from "./index.module.less";
  5. import { getImage } from "./images";
  6. import { useRect } from "@vant/use";
  7. export default defineComponent({
  8. name: "knowledge-guide",
  9. emits: ["close"],
  10. setup(props, { emit }) {
  11. const data = reactive({
  12. box: {},
  13. show: false,
  14. steps: [
  15. {
  16. ele: "",
  17. eleRect: {} as DOMRect,
  18. img: getImage("knowledge1.png"),
  19. handStyle: {
  20. top: "1.3rem",
  21. left:'1.5rem'
  22. },
  23. imgStyle: {
  24. top: "1.9rem",
  25. },
  26. btnsStyle: {
  27. top: "4.5rem",
  28. left:'1rem'
  29. },
  30. },
  31. {
  32. ele: "",
  33. eleRect: {} as DOMRect,
  34. img: getImage("knowledge2.png"),
  35. handStyle: {
  36. top: "1.3rem",
  37. left:'1.5rem'
  38. },
  39. imgStyle: {
  40. top: "1.9rem",
  41. left:'-1.5rem'
  42. },
  43. btnsStyle: {
  44. top: "4.5rem",
  45. },
  46. boxStyle:{
  47. transform: 'scale(1)'
  48. },
  49. },
  50. {
  51. ele: "",
  52. img: getImage("knowledge3.png"),
  53. handStyle: {
  54. top: "4.1rem",
  55. left:'3.6rem',
  56. },
  57. imgStyle: {
  58. top: "4.8rem",
  59. left:'1.2rem',
  60. },
  61. btnsStyle: {
  62. top: "7.5rem",
  63. left:'1.3rem',
  64. },
  65. boxStyle:{
  66. transform: 'scale(1)'
  67. },
  68. },
  69. ],
  70. step: 0,
  71. });
  72. const tipShow = ref(false)
  73. const getStepELe = () => {
  74. const ele: HTMLElement = document.getElementById(`knowledge-${data.step}`) as any;
  75. if (ele) {
  76. const eleRect = ele.getBoundingClientRect();
  77. data.box = {
  78. left: eleRect.x + "px",
  79. top: eleRect.y + "px",
  80. width: eleRect.width + "px",
  81. height: eleRect.height + "px",
  82. };
  83. }else{
  84. handleNext()
  85. }
  86. };
  87. onMounted(() => {
  88. const guideInfo = localStorage.getItem('guideInfo')
  89. if(guideInfo&&JSON.parse(guideInfo).knowledge){
  90. tipShow.value =false
  91. }else {
  92. tipShow.value =true
  93. }
  94. getStepELe();
  95. window.addEventListener("resize", resetSize);
  96. });
  97. const resetSize = ()=>{
  98. getStepELe();
  99. }
  100. onUnmounted(()=>{
  101. window.removeEventListener("resize", resetSize);
  102. })
  103. const handleNext = () => {
  104. if (data.step >= 3) {
  105. endGuide();
  106. return;
  107. }
  108. data.step = data.step + 1;
  109. getStepELe();
  110. };
  111. const endGuide = ()=>{
  112. let guideInfo = JSON.parse(localStorage.getItem('guideInfo') || '{}')
  113. if(!guideInfo){
  114. guideInfo = {knowledge:true}
  115. }else{
  116. guideInfo.knowledge = true
  117. }
  118. localStorage.setItem('guideInfo',JSON.stringify(guideInfo))
  119. tipShow.value = false
  120. // localStorage.setItem('endC')
  121. }
  122. return () => (
  123. <Popup teleport="body" overlay={false} closeOnClickOverlay={false} class={["popup-custom", styles.guidePopup]} v-model:show={tipShow.value}>
  124. <div class={styles.content} onClick={() => handleNext()}>
  125. {data.step!=data.steps.length-1&&<div
  126. class={styles.backBtn}
  127. onClick={(e: Event) => {
  128. e.stopPropagation();
  129. endGuide()
  130. }}
  131. >
  132. 跳过
  133. </div>}
  134. <div class={styles.box} style={data.box} id={`modeType-${data.step}`}>
  135. {data.steps.map((item: any, index) => (
  136. <div
  137. onClick={(e: Event) => e.stopPropagation()}
  138. class={styles.item}
  139. style={{
  140. display: index === data.step ? "" : "none",
  141. left: `${item.eleRect?.left}px`,
  142. top: `${item.eleRect?.top}px`,
  143. }}
  144. >
  145. <img class={styles.img} style={item.imgStyle} src={item.img} />
  146. <img class={styles.iconHead} style={item.handStyle} src={getImage("indexDot.png")} />
  147. <div class={styles.btns} style={item.btnsStyle}>
  148. {data.step + 1 == data.steps.length ? (
  149. <>
  150. <Button
  151. class={styles.btn}
  152. round
  153. color="transparent"
  154. style={{ "border-color": "#fff" }}
  155. type="primary"
  156. onClick={() => {
  157. data.step = 0;
  158. getStepELe();
  159. }}
  160. >
  161. 再看一遍
  162. </Button>
  163. <Button class={[styles.btn,styles.endBtn]} round type="primary" onClick={() =>endGuide()}>
  164. 完成
  165. </Button>
  166. </>
  167. ) : (
  168. <Button class={styles.btn} round type="primary" onClick={() => handleNext()}>
  169. 下一步 ({data.step + 1}/{data.steps.length})
  170. </Button>
  171. )}
  172. </div>
  173. </div>
  174. ))}
  175. </div>
  176. </div>
  177. </Popup>
  178. );
  179. },
  180. });