ssts-hospital-web-master项目实战记录九:父组件App.vue给子组件main-page*.vue传值

记录时间:2024-02-23

一、App.vue

详见:App.vue组件实现 

【使用“文心一言”提取组件传值逻辑说明和代码】

在 Vue 3 中,组件传值通常涉及到 props、emits、slots 和组件的引用。在提供的代码中,主要关注点是动态组件的渲染和通过 props 传递数据。下面是对组件传值逻辑的说明和代码提取:

组件传值逻辑说明

  1. 动态组件渲染:使用 <component :is="currentComponent" /> 来动态渲染组件。currentComponent 是一个计算属性,它根据 mainpage.value 的值返回不同的组件对象。

  2. 数据传递:动态组件通过 props 接收数据。在这个例子中,terminalIp 和 terminalObject 作为 props 被传递给动态组件。

  3. 异步数据获取:在组件挂载时(onMounted 钩子),调用 GetTerminalConfig 函数异步获取终端配置。这个函数从后端 API 获取 IP 地址和终端信息,并更新响应式引用 terminalIp 和 terminalObject

  4. 错误处理和重试机制:如果数据获取失败,会设置一个定时器每分钟重试一次。如果成功获取数据,则清除定时器。

  5. 组件注册:在 defineComponent 中注册了 MainPage1MainPage2 和 MainPage3 组件,这样它们就可以在模板中使用。

提取的代码(仅包含组件传值逻辑)

vue复制代码
  <script setup lang="ts">
  import { 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';
   
  // 定义响应式变量
  const errormsg = ref('');
  const mainpage = ref('MainPage1'); // 直接存储组件对象
  const terminalIp = ref('');
  const terminalObject = ref(null);
   
  // 获取终端配置的函数
  async function GetTerminalConfig() {
  try {
  // 模拟异步获取 IP 地址和终端信息
  terminalIp.value = '192.168.1.1';
  terminalObject.value = { MainPageUrl: 'MainPage1.html' };
   
  // 更新 mainpage.value 以切换组件
  mainpage.value = terminalObject.value.MainPageUrl;
  errormsg.value = '';
  } catch (error) {
  errormsg.value = '获取终端配置时发生错误!';
  }
  }
   
  // 组件挂载后获取终端配置
  onMounted(GetTerminalConfig);
   
  // 计算属性,根据 mainpage.value 返回相应的组件
  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
  },
  setup() {
  // 返回需要在模板中使用的响应式变量和函数
  return {
  errormsg,
  currentComponent,
  terminalIp,
  terminalObject
  };
  }
  });
  </script>
   
  <template>
  <div>
  {{ errormsg }}
  <component
  :is="currentComponent"
  :terminalIp="terminalIp"
  :terminalObject="terminalObject"
  />
  </div>
  </template>

请注意,上述代码已简化并移除了与后端 API 通信的部分,因为实际的 API 调用可能涉及更复杂的逻辑和错误处理。同时,请确保您的后端 API 调用符合您的应用程序的实际需求和后端服务的实现细节。

 

二、main-page*.vue

main-page1.vue

<script setup lang="ts">
import { defineProps } from 'vue'
import Master from '@/views/master/master-basic.vue'
import DeviceControl from '@/views/device-control/ezware-control.vue'
import DataDict from '@/views/data-dict/data-dict.vue'
import Monitor from '@/views/monitor/monitor.vue'
import Camera1 from '@/views/camera/camera1.vue'
import Camera2 from '@/views/camera/camera2.vue'

const { terminalIp, terminalObject } = defineProps({
  terminalIp: {
    type: String,
    required: true
  },
  terminalObject: {
    type: Object,
    required: true
  }
})
</script>

<template>
  <div>
    <title>主页1</title>
    <div v-show="false">
      <!-- 显示 terminalIp -->
      <p>Terminal IP: {{ terminalIp }}</p>
      <hr />
      <!-- 使用 p元素 和 v-for 遍历 terminalObject 的属性并为每个属性创建一个新的行 -->
      <p v-for="(value, key) in terminalObject" :key="key">
        {{ key }}: {{ value }}
      </p>
    </div>
    <!-- 渲染组件 -->
    <Master />
    <DeviceControl />
    <DataDict />
    <Monitor />
    <Camera1 />
    <Camera2 />
  </div>
</template>

<style scoped></style>

 

【使用“文心一言”提取组件传值逻辑说明和代码】

在提供的 Vue 3 <script setup> 代码中,组件传值逻辑主要涉及父组件向子组件传递 props。这里,<script setup> 语法是 Vue 3 中的一个新特性,允许你使用更简洁的方式来编写组件逻辑。下面是组件传值逻辑的说明和代码提取:

