index.tsx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import { computed, defineComponent, ref, watch } from "vue";
  2. import { Switch, Slider } from "vant";
  3. import styles from "./index.module.less"
  4. import { headData } from "../index"
  5. import { headImg } from "../image";
  6. import state, { handleSetSpeed, resetBaseRate } from "../../../state";
  7. import { metronomeData } from "../../../helpers/metronome";
  8. export default defineComponent({
  9. name: "speed",
  10. setup() {
  11. const speed = ref(state.speed);
  12. const minusSpeed = () => {
  13. let canSpeed = Math.max(speed.value - 1, 45);
  14. canSpeed = Math.min(canSpeed, 270);
  15. speed.value = canSpeed;
  16. };
  17. const plusSpeed = () => {
  18. let canSpeed = Math.min(speed.value + 1, 270);
  19. canSpeed = Math.max(canSpeed, 45);
  20. speed.value = canSpeed;
  21. };
  22. // 重置当前小节的速度
  23. const resetCurrentSpeed = () => {
  24. resetBaseRate(state.activeNoteIndex);
  25. };
  26. watch(
  27. () => speed.value,
  28. () => {
  29. // handleSetSpeed(speed.value);
  30. state.speed = Math.floor(speed.value);
  31. }
  32. );
  33. watch(
  34. () => state.speed,
  35. () => {
  36. if (speed.value !== state.speed) {
  37. speed.value = state.speed;
  38. }
  39. }
  40. );
  41. const metronomeDisable = computed({
  42. get(){
  43. return !metronomeData.disable
  44. },
  45. set(val){
  46. metronomeData.disable = !val
  47. }
  48. })
  49. return () => (
  50. <div class={[styles.speedContainer, styles[state.modeType]]}>
  51. <div class={styles.head}>
  52. <img class={styles.headTit} src={headImg("headTit.png")} />
  53. <img class={styles.closeImg} src={headImg("closeImg.png")} onClick={()=>{ headData.speedShow = false }} />
  54. </div>
  55. <div class={styles.content}>
  56. <div class={styles.conBox}>
  57. <div class={styles.tit}>速度</div>
  58. <div class={styles.spendCon}>
  59. <img src={headImg("cutImg.png")} class={[styles.btn]} onClick={minusSpeed} />
  60. <div class={styles.sliderCon}>
  61. <Slider class={styles.slider} max={270} min={speed.value < 45 ? speed.value : 45} v-model={speed.value}>
  62. {{
  63. button: () =>
  64. <div class={styles.customButton}>
  65. <div class={styles.speedVal}>{ Math.floor(speed.value) }</div>
  66. <div class={styles.speedBtn}></div>
  67. </div>
  68. }}
  69. </Slider>
  70. </div>
  71. <img src={headImg("addImg.png")} class={[styles.btn]} onClick={plusSpeed} />
  72. </div>
  73. <div class={styles.speedSel}>
  74. <div onClick={resetCurrentSpeed}>原速</div>
  75. <div onClick={()=>{ speed.value = 70 }}>70</div>
  76. <div onClick={()=>{ speed.value = 80 }}>80</div>
  77. <div onClick={()=>{ speed.value = 90 }}>90</div>
  78. <div onClick={()=>{ speed.value = 100 }}>100</div>
  79. <div onClick={()=>{ speed.value = 110 }}>110</div>
  80. </div>
  81. <div class={styles.metronome}>
  82. <div class={styles.tit}>节拍器</div>
  83. <Switch v-model={metronomeDisable.value}></Switch>
  84. </div>
  85. </div>
  86. </div>
  87. </div>
  88. );
  89. },
  90. });