index.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. setup(props, { expose }) {
  8. const fingerData = reactive({
  9. relationshipIndex: 0,
  10. subject: null as unknown as ITypeFingering,
  11. });
  12. const getFingeringData = async () => {
  13. fingerData.subject = await getFingeringConfig(state.fingeringInfo.name);
  14. };
  15. onBeforeMount(() => {
  16. getFingeringData();
  17. });
  18. /** 当前音域 */
  19. const realKey = computed(() => {
  20. return state.times[state.activeNoteIndex]?.realKey || -1;
  21. });
  22. return () => {
  23. const relationship = fingerData.subject?.relationship?.[realKey.value] || [];
  24. const rs: number[] = Array.isArray(relationship[1]) ? relationship[fingerData.relationshipIndex] : relationship;
  25. const canTizhi = Array.isArray(relationship[1]);
  26. return (
  27. <>
  28. {state.fingeringInfo.direction === "transverse" ? (
  29. <div class={[styles.fingeringContainer]}>
  30. <span class={[styles.yidiao, rs.includes(0) && styles.canDisplay]}>转调</span>
  31. <div class={styles.imgs}>
  32. <img src={fingerData.subject?.json?.full} />
  33. {rs.map((key: number | string, index: number) => {
  34. const nk: string = typeof key === "string" ? key.replace("active-", "") : String(key);
  35. return <img data-index={nk} src={fingerData.subject?.json?.[nk]} />;
  36. })}
  37. </div>
  38. <div
  39. class={[styles.tizhi, canTizhi && styles.canDisplay]}
  40. onClick={() => (fingerData.relationshipIndex = fingerData.relationshipIndex === 0 ? 1 : 0)}
  41. >
  42. 替指
  43. </div>
  44. </div>
  45. ) : (
  46. <div class={[styles.fingeringContainer, styles.vertical]}>
  47. <div class={styles.imgs}>
  48. <img src={fingerData.subject?.json?.full} />
  49. {rs.map((key: number | string, index: number) => {
  50. const nk: string = typeof key === "string" ? key.replace("active-", "") : String(key);
  51. return <img data-index={nk} src={fingerData.subject?.json?.[nk]} />;
  52. })}
  53. </div>
  54. <div class={styles.rightContent}>
  55. <span class={[styles.yidiao, rs.includes(0) && styles.canDisplay]}>转调</span>
  56. <div
  57. class={[styles.tizhi, canTizhi && styles.canDisplay]}
  58. onClick={() => (fingerData.relationshipIndex = fingerData.relationshipIndex === 0 ? 1 : 0)}
  59. >
  60. 替指
  61. </div>
  62. </div>
  63. </div>
  64. )}
  65. </>
  66. );
  67. };
  68. },
  69. });