refactor(client): use setup syntax
This commit is contained in:
		
							parent
							
								
									fa6eb0e0f2
								
							
						
					
					
						commit
						47dcb1b41f
					
				
					 1 changed files with 117 additions and 153 deletions
				
			
		|  | @ -16,105 +16,82 @@ | |||
| </div> | ||||
| </template> | ||||
| 
 | ||||
| <script lang="ts"> | ||||
| import { computed, defineAsyncComponent, defineComponent, onMounted, onUnmounted, ref, watch } from 'vue'; | ||||
| <script lang="ts" setup> | ||||
| import { computed, defineAsyncComponent, onMounted, onUnmounted, ref, watch } from 'vue'; | ||||
| import * as os from '@/os'; | ||||
| 
 | ||||
| export default defineComponent({ | ||||
| 	props: { | ||||
| 		modelValue: { | ||||
| 			type: Number, | ||||
| 			required: false, | ||||
| 			default: 0, | ||||
| 		}, | ||||
| 		disabled: { | ||||
| 			type: Boolean, | ||||
| 			required: false, | ||||
| 			default: false, | ||||
| 		}, | ||||
| 		min: { | ||||
| 			type: Number, | ||||
| 			required: false, | ||||
| 			default: 0, | ||||
| 		}, | ||||
| 		max: { | ||||
| 			type: Number, | ||||
| 			required: false, | ||||
| 			default: 100, | ||||
| 		}, | ||||
| 		step: { | ||||
| 			type: Number, | ||||
| 			required: false, | ||||
| 			default: 1, | ||||
| 		}, | ||||
| 		autofocus: { | ||||
| 			type: Boolean, | ||||
| 			required: false, | ||||
| 		}, | ||||
| 		textConverter: { | ||||
| 			type: Function, | ||||
| 			required: false, | ||||
| 			default: (v) => v.toString(), | ||||
| 		}, | ||||
| 	}, | ||||
| const props = withDefaults(defineProps<{ | ||||
| 	modelValue: number; | ||||
| 	disabled?: boolean; | ||||
| 	min: number; | ||||
| 	max: number; | ||||
| 	step?: number; | ||||
| 	textConverter?: (value: number) => string, | ||||
| }>(), { | ||||
| 	step: 1, | ||||
| 	textConverter: (v) => v.toString(), | ||||
| }); | ||||
| 
 | ||||
| 	setup(props, context) { | ||||
| 		const containerEl = ref<HTMLElement>(); | ||||
| 		const thumbEl = ref<HTMLElement>(); | ||||
| const emit = defineEmits<{ | ||||
| 	(ev: 'update:modelValue', value: number): void; | ||||
| }>(); | ||||
| 
 | ||||
| 		const rawValue = ref((props.modelValue - props.min) / (props.max - props.min)); | ||||
| 		const steppedRawValue = computed(() => { | ||||
| const containerEl = ref<HTMLElement>(); | ||||
| const thumbEl = ref<HTMLElement>(); | ||||
| 
 | ||||
| const rawValue = ref((props.modelValue - props.min) / (props.max - props.min)); | ||||
| const steppedRawValue = computed(() => { | ||||
| 	if (props.step) { | ||||
| 		const step = props.step / (props.max - props.min); | ||||
| 		return (step * Math.round(rawValue.value / step)); | ||||
| 	} else { | ||||
| 		return rawValue.value; | ||||
| 	} | ||||
| 		}); | ||||
| 		const finalValue = computed(() => { | ||||
| }); | ||||
| const finalValue = computed(() => { | ||||
| 	if (Number.isInteger(props.step)) { | ||||
| 		return Math.round((steppedRawValue.value * (props.max - props.min)) + props.min); | ||||
| 	} else { | ||||
| 		return (steppedRawValue.value * (props.max - props.min)) + props.min; | ||||
| 	} | ||||
| 		}); | ||||
| }); | ||||
| 
 | ||||
| 		const thumbWidth = computed(() => { | ||||
| const thumbWidth = computed(() => { | ||||
| 	if (thumbEl.value == null) return 0; | ||||
| 	return thumbEl.value!.offsetWidth; | ||||
| 		}); | ||||
| 		const thumbPosition = ref(0); | ||||
| 		const calcThumbPosition = () => { | ||||
| }); | ||||
| const thumbPosition = ref(0); | ||||
| const calcThumbPosition = () => { | ||||
| 	if (containerEl.value == null) { | ||||
| 		thumbPosition.value = 0; | ||||
| 	} else { | ||||
| 		thumbPosition.value = (containerEl.value.offsetWidth - thumbWidth.value) * steppedRawValue.value; | ||||
| 	} | ||||
| 		}; | ||||
| 		watch([steppedRawValue, containerEl], calcThumbPosition); | ||||
| }; | ||||
| watch([steppedRawValue, containerEl], calcThumbPosition); | ||||
| 
 | ||||
| 		let ro: ResizeObserver | undefined; | ||||
| let ro: ResizeObserver | undefined; | ||||
| 
 | ||||
| 		onMounted(() => { | ||||
| onMounted(() => { | ||||
| 	ro = new ResizeObserver((entries, observer) => { | ||||
| 		calcThumbPosition(); | ||||
| 	}); | ||||
| 	ro.observe(containerEl.value); | ||||
| 		}); | ||||
| }); | ||||
| 
 | ||||
| 		onUnmounted(() => { | ||||
| onUnmounted(() => { | ||||
| 	if (ro) ro.disconnect(); | ||||
| 		}); | ||||
| }); | ||||
| 
 | ||||
| 		const steps = computed(() => { | ||||
| const steps = computed(() => { | ||||
| 	if (props.step) { | ||||
| 		return (props.max - props.min) / props.step; | ||||
| 	} else { | ||||
| 		return 0; | ||||
| 	} | ||||
| 		}); | ||||
| }); | ||||
| 
 | ||||
| 		const onMousedown = (ev: MouseEvent | TouchEvent) => { | ||||
| const onMousedown = (ev: MouseEvent | TouchEvent) => { | ||||
| 	ev.preventDefault(); | ||||
| 
 | ||||
| 	const tooltipShowing = ref(true); | ||||
|  | @ -150,7 +127,7 @@ export default defineComponent({ | |||
| 
 | ||||
| 		// 値が変わってたら通知 | ||||
| 		if (beforeValue !== finalValue.value) { | ||||
| 					context.emit('update:modelValue', finalValue.value); | ||||
| 			emit('update:modelValue', finalValue.value); | ||||
| 		} | ||||
| 	}; | ||||
| 
 | ||||
|  | @ -158,20 +135,7 @@ export default defineComponent({ | |||
| 	window.addEventListener('touchmove', onDrag); | ||||
| 	window.addEventListener('mouseup', onMouseup, { once: true }); | ||||
| 	window.addEventListener('touchend', onMouseup, { once: true }); | ||||
| 		}; | ||||
| 
 | ||||
| 		return { | ||||
| 			rawValue, | ||||
| 			finalValue, | ||||
| 			steppedRawValue, | ||||
| 			onMousedown, | ||||
| 			containerEl, | ||||
| 			thumbEl, | ||||
| 			thumbPosition, | ||||
| 			steps, | ||||
| 		}; | ||||
| 	}, | ||||
| }); | ||||
| }; | ||||
| </script> | ||||
| 
 | ||||
| <style lang="scss" scoped> | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue