index.tsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import { computed, defineComponent, onBeforeMount, reactive } from "vue";
  2. import styles from "./index.module.less";
  3. import state from "/src/state";
  4. import { getFingeringConfig, ITypeFingering } from "./fingering-config";
  5. export default defineComponent({
  6. name: "fingering",
  7. emits: ["open"],
  8. setup(props, { emit }) {
  9. const fingerData = reactive({
  10. relationshipIndex: 0,
  11. subject: null as unknown as ITypeFingering,
  12. delay: 0,
  13. });
  14. const getFingeringData = async () => {
  15. // 葫芦丝的指法,云教练页面和听音练习页面,展示的不一样,需要区分
  16. const source = state.fingeringInfo.name === 'hulusi-flute' ? 'musicDetail' : '';
  17. fingerData.subject = await getFingeringConfig(state.fingeringInfo.name, source);
  18. console.log("🚀 ~ fingerData.subject:", fingerData.subject);
  19. };
  20. onBeforeMount(() => {
  21. getFingeringData();
  22. });
  23. /** 当前音域 */
  24. const realKey = computed(() => {
  25. return state.times[state.activeNoteIndex]?.realKey || -1;
  26. });
  27. const doubeClick = () => {
  28. const nowTime = Date.now();
  29. if (nowTime - fingerData.delay < 300) {
  30. emit("open");
  31. return;
  32. }
  33. fingerData.delay = nowTime;
  34. };
  35. return () => {
  36. // console.log("音高", realKey.value);
  37. const relationship = fingerData.subject?.relationship?.[realKey.value] || [];
  38. const rs: number[] = Array.isArray(relationship[1]) ? relationship[fingerData.relationshipIndex] : relationship;
  39. const canTizhi = Array.isArray(relationship[1]);
  40. return (
  41. <>
  42. {state.fingeringInfo.direction === "transverse" ? (
  43. <div onClick={() => doubeClick()} class={[styles.fingeringContainer]}>
  44. <div class={styles.imgs}>
  45. <img class="driver-7" src={fingerData.subject?.json?.full} />
  46. {rs.map((key: number | string, index: number) => {
  47. const nk: string = typeof key === "string" ? key.replace("active-", "") : String(key);
  48. return <img data-index={nk} src={fingerData.subject?.json?.[nk]} />;
  49. })}
  50. </div>
  51. {state.fingeringInfo.hasTizhi && (
  52. <div class={[styles.tizhi, canTizhi && styles.canDisplay]} onClick={() => (fingerData.relationshipIndex = fingerData.relationshipIndex === 0 ? 1 : 0)}>
  53. 替指
  54. </div>
  55. )}
  56. </div>
  57. ) : (
  58. <div onClick={() => doubeClick()} class={[styles.fingeringContainer, styles.vertical, state.fingeringInfo.name, state.fingeringInfo.name === 'hulusi-flute' ? styles.hulusiTop : '']}>
  59. <div class={styles.imgs}>
  60. <img class="driver-7" src={fingerData.subject?.json?.full} />
  61. {rs.map((key: number | string, index: number) => {
  62. const nk: string = typeof key === "string" ? key.replace("active-", "") : String(key);
  63. return <img data-index={nk} src={fingerData.subject?.json?.[nk]} />;
  64. })}
  65. </div>
  66. {state.fingeringInfo.hasTizhi && (
  67. <div style={{ display: state.fingeringInfo.disabledFinger ? "none" : "" }} class={styles.rightContent}>
  68. <div class={[styles.tizhi, canTizhi && styles.canDisplay]} onClick={() => (fingerData.relationshipIndex = fingerData.relationshipIndex === 0 ? 1 : 0)}>
  69. 替指
  70. </div>
  71. </div>
  72. )}
  73. </div>
  74. )}
  75. </>
  76. );
  77. };
  78. },
  79. });