ssts-hospital-web-master项目实战记录八:App.vue组件实现
记录时间: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 组件。这个组件的主要功能是动态加载和显示不同的子页面(MainPage1
, MainPage2
, MainPage3
),同时负责从后端API获取终端配置信息。组件使用了 Vue 3 的 Composition API 来组织和管理其逻辑。
细节分析阶段
- 导入依赖
defineComponent
,ref
,computed
,onMounted
,onUnmounted
是从 Vue 库中导入的,用于定义组件、创建响应式数据、计算属性以及处理组件的生命周期钩子。MainPage1
,MainPage2
,MainPage3
是子组件的导入,这些组件可能定义了具体的页面内容。clientWebApi
,serveWebApi
可能是自定义的API调用函数,用于从后端获取数据。
- 定义响应式变量
errormsg
用于显示错误信息。mainpage
存储当前应显示的主页面名称。terminalIp
存储终端的IP地址。terminalObject
存储从API获取的终端对象信息。retryIntervalId
用于存储定时器的ID,以便在失败后重试。
GetTerminalConfig
函数- 这是一个异步函数,用于从后端API获取终端配置信息。
- 函数内部使用
await
关键字等待clientWebApi
和serveWebApi
的异步调用结果。 - 根据获取的数据更新响应式变量,并设置错误消息。
- 如果获取成功,则清除重试定时器;如果失败,则设置重试定时器,每分钟尝试一次。
- 生命周期钩子
onMounted(GetTerminalConfig)
在组件挂载后调用GetTerminalConfig
函数,尝试获取终端配置。onUnmounted
钩子在组件卸载时清除可能存在的重试定时器。
- 计算属性
currentComponent
- 这是一个计算属性,根据
mainpage
的值动态返回应显示的子组件。
- 这是一个计算属性,根据
- 组件定义
- 使用
defineComponent
定义组件,并注册组件名称和子组件。 methods
中注册了GetTerminalConfig
函数,使其可以在模板或其他组件逻辑中被调用。
- 使用
- 模板部分
- 模板中使用了插值表达式
{{ errormsg }}
来显示错误消息。 <component :is="currentComponent" ... />
是动态组件,它的is
属性绑定到计算属性currentComponent
,这样可以根据条件动态渲染不同的子组件。- 动态组件接收
terminalIp
和terminalObject
作为 props,这些值从组件的响应式变量中传递。
- 模板中使用了插值表达式
总结阶段
总的来说,这个 Vue 组件通过异步获取后端API的终端配置信息,根据配置动态加载和渲染不同的子页面。组件利用 Vue 3 的 Composition API 来组织和管理状态逻辑,包括响应式数据、计算属性和生命周期钩子。此外,组件还处理了错误情况,并在获取配置失败时设置了重试机制。代码在逻辑上是完整和自洽的,没有明显的逻辑或语法错误。