You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Vue Script Setup中调用simple-vue-camera的snapshot方法

解决Vue Script Setup中获取simple-vue-camera组件并调用snapshot方法的问题

在Vue Script Setup语法中,无法通过this.$refs访问组件引用,需要使用Vue提供的ref()函数创建响应式引用来绑定组件。以下是修改后的完整代码,适配Script Setup语法:

<template>
    <q-dialog ref="dialogRef" @hide="onDialogHide">
        <q-card class="column q-dialog-plugin">
            <div class="colunm">
                <ModalBar :icon="'mdi-camera'" :title="$t('global.camera')" class="col" @close="onCancelClick" />
                <q-separator />
                <div>
                    <!-- 将ref绑定到cameraRef变量 -->
                    <camera v-if="!fotoTirada" ref="cameraRef" :resolution="{ width: 400, height: 400 }" autoplay></camera>
                    <img v-else :src="imageUrl" />
                </div>
                <q-separator />
                <q-card-actions class="flex justify-between">
                    <q-btn color="secondary-2" label="Cancelar" @click="onDialogHide" />
                    <div>
                        <q-btn v-if="!fotoTirada" color="primary" label="Capturar" @click="takeSnapshot" />
                        <q-btn v-if="fotoTirada" label="Tirar outra foto" @click="fotoTirada = false" />
                        <q-btn v-if="fotoTirada" color="primary" label="Salvar" @click="onOKClick(imageUrl)" />
                    </div>
                </q-card-actions>
            </div>
        </q-card>
    </q-dialog>
</template>

<script setup>
import Camera from "simple-vue-camera";
import { ref } from "vue";
import { useDialogPluginComponent } from 'quasar'
import ModalBar from "components/ModalBar.vue";

// 创建组件引用
const cameraRef = ref(null);
// 声明响应式变量替代原data选项
const imageUrl = ref(null);
const fotoTirada = ref(false);

// Quasar对话框插件逻辑
const { dialogRef, onDialogHide, onDialogOK, onDialogCancel } = useDialogPluginComponent();

// 定义方法,直接在Script Setup中声明
const onOKClick = (imageUrl) => {
    onDialogOK(imageUrl);
};

const onCancelClick = onDialogCancel;

const takeSnapshot = async () => {
    // 通过.value访问ref绑定的组件实例
    if (!cameraRef.value) return;
    const blob = await cameraRef.value.snapshot({ width: 400, height: 400 });
    imageUrl.value = URL.createObjectURL(blob);
    const formData = new FormData();
    formData.append("file", blob);
    fotoTirada.value = true;
};
</script>

关键修改点:

  • 导入ref函数,创建cameraRef用于绑定模板中的Camera组件
  • 模板中Camera组件的ref属性值改为cameraRef,与Script Setup中定义的变量名对应
  • 在takeSnapshot方法中,通过cameraRef.value获取组件实例,调用其snapshot方法
  • 原data选项中的响应式变量直接用ref()创建,原methods中的方法直接在Script Setup中声明
  • 保持Quasar对话框插件的逻辑不变,直接解构使用

内容的提问来源于stack exchange,提问作者vapdev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 14:07:41