index.tsx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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. fingerData.subject = await getFingeringConfig(state.fingeringInfo.name);
  16. };
  17. onBeforeMount(() => {
  18. getFingeringData();
  19. });
  20. /** 当前音域 */
  21. const realKey = computed(() => {
  22. return state.times[state.activeNoteIndex]?.realKey || -1;
  23. });
  24. const doubeClick = () => {
  25. const nowTime = Date.now();
  26. if (nowTime - fingerData.delay < 300) {
  27. emit("open");
  28. return;
  29. }
  30. fingerData.delay = nowTime;
  31. };
  32. return () => {
  33. // console.log("音高", realKey.value);
  34. const relationship = fingerData.subject?.relationship?.[realKey.value] || [];
  35. const rs: number[] = Array.isArray(relationship[1])
  36. ? relationship[fingerData.relationshipIndex]
  37. : relationship;
  38. const canTizhi = Array.isArray(relationship[1]);
  39. return (
  40. <>
  41. {state.fingeringInfo.direction === "transverse" ? (
  42. <div onClick={() => doubeClick()} class={[styles.fingeringContainer]}>
  43. <span class={[styles.yidiao, rs.includes(0) && styles.canDisplay]}>转调</span>
  44. <div class={styles.imgs}>
  45. <img 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
  53. class={[styles.tizhi, canTizhi && styles.canDisplay]}
  54. onClick={() =>
  55. (fingerData.relationshipIndex = fingerData.relationshipIndex === 0 ? 1 : 0)
  56. }
  57. >
  58. 替指
  59. </div>
  60. )}
  61. </div>
  62. ) : (
  63. <div
  64. onClick={() => doubeClick()}
  65. class={[styles.fingeringContainer, styles.vertical, state.fingeringInfo.name]}
  66. >
  67. <div class={styles.imgs} style={{ transform: state.fingeringInfo.transform }}>
  68. <img src={fingerData.subject?.json?.full} />
  69. {rs.map((key: number | string, index: number) => {
  70. const nk: string = typeof key === "string" ? key.replace("active-", "") : String(key);
  71. return <img data-index={nk} src={fingerData.subject?.json?.[nk]} />;
  72. })}
  73. </div>
  74. {state.fingeringInfo.hasTizhi && (
  75. <div
  76. style={{ display: state.fingeringInfo.disabledFinger ? "none" : "" }}
  77. class={styles.rightContent}
  78. >
  79. <span class={[styles.yidiao, rs.includes(0) && styles.canDisplay]}>转调</span>
  80. <div
  81. class={[styles.tizhi, canTizhi && styles.canDisplay]}
  82. onClick={() =>
  83. (fingerData.relationshipIndex = fingerData.relationshipIndex === 0 ? 1 : 0)
  84. }
  85. >
  86. 替指
  87. </div>
  88. </div>
  89. )}
  90. </div>
  91. )}
  92. </>
  93. );
  94. };
  95. },
  96. });