展示框选择

好的,非常感谢您提供更详细的项目情况。这是一个非常典型的父子组件通信场景。

根据您的新需求,我将对代码进行重构:

  1. FaultSelect.vue (子组件): 这个组件现在将变得更加“纯粹”。它只负责自身的下拉框逻辑,不关心外部按钮,并通过 props 接收可见性状态,通过 emits 将选择结果通知父组件。
  2. ParentComponent.vue (父组件): 这个组件将管理应用的状态,包括按钮、下拉框的可见性以及展示由子组件传递上来的数据。

这样的结构使得组件职责单一,更易于维护和复用,完全符合大型项目的开发规范。


1. 子组件: FaultSelect.vue

这个组件现在只包含下拉框。它接收一个 visible 属性来控制显示,并通过 update:selectedOrder 事件将选中的完整对象发送出去。

<template><div v-if="visible" class="fault-select-container"><el-selectv-model="selectedOrderId"placeholder="请选择故障工单"class="fault-select"filterable@change="handleSelectionChange"><el-optionv-for="order in faultOrders":key="order.cm_order_id":label="order.cm_order_id":value="order.cm_order_id"/></el-select></div>
</template><script setup>
import { ref, onMounted } from 'vue';
import { ElMessage } from 'element-plus';// --- Props & Emits 定义 ---/*** @description* defineProps 用于接收父组件传递的属性。* 'visible': 控制此组件的显示/隐藏。*/
const props = defineProps({visible: {type: Boolean,required: true,default: false,},
});/*** @description* defineEmits 用于声明该组件会触发哪些自定义事件。* 'update:selectedOrder': 当用户选择一个选项时触发,将选中的完整工单对象传递给父组件。*/
const emit = defineEmits(['update:selectedOrder']);// --- 响应式状态 ---/*** @description 存储从后台获取的故障工单列表* @type {import('vue').Ref<Array<{cm_order_id: string, data: string}>>}*/
const faultOrders = ref([]);/*** @description 存储当前选中的故障工单ID。它的状态会在组件隐藏时被保留。* @type {import('vue').Ref<string | null>}*/
const selectedOrderId = ref(null);// --- 方法 ---/*** @description 模拟从后台异步获取故障数据*/
const fetchFaultOrders = async () => {try {// 模拟1秒网络延迟await new Promise(resolve => setTimeout(resolve, 1000));// 模拟成功返回的数据const mockData = [{ cm_order_id: 'CM-20250708-0000047', data: '故障详情47: 核心模块温度过高...' },{ cm_order_id: 'CM-20250708-0000021', data: '故障详情21: 通信总线错误...' },{ cm_order_id: 'CM-20250708-0000025', data: '故障详情25: 主电源电压异常...' },];faultOrders.value = mockData;} catch (error) {ElMessage.error('获取故障数据失败!');console.error(error);}
};/*** @description 当下拉框选项变化时触发* @param {string} selectedId - 当前选中的 cm_order_id*/
const handleSelectionChange = (selectedId) => {// 从列表中找到完整的工单对象const selectedOrderObject = faultOrders.value.find((order) => order.cm_order_id === selectedId);// 如果找到了,就通过 emit 事件将其发送给父组件if (selectedOrderObject) {emit('update:selectedOrder', selectedOrderObject);}
};// --- 生命周期钩子 ---onMounted(() => {// 组件挂载后立即获取数据,为用户点击“修复故障”做好准备fetchFaultOrders();
});
</script><style scoped>
/*将组件定位在右上角。父容器需要有 position: relative;
*/
.fault-select-container {position: absolute;top: 20px;right: 20px;z-index: 1000;background-color: #fff;padding: 10px;border-radius: 8px;box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}.fault-select {width: 260px;
}
</style>

2. 父组件: ParentComponent.vue (示例)

这个父组件包含了控制按钮,并负责调用子组件和处理子组件传回的数据。

