58 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Vue
		
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Vue
		
	
	
| <template>
 | |
|   <el-dialog :title="title" :model-value="visible && model === 'dialog'" @update:model-value="visible = false">
 | |
|     <slot></slot>
 | |
|     <div class="tc mt-20 mb-20">
 | |
|       <img :src="src" alt="" width="200" height="200" />
 | |
|     </div>
 | |
|     <template #footer>
 | |
|       <slot name="footer"></slot>
 | |
|     </template>
 | |
|   </el-dialog>
 | |
|   <div v-if="model === 'normal'">
 | |
|     <div class="tc mt-20 mb-20">
 | |
|       <img :src="src" alt="" width="200" height="200" />
 | |
|     </div>
 | |
|   </div>
 | |
| </template>
 | |
| 
 | |
| <script setup>
 | |
| import { useQRCode } from "@vueuse/integrations/useQRCode";
 | |
| import { ElDialog } from "element-plus";
 | |
| import "element-plus/es/components/dialog/style/css";
 | |
| 
 | |
| defineOptions({
 | |
|   name: "AppQrCode",
 | |
| });
 | |
| 
 | |
| const props = defineProps({
 | |
|   src: { type: String, required: true, default: "" },
 | |
|   title: { type: String, default: "二维码" },
 | |
|   model: {
 | |
|     type: String,
 | |
|     validator: (value) => {
 | |
|       const typeList = ["dialog", "normal"];
 | |
|       if (typeList.includes(value)) {
 | |
|         return true;
 | |
|       } else {
 | |
|         throw new Error(`model必须是${typeList.join("、")}之一`);
 | |
|       }
 | |
|     },
 | |
|     default: "dialog",
 | |
|   },
 | |
| });
 | |
| const visible = defineModel("visible", {
 | |
|   type: Boolean,
 | |
|   required: false,
 | |
|   default: false,
 | |
| });
 | |
| 
 | |
| const src = useQRCode(() => props.src, {
 | |
|   width: 200,
 | |
|   height: 200,
 | |
|   margin: 1,
 | |
|   correctLevel: "H",
 | |
| });
 | |
| </script>
 | |
| 
 | |
| <style scoped lang="scss"></style>
 |