|
|
@@ -22,12 +22,12 @@ const url = defineModel('url', { default: '' });
|
|
|
|
|
|
const support = ref(false);
|
|
|
|
|
|
-const dialog = useFile({ multiple: false, accept: 'image/*', reset: true });
|
|
|
+let dialog = useFile({ multiple: false, accept: 'image/*', reset: true });
|
|
|
|
|
|
const onTrigger = () => {
|
|
|
if (props.disabled) return;
|
|
|
if (url.value) emits('delete', url.value);
|
|
|
- else if (support.value) onTake({ capture: 'user' });
|
|
|
+ else if (support.value) onTake({ capture: 'user' }, true);
|
|
|
};
|
|
|
|
|
|
const onClick = (event: PointerEvent) => {
|
|
|
@@ -36,8 +36,11 @@ const onClick = (event: PointerEvent) => {
|
|
|
else onTake();
|
|
|
};
|
|
|
|
|
|
-const onTake = async (options?: UseFileDialogOptions) => {
|
|
|
- let file = await dialog.open(options);
|
|
|
+const onTake = async (options?: UseFileDialogOptions, clear = false) => {
|
|
|
+ let file;
|
|
|
+ try { file = await dialog.open(options); } catch { return; } finally {
|
|
|
+ if (clear) dialog = useFile({ multiple: false, accept: 'image/*', reset: true });
|
|
|
+ }
|
|
|
try {
|
|
|
loading.value = true;
|
|
|
url.value = (await props.update?.(file)) ?? URL.createObjectURL(file);
|
|
|
@@ -80,7 +83,7 @@ tryOnUnmounted(() => {
|
|
|
<img class="size-full object-cover" v-if="url" :src="url" alt="" />
|
|
|
<template v-else>
|
|
|
<van-icon class="text-primary" name="photo-o" :size="50" />
|
|
|
- <div class="text-sm mt-2 text-gray-300">
|
|
|
+ <div class="text-sm mt-2 text-gray-300 select-none">
|
|
|
<span>点击上传</span>
|
|
|
<span v-if="support"> 或 长按拍摄</span>
|
|
|
</div>
|