<template><div class="parent-container"><div class="main-content"><h1>地图/主监控页面</h1><div v-if="currentFault" class="fault-display-panel"><h3>故障详情: {{ currentFault.cm_order_id }}</h3><pre>{{ currentFault.data }}</pre></div></div><div class="control-panel"><el-button type="primary" @click="openFaultRepair">修复故障</el-button><el-button @click="closeFaultRepair">故障恢复</el-button></div><FaultSelect:visible="isDropdownVisible"@update:selectedOrder="showData"/></div>
</template><script setup>
import { ref } from 'vue';
// 引入子组件
import FaultSelect from '../components/FaultSelect.vue';// --- 状态定义 ---/*** @description 控制 FaultSelect 子组件是否可见* @type {import('vue').Ref<boolean>}*/
const isDropdownVisible = ref(false);/*** @description 存储从子组件接收到的当前故障工单对象* @type {import('vue').Ref<{cm_order_id: string, data: string} | null>}*/
const currentFault = ref(null);// --- 方法定义 ---/*** @description 点击“修复故障”按钮时调用,显示下拉框*/
const openFaultRepair = () => {isDropdownVisible.value = true;
};/*** @description 点击“故障恢复”按钮时调用,隐藏下拉框*/
const closeFaultRepair = () => {isDropdownVisible.value = false;
};/*** @description* 这是传递给子组件的回调方法。当子组件触发 'update:selectedOrder' 事件时,此方法被调用。* @param {{cm_order_id: string, data: string}} selectedOrder - 子组件传递过来的完整工单对象*/
const showData = (selectedOrder) => {console.log('从子组件接收到数据:', selectedOrder);currentFault.value = selectedOrder;// 在这里可以执行更多操作,例如在地图上高亮显示故障位置等
};
</script><style scoped>
/* 父容器需要相对定位,以便子组件的绝对定位生效 */
.parent-container {position: relative;width: 100%;height: 100vh;background-color: #f0f2f5;
}.main-content {padding: 20px;
}/* 将控制按钮固定在右上角,子组件会显示在其下方或附近 */
.control-panel {position: absolute;top: 20px;right: 320px; /* 调整位置,给下拉框留出空间 */z-index: 1001; /* 比下拉框高一级,确保按钮可点 */
}.fault-display-panel {margin-top: 20px;padding: 20px;border-radius: 8px;background-color: #fff;border: 1px solid #ebeef5;width: 400px;
}.fault-display-panel h3 {margin: 0 0 10px 0;
}.fault-display-panel pre {white-space: pre-wrap;word-wrap: break-word;background-color: #f9f9f9;padding: 10px;border-radius: 4px;
}
</style>

总结与优势

这种重构方式是 Vue 开发中的标准实践:

  • 单一职责原则: FaultSelect 只管下拉框,ParentComponent 只管业务流程和状态。
  • 单向数据流: 父组件通过 props 将状态(visible)向下传递给子组件。
  • 事件驱动: 子组件通过 emits 将用户操作的结果(selectedOrder)向上传递给父组件。
  • 高内聚,低耦合: 两个组件之间的依赖性清晰明了,FaultSelect 可以在项目的其他地方被轻松复用。
  • 状态保持: selectedOrderId 状态保留在子组件内部,当父组件再次设置 :visible="true" 时,子组件会自然地显示上次选中的值。同时,父组件的 currentFault 也保留了上次选择的数据,实现了完整的状态记忆。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/923597.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/923597.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第5课:上下文管理与状态持久化

第5课:上下文管理与状态持久化 课程目标 掌握上下文存储和检索策略 学习会话状态管理 了解数据持久化方案 实践实现上下文管理系统 课程内容 5.1 上下文管理基础 什么是上下文管理? 上下文管理是Agent系统中维护和利用历史信息的能力,包括: 对话历史:用户与Agent的交互…

计算机毕业设计 基于大数据技术的医疗数据分析与研究 Python 大数据毕业设计 Hadoop毕业设计选题【附源码+文档报告+安装调试】

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python、大数据、人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&…

K8S集群管理(2)

目录 1.什么是Pod的根容器&#xff1f; 2.解释Pod的生命周期。 3.Init类型容器有什么特点&#xff0c;主要用途&#xff1f; 4.Sidecar类型容器和Init容器的区别在哪&#xff1f; 5.什么是静态Pod&#xff1f; 6.说明K8s控制器的作用&#xff1f; 7.什么是ReplicaSet&#xff0…

视频全模态referring分割:Ref-AVS: Refer and Segment Objects in Audio-Visual Scenes

一、TL&#xff1b;DR 为什么要做&#xff1a;传统的referring分割无法使用音频模态&#xff0c;本文提出Reference audio-visual Segmentation本文怎么做&#xff1a;构建首个 Ref-AVS 基准数据集通过充分利用多模态提示&#xff0c;将音频信息通过和文本融合作为载体&#x…

A股大盘数据-20250916分析

&#x1f4ca; 一、大盘数据深度分析1.1 &#x1f9ee; 市场活跃度与资金流向总成交额&#xff1a;沪深京合计约 2.37万亿元&#xff0c;市场交投活跃&#xff0c;深市成交&#xff08;13516.4亿&#xff09;明显高于沪市&#xff08;9897.9亿&#xff09;&#xff0c;显示中小…

[计算机毕业设计]基于深度学习的噪声过滤音频优化系统研究

前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投…

贪心算法应用:NFV功能部署问题详解

Java中的贪心算法应用&#xff1a;NFV功能部署问题详解 1. NFV功能部署问题概述 网络功能虚拟化(NFV, Network Function Virtualization)是一种将传统网络设备功能从专用硬件转移到虚拟化软件的技术。在NFV功能部署问题中&#xff0c;我们需要将各种虚拟网络功能(VNFs)部署到有…

SeriLog测试

安装Serilog.Sinks.Seq(5.2.3.0)&#xff0c;Serilog.Sinks.File(7.0.0) 下载Seq安装包并安装&#xff08;https://datalust.co/download&#xff09; 代码如下&#xff1a; private Logger _logger;private void button1_Click(object sender, EventArgs e){_logger new Lo…

