index.tsx 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. console.log("🚀 ~ fingerData.subject:", fingerData.subject);
  17. };
  18. onBeforeMount(() => {
  19. getFingeringData();
  20. });
  21. /** 当前音域 */
  22. const realKey = computed(() => {
  23. return state.times[state.activeNoteIndex]?.realKey || -1;
  24. });
  25. const doubeClick = () => {
  26. const nowTime = Date.now();
  27. if (nowTime - fingerData.delay < 300) {
  28. emit("open");
  29. return;
  30. }
  31. fingerData.delay = nowTime;
  32. };
  33. return () => {
  34. // console.log("音高", realKey.value);
  35. const relationship = fingerData.subject?.relationship?.[realKey.value] || [];
  36. const rs: number[] = Array.isArray(relationship[1]) ? relationship[fingerData.relationshipIndex] : relationship;
  37. const canTizhi = Array.isArray(relationship[1]);
  38. return (
  39. <>
  40. {state.fingeringInfo.direction === "transverse" ? (
  41. <div onClick={() => doubeClick()} class={[styles.fingeringContainer]}>
  42. <div class={styles.imgs}>
  43. <img class="driver-7" src={fingerData.subject?.json?.full} />
  44. {rs.map((key: number | string, index: number) => {
  45. const nk: string = typeof key === "string" ? key.replace("active-", "") : String(key);
  46. return <img data-index={nk} src={fingerData.subject?.json?.[nk]} />;
  47. })}
  48. </div>
  49. {state.fingeringInfo.hasTizhi && (
  50. <div class={[styles.tizhi, canTizhi && styles.canDisplay]} onClick={() => (fingerData.relationshipIndex = fingerData.relationshipIndex === 0 ? 1 : 0)}>
  51. 替指
  52. </div>
  53. )}
  54. </div>
  55. ) : (
  56. <div onClick={() => doubeClick()} class={[styles.fingeringContainer, styles.vertical, state.fingeringInfo.name]}>
  57. <div class={styles.imgs}>
  58. <img class="driver-7" src={fingerData.subject?.json?.full} />
  59. {rs.map((key: number | string, index: number) => {
  60. const nk: string = typeof key === "string" ? key.replace("active-", "") : String(key);
  61. return <img data-index={nk} src={fingerData.subject?.json?.[nk]} />;
  62. })}
  63. </div>
  64. {state.fingeringInfo.hasTizhi && (
  65. <div style={{ display: state.fingeringInfo.disabledFinger ? "none" : "" }} class={styles.rightContent}>
  66. <div class={[styles.tizhi, canTizhi && styles.canDisplay]} onClick={() => (fingerData.relationshipIndex = fingerData.relationshipIndex === 0 ? 1 : 0)}>
  67. 替指
  68. </div>
  69. </div>
  70. )}
  71. </div>
  72. )}
  73. </>
  74. );
  75. };
  76. },
  77. });