首页 > 其他分享 >ssts-hospital-web-master项目实战记录八:App.vue组件实现

ssts-hospital-web-master项目实战记录八:App.vue组件实现

时间:2024-02-23 10:11:38浏览次数:28  
标签:web vue ssts value GetTerminalConfig API MainPage1 errormsg 组件

记录时间:2024-02-23

App.vue

<script setup lang="ts"> import { defineComponent, ref, computed, onMounted, onUnmounted } from 'vue' import MainPage1 from '@/views/main-page/main-page1.vue' import MainPage2 from '@/views/main-page/main-page2.vue' import MainPage3 from '@/views/main-page/main-page3.vue' import { clientWebApi, serveWebApi } from './service'
const errormsg = ref('') const mainpage = ref('MainPage1.html') const terminalIp = ref('') const terminalObject = ref() let retryIntervalId = 0 // 用于存储定时器的ID
// 定义获取终端配置的函数 async function GetTerminalConfig() {   try {     terminalIp.value = await clientWebApi('/api/System/GetIpAddress', {})     const terminalResponse = await serveWebApi(       '/api/Terminal/GetTerminalByTerminalIp',       {         terminalIp: terminalIp.value       }     )
    if (terminalResponse != null && terminalResponse.length > 0) {       terminalObject.value = terminalResponse[0]       mainpage.value = terminalResponse[0].MainPageUrl
      errormsg.value = ''       clearInterval(retryIntervalId) // 成功获取后清除定时器     } else {       errormsg.value = `IP地址:${terminalIp.value}设置错误或没有访问权限!`     }   } catch (error) {     errormsg.value = '获取终端配置时发生错误!'   }
  if (errormsg.value != '') {     retryIntervalId = setInterval(GetTerminalConfig, 60000) // 设置每分钟重试一次   } }
// 在组件加载时调用GetTerminalConfig onMounted(GetTerminalConfig)
// 在组件卸载时清除定时器 onUnmounted(() => {   if (retryIntervalId) {     clearInterval(retryIntervalId)   } })
const currentComponent = computed(() => {   switch (mainpage.value) {     case 'MainPage1.html':       return MainPage1     case 'MainPage2.html':       return MainPage2     case 'MainPage3.html':       return MainPage3     default:       return MainPage1   } })
defineComponent({   name: 'App',   components: {     MainPage1,     MainPage2,     MainPage3   },   methods: {     GetTerminalConfig // 将方法暴露给模板或其他方法调用   } }) </script>
<template>   <div>     {{ errormsg }}     <component       :is="currentComponent"       :terminalIp="terminalIp"       :terminalObject="terminalObject"     />   </div> </template>
<style scoped></style>   【使用“文心一言”给出的说明】

说明阶段

以上代码是一个 Vue 3 的单文件组件 (Single File Component, SFC),它定义了一个名为 "App" 的 Vue 组件。这个组件的主要功能是动态加载和显示不同的子页面(MainPage1MainPage2MainPage3),同时负责从后端API获取终端配置信息。组件使用了 Vue 3 的 Composition API 来组织和管理其逻辑。

细节分析阶段

  1. 导入依赖
    • defineComponentrefcomputedonMountedonUnmounted 是从 Vue 库中导入的,用于定义组件、创建响应式数据、计算属性以及处理组件的生命周期钩子。
    • MainPage1MainPage2MainPage3 是子组件的导入,这些组件可能定义了具体的页面内容。
    • clientWebApiserveWebApi 可能是自定义的API调用函数,用于从后端获取数据。
  2. 定义响应式变量
    • errormsg 用于显示错误信息。
    • mainpage 存储当前应显示的主页面名称。
    • terminalIp 存储终端的IP地址。
    • terminalObject 存储从API获取的终端对象信息。
    • retryIntervalId 用于存储定时器的ID,以便在失败后重试。
  3. GetTerminalConfig 函数
    • 这是一个异步函数,用于从后端API获取终端配置信息。
    • 函数内部使用 await 关键字等待 clientWebApi 和 serveWebApi 的异步调用结果。
    • 根据获取的数据更新响应式变量,并设置错误消息。
    • 如果获取成功,则清除重试定时器;如果失败,则设置重试定时器,每分钟尝试一次。
  4. 生命周期钩子
    • onMounted(GetTerminalConfig) 在组件挂载后调用 GetTerminalConfig 函数,尝试获取终端配置。
    • onUnmounted 钩子在组件卸载时清除可能存在的重试定时器。
  5. 计算属性 currentComponent
    • 这是一个计算属性,根据 mainpage 的值动态返回应显示的子组件。
  6. 组件定义
    • 使用 defineComponent 定义组件,并注册组件名称和子组件。
    • methods 中注册了 GetTerminalConfig 函数,使其可以在模板或其他组件逻辑中被调用。
  7. 模板部分
    • 模板中使用了插值表达式 {{ errormsg }} 来显示错误消息。
    • <component :is="currentComponent" ... /> 是动态组件,它的 is 属性绑定到计算属性 currentComponent,这样可以根据条件动态渲染不同的子组件。
    • 动态组件接收 terminalIp 和 terminalObject 作为 props,这些值从组件的响应式变量中传递。

总结阶段

总的来说,这个 Vue 组件通过异步获取后端API的终端配置信息,根据配置动态加载和渲染不同的子页面。组件利用 Vue 3 的 Composition API 来组织和管理状态逻辑,包括响应式数据、计算属性和生命周期钩子。此外,组件还处理了错误情况,并在获取配置失败时设置了重试机制。代码在逻辑上是完整和自洽的,没有明显的逻辑或语法错误。

翻译

搜索

复制

<iframe></iframe>

标签:web,vue,ssts,value,GetTerminalConfig,API,MainPage1,errormsg,组件
From: https://www.cnblogs.com/lizhigang/p/18028837

相关文章

  • ssts-hospital-web-master项目实战记录七:项目迁移-主页及其组成
    记录时间:2024-02-221.主页及其组成(1)index.html->App.vue(2)MainPage*.html->views/main-page/main-page*.vueMainPage1.html->views/main-page/main-page1.vueMainPage2.html->views/main-page/main-page2.vueMainPage3.html->views/main-page/main-page3......
  • 简单了解HTTP、Websocket和Netty
    前言伴随着网络的快速发展,网络通讯越来越重要,通讯的快捷、安全、方便影响着用户的体验。本文将探讨这些技术的原理、特点以及在实际应用中的应用场景。1.HTTTP(超文本传输协议)HTTP是一种传输超文本的协议,它是现代互联网通信的基础。其特点包括:简单性:HTTP使用简单的请求-响应模......
  • vue前端引用Jquery完成复选框多选
    vue2前端引用Jquery完成复选框多选通常我们使用element-ui中el-table的多选模板完成列表的多选,但是有时需要把表格进行拆分,此时仅凭element-ui中的控件可能无法实现拆分后的多选。由于vue是JavaScript的前端框架,所以我考虑使用js来实现。jQuery作为JavaScript的补充和扩展,可以更......
  • Web应用_6. Vue3
    title:(在线学习平台)link:(https://www.acwing.com/)cover:(https://cdn.acwing.com/media/activity/surface/log.png)Vue官网1配置环境1.1终端Linux和Mac上可以用自带的终端。Windows上推荐用powershell或者cmd。GitBash有些指令不兼容。1.2安装Nodejs安装地址1......
  • Vue学习笔记11--事件
    示例一:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Vue事件的基本使用</tit......
  • Vue中的$nextTick有什么作用?
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助一、NextTick是什么官方对其的定义在下次DOM更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的DOM什么意思呢?我们可以理解成,Vue 在更新 DOM 时是异步执行的。当数据发生变化,Vu......
  • C# 采用HttpWebRequest 、WebClient和HttpClient下载https的文件异常问题
    今天有个客户反应,程序下载文件失败,无法正常使用。远程客户电脑后,查看错误日志,都是提示https:****************************.dll等一系列文件的下载错误提示提示基础连接已经关闭:发送时发生错误。在网上找了很多方案都没有能解决,大多都是https链接时增加指定协议,很遗憾未能解......
  • vue3+elment-plus项目,el-diglog的按钮,内部是el-form的子组件,那么保存时,如何触发子组件
    问题:el-diglog的按钮,如何触发内部的form表单提交el-dialog是父组件,cengji是子组件代码如下:<el-dialogv-model="dialogVisible"title="层级结构管理"width="1000"><cengji:tableId="tableId"/><template#footer>......
  • vue2项目 热更新慢解决方案
    问题1构建速度慢问题2每次保存文件,热更新卡94%AssetOptimization这一步上停顿十几秒解决方案一:npmihtml-webpack-plugin-for-multihtml--save-dev文件build/webpack.dev.conf.jsconstHtmlWebpackPlugin=require('html-webpack-plugin')替换为constHtml......
  • Vue学习笔记10--数据代理
    数据代理:通过一个对象代理对另一个对象属性的操作(读或写) 代码如下所示:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0">......