index.tsx 4.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. import { evaluatingData } from "/src/view/evaluating";
  6. import { followData } from "/src/view/follow-practice/index"
  7. export default defineComponent({
  8. name: "fingering",
  9. emits: ["open"],
  10. setup(props, { emit, expose }) {
  11. const fingerData = reactive({
  12. relationshipIndex: 0,
  13. subject: null as unknown as ITypeFingering,
  14. delay: 0,
  15. });
  16. const getFingeringData = async () => {
  17. // 葫芦丝的指法,云教练页面和听音练习页面,展示的不一样,需要区分
  18. const source = state.fingeringInfo.name === 'hulusi-flute' ? 'musicDetail' : '';
  19. fingerData.subject = await getFingeringConfig(state.fingeringInfo.name, source);
  20. console.log("🚀 ~ fingerData.subject:", fingerData.subject);
  21. };
  22. onBeforeMount(() => {
  23. getFingeringData();
  24. });
  25. /** 当前音域 */
  26. const realKey = computed(() => {
  27. return state.times[state.activeNoteIndex]?.realKey || -1;
  28. });
  29. // 竖笛、陶笛,云教练的乐器图片不需要正面两个字
  30. const specialBgFinger = computed(() => {
  31. const list: any = ['baroque-recorder', 'piccolo', 'ocarina', 'whistling']
  32. return list.includes(state.fingeringInfo.name);
  33. });
  34. const doubeClick = () => {
  35. // 管乐迷没有乐器指法页面,暂时不需要双击跳转
  36. return;
  37. const nowTime = Date.now();
  38. if (nowTime - fingerData.delay < 300) {
  39. emit("open");
  40. return;
  41. }
  42. fingerData.delay = nowTime;
  43. };
  44. expose({
  45. doubeClick
  46. })
  47. return () => {
  48. // console.log("音高", realKey.value);
  49. const relationship = fingerData.subject?.relationship?.[realKey.value] || [];
  50. const rs: number[] = Array.isArray(relationship[1]) ? relationship[fingerData.relationshipIndex] : relationship;
  51. const canTizhi = Array.isArray(relationship[1]);
  52. return (
  53. <>
  54. {state.fingeringInfo.direction === "transverse" ? (
  55. <div onClick={() => doubeClick()} class={[styles.fingeringContainer]}>
  56. <div class={[styles.imgs, state.fingeringInfo.name === 'trombone' && styles.speImgs]}>
  57. <img class="driver-7" src={fingerData.subject?.json?.full} />
  58. {rs.map((key: number | string, index: number) => {
  59. const nk: string = typeof key === "string" ? key.replace("active-", "") : String(key);
  60. return <img data-index={nk} src={fingerData.subject?.json?.[nk]} />;
  61. })}
  62. </div>
  63. {state.fingeringInfo.hasTizhi && (
  64. <div class={[styles.tizhi, styles.transTizhi, canTizhi && styles.canDisplay]} onClick={() => (fingerData.relationshipIndex = fingerData.relationshipIndex === 0 ? 1 : 0)}>
  65. 替指
  66. </div>
  67. )}
  68. </div>
  69. ) : (
  70. <div onClick={() => doubeClick()} class={[styles.fingeringContainer, styles.vertical, state.fingeringInfo.name, state.fingeringInfo.name === 'hulusi-flute' ? styles.hulusiTop : '']}>
  71. <div class={styles.imgs}>
  72. <img class="driver-7" src={specialBgFinger.value ? fingerData.subject?.json?.fullSpe : fingerData.subject?.json?.full} />
  73. {rs.map((key: number | string, index: number) => {
  74. const nk: string = typeof key === "string" ? key.replace("active-", "") : String(key);
  75. return <img data-index={nk} src={fingerData.subject?.json?.[nk]} />;
  76. })}
  77. </div>
  78. {state.fingeringInfo.hasTizhi && (
  79. <div style={{ display: state.fingeringInfo.disabledFinger ? "none" : "" }} class={styles.rightContent}>
  80. <div class={[styles.tizhi, canTizhi && styles.canDisplay]} onClick={() => (fingerData.relationshipIndex = fingerData.relationshipIndex === 0 ? 1 : 0)}>
  81. 替指
  82. </div>
  83. </div>
  84. )}
  85. </div>
  86. )}
  87. </>
  88. );
  89. };
  90. },
  91. });