speed.tsx 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. import { defineComponent, reactive, ref, toRefs, watch } from 'vue'
  2. import { Button, Slider } from 'vant'
  3. import classnames from 'classnames'
  4. import detailState from '/src/pages/detail/state'
  5. import styles from './speed.module.less'
  6. import iconMinus from './icons/icon-minus.svg'
  7. import iconPlus from './icons/icon-plus.svg'
  8. import iconresetMinus from './icons/icon-resetMinus.svg'
  9. import runtime, * as RuntimeUtils from '/src/pages/detail/runtime'
  10. const state = reactive({
  11. speed: 90,
  12. showHint: false,
  13. maxSpeed: 315,
  14. firstExceedEcho: false, // 第一次超出速度范围,显示的速度默认不回退到270或者45
  15. })
  16. export default defineComponent({
  17. name: 'speed',
  18. props: {
  19. changed: {
  20. type: Function,
  21. default: (speed: number) => {},
  22. },
  23. updateSpeed: {
  24. type: Function,
  25. default: (speed: number) => {},
  26. },
  27. mode: {
  28. type: String,
  29. },
  30. changeMode: {
  31. type: Function,
  32. default: (val: string) => {},
  33. },
  34. lib: {
  35. type: Object,
  36. },
  37. },
  38. setup(props) {
  39. const { lib } = toRefs(props)
  40. state.speed = lib.value?.speed
  41. const onDragStart = () => {
  42. state.showHint = true
  43. }
  44. const onDragEnd = () => {
  45. state.showHint = false
  46. }
  47. const changeSpeed = (speed: number) => {
  48. state.speed = speed
  49. props.changed(state.speed)
  50. }
  51. const updateSpeed = (speed: number) => {
  52. state.speed = speed
  53. if (state.firstExceedEcho) {
  54. state.speed = Math.min(state.speed, 270)
  55. state.speed = Math.max(state.speed, 45)
  56. }
  57. if (!state.firstExceedEcho) state.firstExceedEcho = true
  58. props.updateSpeed(state.speed)
  59. }
  60. const minusSpeed = () => {
  61. state.speed = Math.max(state.speed - 1, 45)
  62. state.speed = Math.min(state.speed, 270)
  63. props.changed(state.speed)
  64. }
  65. const plusSpeed = () => {
  66. state.speed = Math.min(state.speed + 1, 270)
  67. props.changed(state.speed)
  68. }
  69. watch(
  70. () => runtime.speed,
  71. (val) => {
  72. if (val) {
  73. state.maxSpeed = runtime.speed > 270 ? runtime.speed + 45 : 315;
  74. //console.log('速度123456',state.maxSpeed,runtime.speed,runtime.playIngSpeed)
  75. }
  76. },
  77. { immediate: true }
  78. )
  79. return () => (
  80. <div class={styles['speed-change']}>
  81. <div class={styles.speed}>
  82. {/* <span>速度</span> */}
  83. <div>
  84. <Button
  85. color="#01C1B5"
  86. icon={iconPlus}
  87. type="primary"
  88. size="mini"
  89. round
  90. disabled={state.speed >= 270}
  91. onClick={plusSpeed}
  92. />
  93. <Slider
  94. class={styles.slider}
  95. max={runtime.playIngSpeed > 270 ? runtime.playIngSpeed : 270}
  96. min={45}
  97. barHeight="3px"
  98. buttonSize="18px"
  99. modelValue={state.maxSpeed - state.speed}
  100. onUpdate:modelValue={(speed: number) => {
  101. const currentSpeed = (runtime.playIngSpeed > 270 ? runtime.playIngSpeed + 45 : state.maxSpeed) - speed
  102. // console.log('速度123',state.maxSpeed,speed,runtime.playIngSpeed,runtime.speed,'设置的:',currentSpeed)
  103. updateSpeed(currentSpeed)
  104. }}
  105. step="1"
  106. vertical
  107. activeColor="#ebedf0"
  108. onChange={(speed: number) => changeSpeed(state.maxSpeed - speed)}
  109. onDragStart={onDragStart}
  110. onDragEnd={onDragEnd}
  111. vSlots={{
  112. button: () => (
  113. <div class={styles['custom-button']}>
  114. <span>{state.speed}</span>
  115. <div class={classnames(styles.title)}>
  116. <span class={styles.strong}>{state.speed}</span>
  117. </div>
  118. </div>
  119. ),
  120. }}
  121. />
  122. <Button
  123. class={styles.min}
  124. color="#01C1B5"
  125. icon={iconMinus}
  126. type="primary"
  127. size="mini"
  128. round
  129. disabled={state.speed <= 45}
  130. onClick={minusSpeed}
  131. />
  132. <Button
  133. class={styles.reset}
  134. color="#01C1B5"
  135. icon={iconresetMinus}
  136. type="primary"
  137. size="mini"
  138. round
  139. onClick={() => {
  140. const currentItem: any = detailState.times[runtime.activeIndex];
  141. const currentSpeed = currentItem?.measureSpeed ? currentItem.measureSpeed : detailState.baseSpeed;
  142. changeSpeed(currentSpeed)
  143. }}
  144. />
  145. </div>
  146. </div>
  147. </div>
  148. )
  149. },
  150. methods: {
  151. resetSpeed() {
  152. state.speed = this.lib?.speed
  153. this.changed(this.lib?.speed)
  154. },
  155. refUpdateSpeed(speed: number) {
  156. state.speed = speed
  157. this.updateSpeed(state.speed)
  158. },
  159. },
  160. })