refactor(client): use composition api

This commit is contained in:
syuilo 2022-06-22 16:29:31 +09:00
parent a22dc728fb
commit 4f70f4a481

View File

@ -6,49 +6,40 @@
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts" setup>
import { inject, onMounted, onUnmounted, ref } from 'vue';
import { deviceKind } from '@/scripts/device-kind'; import { deviceKind } from '@/scripts/device-kind';
import { defineComponent, inject, onMounted, onUnmounted, ref } from 'vue';
export default defineComponent({ const props = withDefaults(defineProps<{
props: { contentMax?: number | null;
contentMax: { marginMin?: number;
type: Number, marginMax?: number;
required: false, }>(), {
default: null, contentMax: null,
}, marginMin: 12,
marginMin: { marginMax: 24,
type: Number, });
required: false,
default: 12,
},
marginMax: {
type: Number,
required: false,
default: 24,
},
},
setup(props, context) { let ro: ResizeObserver;
let ro: ResizeObserver; let root = $ref<HTMLElement>();
const root = ref<HTMLElement>(); let content = $ref<HTMLElement>();
const content = ref<HTMLElement>(); let margin = $ref(0);
const margin = ref(0); const shouldSpacerMin = inject('shouldSpacerMin', false);
const shouldSpacerMin = inject('shouldSpacerMin', false);
const adjust = (rect: { width: number; height: number; }) => { const adjust = (rect: { width: number; height: number; }) => {
if (shouldSpacerMin || deviceKind === 'smartphone') { if (shouldSpacerMin || deviceKind === 'smartphone') {
margin.value = props.marginMin; margin = props.marginMin;
return; return;
} }
if (rect.width > props.contentMax || (rect.width > 360 && window.innerWidth > 400)) { if (rect.width > (props.contentMax ?? 0) || (rect.width > 360 && window.innerWidth > 400)) {
margin.value = props.marginMax; margin = props.marginMax;
} else { } else {
margin.value = props.marginMin; margin = props.marginMin;
} }
}; };
onMounted(() => { onMounted(() => {
ro = new ResizeObserver((entries) => { ro = new ResizeObserver((entries) => {
/* iOS /* iOS
adjust({ adjust({
@ -57,27 +48,19 @@ export default defineComponent({
}); });
*/ */
adjust({ adjust({
width: root.value!.offsetWidth, width: root!.offsetWidth,
height: root.value!.offsetHeight, height: root!.offsetHeight,
}); });
}); });
ro.observe(root.value!); ro.observe(root!);
if (props.contentMax) { if (props.contentMax) {
content.value!.style.maxWidth = `${props.contentMax}px`; content!.style.maxWidth = `${props.contentMax}px`;
} }
}); });
onUnmounted(() => { onUnmounted(() => {
ro.disconnect(); ro.disconnect();
});
return {
root,
content,
margin,
};
},
}); });
</script> </script>