组件传值逻辑说明

  1. 定义 Props:使用 defineProps 函数来定义组件接受的 props。在这个例子中,组件接收两个 props:terminalIp(一个字符串)和 terminalObject(一个对象)。这两个 props 都是必需的。

  2. 组件列表:在 components 数组中,列出了所有要在这个模板中动态渲染的组件。

  3. 动态组件渲染:使用 <component :is="..."> 语法来动态渲染组件列表中的组件。:is="component" 表示要渲染的组件是 components 数组中的当前项。

  4. 传递 Props 到动态组件:虽然在这个例子中没有直接显示传递 props 到动态组件,但通常情况下,如果动态组件需要 props,你可以通过类似 :propName="propValue" 的语法来传递。

  5. 在模板中使用 Props:在模板中,terminalIp 和 terminalObject 被用来显示终端的 IP 地址和对象的属性。

提取的代码(仅包含组件传值逻辑)

vue复制代码
  <script setup lang="ts">
  import { defineProps } from 'vue'
   
  // 定义组件接收的 props
  const { terminalIp, terminalObject } = defineProps({
  terminalIp: {
  type: String,
  required: true
  },
  terminalObject: {
  type: Object,
  required: true
  }
  })
  </script>
   
  <template>
  <div>
  <!-- 显示传递进来的 terminalIp -->
  <p>Terminal IP: {{ terminalIp }}</p>
  <hr />
  <!-- 遍历并显示 terminalObject 的属性 -->
  <p v-for="(value, key) in terminalObject" :key="key">
  {{ key }}: {{ value }}
  </p>
  </div>
  </template>
   
  <style scoped></style>

请注意,提取的代码仅包含与组件传值逻辑相关的部分。动态组件渲染的部分 (<component v-for="...">) 由于在这个例子中并没有实际传递 props 到子组件,所以没有在提取的代码中包含。如果有必要传递 props,你需要添加相应的属性绑定语法到动态组件标签上。

在 Vue 3 中,组件传值通常涉及到 props、emits、slots 和组件的引用。在提供的代码中,主要关注点是动态组件的渲染和通过 props 传递数据。下面是对组件传值逻辑的说明和代码提取:

组件传值逻辑说明

  1. 动态组件渲染:使用 <component :is="currentComponent" /> 来动态渲染组件。currentComponent 是一个计算属性,它根据 mainpage.value 的值返回不同的组件对象。

  2. 数据传递:动态组件通过 props 接收数据。在这个例子中,terminalIp 和 terminalObject 作为 props 被传递给动态组件。

  3. 异步数据获取:在组件挂载时(onMounted 钩子),调用 GetTerminalConfig 函数异步获取终端配置。这个函数从后端 API 获取 IP 地址和终端信息,并更新响应式引用 terminalIp 和 terminalObject

  4. 错误处理和重试机制:如果数据获取失败,会设置一个定时器每分钟重试一次。如果成功获取数据,则清除定时器。

  5. 组件注册:在 defineComponent 中注册了 MainPage1MainPage2 和 MainPage3 组件,这样它们就可以在模板中使用。

提取的代码(仅包含组件传值逻辑)

vue复制代码
  <script setup lang="ts">
  import { 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';
   
  // 定义响应式变量
  const errormsg = ref('');
  const mainpage = ref('MainPage1'); // 直接存储组件对象
  const terminalIp = ref('');
  const terminalObject = ref(null);
   
  // 获取终端配置的函数
  async function GetTerminalConfig() {
  try {
  // 模拟异步获取 IP 地址和终端信息
  terminalIp.value = '192.168.1.1';
  terminalObject.value = { MainPageUrl: 'MainPage1.html' };
   
  // 更新 mainpage.value 以切换组件
  mainpage.value = terminalObject.value.MainPageUrl;
  errormsg.value = '';
  } catch (error) {
  errormsg.value = '获取终端配置时发生错误!';
  }
  }
   
  // 组件挂载后获取终端配置
  onMounted(GetTerminalConfig);
   
  // 计算属性,根据 mainpage.value 返回相应的组件
  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
  },
  setup() {
  // 返回需要在模板中使用的响应式变量和函数
  return {
  errormsg,
  currentComponent,
  terminalIp,
  terminalObject
  };
  }
  });
  </script>
   
  <template>
  <div>
  {{ errormsg }}
  <component
  :is="currentComponent"
  :terminalIp="terminalIp"
  :terminalObject="terminalObject"
  />
  </div>
  </template>

请注意,上述代码已简化并移除了与后端 API 通信的部分,因为实际的 API 调用可能涉及更复杂的逻辑和错误处理。同时,请确保您的后端 API 调用符合您的应用程序的实际需求和后端服务的实现细节。

posted @ 2024-02-23 10:20  lizhigang  阅读(16)  评论(0编辑  收藏  举报