HarmonyOS 5.0应用开发——V2装饰器@param的使用

【高心星出品】 文章目录V2装饰器param的使用概念使用方法案例V2装饰器param的使用 概念 在鸿蒙ArkTS开发中&#xff0c;Param装饰器是组件间状态管理的重要工具&#xff0c;主要用于父子组件间的单向数据传递&#xff0c;这一点与V1中的prop类似。 Param装饰的变量支持本地…

SLAM | 无人机视觉/激光雷达集群SLAM技术进展综述

主要内容如下: 无人机集群SLAM技术概述:介绍无人机集群SLAM的基本概念、重要性及面临的挑战,使用表格对比不同传感器配置的特点。 多传感器融合与协同SLAM架构:分析集中式、分布式和混合式协同架构的特点,使用表格对比不同架构的优缺点。 视觉协同SLAM的技术进展:总结直接…

信息化系统运维文档资料,运维服务方案,运维巡检方案

1、系统服务内容​1.1 服务目标​1.2 信息资产统计服务​1.3 网络与安全系统运维服务​1.4 主机与存储系统运维服务​1.5 数据库系统运维服务​1.6 中间件运维服务​2、服务管理制度规范​2.1 服务时间管理​2.2 运维人员行为规范​2.3 现场服务支持规范​2.4 问题记录与归档规…

JavaScript——document对象

DOM 是 document object model&#xff08;文档对象模型&#xff09;的缩写。它是一种与平台、语言无关的接口&#xff0c;允许程序动态地访问或更新 HTML、XML 文档的内容、结构和样式&#xff0c;且提供了一系列的函数和对象来实现增、删、改、查操作。DOM 对象的一个特点是&…

UART,IIC,SPI总线(通信协议)

嵌 入 式 软 件 笔 试 题要求&#xff1a;闭卷考试&#xff08;不能翻书、不能开电脑&#xff09;&#xff1b;作答时间50分钟&#xff1b;共10道题目。volatile的作用有哪些volatile&#xff1a; 防止编译器对代码进行优化&#xff0c;直接从内存中取最新的值 应用场景&#x…

通信模组性能调优

通信模组性能调优 1 背景 2 高通平台软硬加速 2.1 NSS 2.2 SFE 2.3 PPE 3 CPU 负载均衡设置 3.1 启用内核 RPS&RFS 功能 3.2 网卡队列修改建议 3.3 调整负载前后的 CPU 使用对比 3.4 网卡中断均衡 3.4.1 netdev_max_backlog 3.4.2 中断绑核 3.5 CPU性能模式 3.6 热管理 3.7…

消息队列kafka的事务特性

kafka的java客户端producer也支持事务消息吗&#xff1f;具体是啥事务呢&#xff1f; 是的&#xff0c;Kafka的Java客户端Producer确实支持事务消息。让我详细解释Kafka事务的概念和使用方法。 Kafka事务的主要特点&#xff1a; Producer Transactions&#xff1a;确保多个消息…

用Python实现自动化的Web测试(Selenium)

Python作为数据科学和自动化领域的主流语言&#xff0c;在网络爬虫开发中占据着重要地位。本文将全面介绍Python爬虫的技术栈、实现方法和最佳实践。爬虫技术概述网络爬虫&#xff08;Web Crawler&#xff09;是一种按照特定规则自动抓取互联网信息的程序。它可以自动化地浏览网…

「Memene 摸鱼日报 2025.9.17」上海张江人工智能创新小镇正式启动,华为 DCP 技术获网络顶会奖项

theme: condensed-night-purple 以下内容包括「人工智能生成内容」 上海张江人工智能创新小镇正式启动&#xff0c;华为 DCP 技术获网络顶会奖项 &#x1f44f;在昨天&#xff08;2025.9.16&#xff09;&#xff0c;AI领域有这些内容可能值得你关注&#xff1a; 上海张江人工智…

Vehiclehal的VehicleService.cpp

VehicleService.cpp 是 Android Automotive OS 中负责车辆相关功能的核心服务组件&#xff0c;主要处理车身信息获取及状态设置接口&#xff0c;通过 HIDL&#xff08;Hardware Interface Definition Language&#xff09;接口与系统框架层交互。 ‌12核心功能VehicleService.c…

《LINUX系统编程》笔记p11

公共资源也称为共享资源&#xff0c;是指可以被多个并发进程或线程共同访问&#xff08;读取或写入&#xff09;的系统资源。临界资源是公共资源的一个子集。特指那些一次仅允许一个进程或线程访问的公共资源。如果一个进程正在使用它&#xff0c;其他试图访问该资源的进程必须…

spring-kafka消费异常处理

默认的消费异常处理 默认情况下&#xff0c;如果程序没有显式做任何的异常处理&#xff0c;spring-kafka会提供一个默认的DefaultErrorHandler, 它会使用FixedBackOff做重试&#xff0c;会不间断的连续重试最多9次&#xff0c;也就是说一个消息最多会被消费10次。如果重试次数耗…