当前位置: 首页 > article >正文

vue3多个页面/组件,复用同一段render页面根据接口返回的数据动态渲染逻辑,使用setup+组合式API

组件reusableComponent是可供多个组件复用的
getData请求接口,render渲染数据

<template><render />
</template>
<script setup>
import operationService from "@/views/operation/component/operationService.vue";const props = defineProps({name: {type: String,default: "operation"}
});const { name } = toRefs(props);import baffle from "@/hooks/baffle";
import { dpSeatDrapMapList } from "@/api/commonApi";
import {ref,onMounted,nextTick,h,toRefs,getCurrentInstance,withScopeId
} from "vue";
onMounted(() => {nextTick(() => {init();getData();});
});const getData = async () => {let res = await dpSeatDrapMapList({pageSize: "1000",pageNo: "1"});pageData.value = res.result.records;/*返回的示例:{"success":true,"message":"查询成功!","code":200,"result":{"records":[{"drapId":"1888858684486922242","regOper":"admin","updateDate":null,"drapType":"operation","drapAttr":"operation2","regDate":"2025-02-10 15:52:58","drapY":"0","drapW":"12","drapX":"12","drapH":"13","updateOper":null,"drapText":"接通率/服务水平"},,{"drapId":"1888858684486922243","regOper":"admin","updateDate":null,"drapType":"operation","drapAttr":"operation2","regDate":"2025-02-10 15:52:58","drapY":"0","drapW":"12","drapX":"0","drapH":"13","updateOper":null,"drapText":"运营服务总览"},{"drapId":"1889145339345186818","regOper":"","updateDate":null,"drapType":"operation","drapAttr":"operation3","regDate":"2025-02-11 10:52:02","drapY":"0","drapW":"12","drapX":"0","drapH":"15","updateOper":null,"drapText":"今日服务之星"},{"drapId":"1889145340599283714","regOper":"","updateDate":null,"drapType":"operation","drapAttr":"operation3","regDate":"2025-02-11 10:52:02","drapY":"15","drapW":"12","drapX":"0","drapH":"19","updateOper":null,"drapText":"客户情绪意图"},{"drapId":"1889145340611866626","regOper":"","updateDate":null,"drapType":"operation","drapAttr":"operation3","regDate":"2025-02-11 10:52:02","drapY":"15","drapW":"12","drapX":"12","drapH":"19","updateOper":null,"drapText":"客户热词云图"},{"drapId":"1889149440623718401","regOper":"","updateDate":null,"drapType":"operation","drapAttr":"operation3","regDate":"2025-02-11 11:08:20","drapY":"0","drapW":"12","drapX":"12","drapH":"15","updateOper":null,"drapText":"今日客户来电问题TOP5"},{"drapId":"1888770651225862146","regOper":"admin","updateDate":"2025-02-12 16:19:50","drapType":"operation","drapAttr":"operation1","regDate":"2025-02-10 10:03:09","drapY":"8","drapW":"12","drapX":"12","drapH":"11","updateOper":"","drapText":"VIP客户来电详情"},{"drapId":"1888770651263610882","regOper":"admin","updateDate":"2025-02-12 16:20:19","drapType":"operation","drapAttr":"operation1","regDate":"2025-02-10 10:03:09","drapY":"19","drapW":"24","drapX":"0","drapH":"14","updateOper":"","drapText":"外呼数据"},{"drapId":"1888770651192307713","regOper":"admin","updateDate":"2025-02-12 16:20:19","drapType":"operation","drapAttr":"operation1","regDate":"2025-02-10 10:03:09","drapY":"33","drapW":"24","drapX":"0","drapH":"15","updateOper":"","drapText":"三渠道客户等待情况"},{"drapId":"1889925330341277697","regOper":"","updateDate":null,"drapType":"satisfaction","drapAttr":"satisfaction","regDate":"2025-02-13 14:31:26","drapY":"0","drapW":"6","drapX":"0","drapH":"30","updateOper":null,"drapText":"参评率分析"},...更多数据]}}*/// console.table(pageData.value);
};
import { useCommonStore } from "@/store/modules/common";const render = () => {const store = useCommonStore();//接口数据未返回的时候,页面loading,if (!notEmptyArray(pageData.value)) {store.startLoading();console.log("加载中");return h("div", "");} else {//接口数据有了之后,渲染页面//接口数据中drapAttr标识归属于哪个页面,operation2是页面代号,name是父组件传递的要渲染的页面的代号,筛选对应的数据,就是要渲染的组件集合。数据drapText是组件的标识(transObj变量),根据这个来决定组件数组(componentsArray变量)中哪些组件被渲染let pageList = pageData.value.filter(item => {return item.drapAttr && item.drapAttr === name.value;});//初始化空的虚拟节点数组let VNodeList = [];//解析每个模块的宽高 位置并将待渲染的style对象返回,"drapY":"0","drapW":"12","drapX":"12","drapH":"13"分别代表y x width height //因为数据来源页面用了vue-grid-layout,生成的数据都是layout: [//           {"x":0,"y":0,"w":2,"h":2,"i":"0"},//           {"x":2,"y":0,"w":2,"h":4,"i":"1"},//       ],这样的代表位置和宽高,把一个单位的宽高代表的实际长度换算清楚后,渲染到页面上let pageNameSet = new Set(pageList.map(compare));const calcW = w => w * 3.993 + "vw";const calcH = h => h * 1.791 + "vh";const getStyle = name => {let infoArr = pageList.filter(item => {return item.drapText === name;});let infoObj = {};if (notEmptyArray(infoArr)) {infoObj = infoArr[0];}const { drapW, drapH, drapX, drapY } = infoObj;return {width: calcW(drapW),height: calcH(drapH),position: "absolute",left: calcW(drapX),top: calcH(drapY),padding: "5px",boxSizing: "border-box"};};let transObj = {VIPCustomer: "VIP客户来电详情",//...待渲染的页面子组件与接口返回的数据的映射关系}let componentsArray = [VIPCustomer,//...待渲染的页面子组件]//根据接口返回的数据,筛选属于name的pageNameSet后,过滤出属于pageNameSet的组件并返回const getVNode = (name, componentName) => {if (pageNameSet.has(name)) {return h("div",{style: getStyle(name)},[h(componentName, { translateObj: translateObj.value })]);}};//过滤出属于pageNameSet的组件并压入VNodeList虚拟dom数组,待渲染componentsArray.map(item => {if (transObj[item.__name] && getVNode(transObj[item.__name])) {VNodeList.push(getVNode(transObj[item.__name], item));}});//结束页面loadingstore.finishLoading();//使用VNodeList渲染页面return h("div",{ class: "operation1_body operation1" },h("div", { class: "operation1_content" }, VNodeList));}
};
</script>
<style lang="less" >
.operation1_body {margin: 2vh auto 0 !important;// display: grid;width: 95.8vw;// grid-template-columns: 1fr 1fr;// grid-row-gap: 1vh;// grid-column-gap: 1vh;background: #001c5c;
}
.operation1_content {position: relative;width: 100%;height: 100%;
}</style >

父页面使用组件并传name进去渲染指定的页面

<template><div><reusableComponent :name="name" /></div>
</template>
<script setup>
import reusableComponent from "@/components/reusableComponent";
import { ref } from "vue";
const name = ref("sit2");//operation/sit/sit3/sit2/operation1/operation2这些页面可供渲染
</script>
<style lang="less" scoped>
.tbody {margin: 2vh auto 0;display: grid;width: 95.8vw;	background: #001c5c;
}
</style>

相关文章:

vue3多个页面/组件,复用同一段render页面根据接口返回的数据动态渲染逻辑,使用setup+组合式API

组件reusableComponent是可供多个组件复用的 getData请求接口&#xff0c;render渲染数据 <template><render /> </template> <script setup> import operationService from "/views/operation/component/operationService.vue";const prop…...

从零开始:Django初学者的实战之旅

一、概念引入 要基于编程开发一个完整的企业项目不管什么样的项目&#xff0c;基本都有3种不同的开发模式&#xff0c;这几种开发模式&#xff0c;如果把项目类比成建造房子则有如下&#xff1a; 1.原生开发&#xff1a;类似从0开始造房子&#xff0c;从0开始构建项目&#xf…...

青果教务系统逆向(js逆向)

首先我们打开f12检查以下登录函数 可以看到登录函数在checkrand中&#xff0c;直接去全局搜索函数 在这里&#xff0c;打个断点直接跳进去 可以看到参数在这里形成 这是我们发起请求需要的参数&#xff0c;把这几个参数加进去直接登录就行 那就一个一个看呗&#xff0c;第一…...

在Linux中Redis不支持lua脚本的处理方法

redis安装在IP为x.x.x.x的服务器上 redis安装 第一步&#xff0c;安装前&#xff0c;检测系统是否安装了redis。若安装了redis&#xff0c;则需要删除redis&#xff1b;若没有安装redis&#xff0c;则需要安装2.6版本以上的redis。 # 确保Redis版本支持Lua脚本。从Redis 2.6…...

WPF进阶 | 深入 WPF 依赖项属性:理解其强大功能与应用场景

WPF进阶 | 深入 WPF 依赖项属性&#xff1a;理解其强大功能与应用场景 前言一、依赖项属性基础概念1.1 什么是依赖项属性1.2 依赖项属性与 CLR 属性的区别1.3 依赖项属性的定义与注册 二、依赖项属性的原理深入剖析2.1 依赖项属性系统的工作机制2.2 元数据&#xff08;Metadata…...

关于 IoT DC3 中设备(Device)的理解

在物联网系统中&#xff0c;设备&#xff08;Device&#xff09;是一个非常宽泛的概念&#xff0c;它可以指代任何能够接入系统并进行数据交互的实体。包括但不限于手机、电脑、服务器、网关、硬件设备甚至是某些软件程序等所有能接入到该平台的媒介。 内容 定义 目的 示例 …...

从 0 开始本地部署 DeepSeek:详细步骤 + 避坑指南 + 构建可视化(安装在D盘)

个人主页&#xff1a;chian-ocean 前言&#xff1a; 随着人工智能技术的迅速发展&#xff0c;大语言模型在各个行业中得到了广泛应用。DeepSeek 作为一个新兴的 AI 公司&#xff0c;凭借其高效的 AI 模型和开源的优势&#xff0c;吸引了越来越多的开发者和企业关注。为了更好地…...

Uniapp 获取定位详解:从申请Key到实现定位功能

文章目录 前言一、申请定位所需的 Key1.1 注册高德开发者账号1.2 创建应用1.3 添加 Key 二、在 Uniapp 中配置定位功能2.1 引入高德地图 SDK2.2 获取定位权限 三、实现定位功能3.1 使用 uni.getLocation 获取位置3.2 处理定位失败的情况3.3 持续定位3.4 停止持续定位 四、总结 …...

【6】阿里面试题整理

[1]. ThreadLocal原理 ThreadLocal提供了一种线程隔离的机制&#xff0c;使得每个线程拥有自己独立的变量副本。 它的底层实现是ThreadLocalMap&#xff0c;以ThreadLocal对象为键&#xff0c;变量副本为值的键值对。 为了避免内存泄漏&#xff0c;ThreadLocalMap的Key使用了…...

Spring系统学习——持续更新

spring概述 1.轻量级的开源的JAVAEE框架 2.解决企业应用开发的复杂性 3.两大核心 &#xff1a;IOC&#xff08;控制反转&#xff09;和AOP&#xff08;面向切面&#xff09; 4.Spring特点&#xff1a; 1.方便解耦&#xff0c;简化开发。2.Aop编程支持3.方便程序测试4.方便和其…...

【自学笔记】机器学习基础知识点总览-持续更新

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 机器学习重点知识点总览一、机器学习基础概念二、机器学习理论基础三、机器学习算法1. 监督学习2. 无监督学习3. 强化学习 四、机器学习处理流程五、机器学习常见问…...

QT笔记——QRadioButton

文章目录 1、概要2、实际的应用2.1、创建多个QRadioButton,只可同时选中其中一个&#xff0c;点击后实现对应的槽函数 1、概要 实现QRadioButton相关的应用&#xff1b;2、实际的应用 2.1、创建多个QRadioButton,只可同时选中其中一个&#xff0c;点击后实现对应的槽函数 创建…...

微服务面试题:远程调用

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

共享设备管理难?MDM助力Kiosk模式一键部署

目录 1. 简化设备部署与配置&#xff1a;实现一键式部署 2. 自动化应用更新与内容推送&#xff1a;确保设备始终保持最新状态 3. 权限控制与设备安全&#xff1a;防止滥用与数据泄露 4. 远程管理与故障诊断&#xff1a;保障设备长期稳定运行 5. 数据分析与报告&#xff1a…...

C++17 中的 std::reduce:详细教程

文章目录 1. 简介2. 函数签名3. 使用场景3.1 简单的累加操作3.2 自定义归并操作3.3 并行计算的性能优势 4. 注意事项4.1 归并操作的结合律和交换律4.2 默认值的使用 5. 总结 1. 简介 std::reduce 是 C17 标准库中引入的一个算法&#xff0c;用于对范围内的元素进行归并操作。它…...

Navicat导入海量Excel数据到数据库(简易介绍)

目录 前言正文 前言 此处主要作为科普帖进行记录 原先Java处理海量数据的导入时&#xff0c;由于接口超时&#xff0c;数据处理不过来&#xff0c;后续转为Navicat Navicat 是一款功能强大的数据库管理工具&#xff0c;支持多种数据库系统&#xff08;如 MySQL、PostgreSQL、…...

【Map vs Set】:Java数据存储的“双子星”对决

个人主页&#xff1a;♡喜欢做梦 欢迎 &#x1f44d;点赞 ➕关注 ❤️收藏 &#x1f4ac;评论 目录 &#x1f370;一、搜索 &#x1f36e;1.概念 &#x1f36e;2.模型 &#x1f370;二、Map &#x1f368;1.什么是Map&#xff1f; &#x1f368;2.Map的实例化 &…...

储能能量管理监测系统在储能物联网中的应用优势

安科瑞刘鸿鹏 摘要 本文探讨了微电网能量管理系统在现代储能物联网中的应用。随着能源危机和新能源技术的发展&#xff0c;微电网技术成为利用新能源电力的重要方向。微电网能量管理系统通过实时监控、智能预测、协调控制和经济调度等功能&#xff0c;优化能源使用&#xff0…...

用户管理中心--注册登录功能的设计

文章目录 1.定义接口2.注册逻辑的实现2.1引入依赖2.2注册逻辑2.3测试方法 3.登录逻辑的实现3.1接口的定义与实现3.2记录用户的登录态3.3脱敏处理 1.定义接口 在userService这个接口里面定义我们的userRegister方法&#xff0c;表示的是我们的用户的注册的相关的逻辑&#xff1…...

【删除tomcat默认管理控制台】

停止Tomcat&#xff1a; ./catalina.sh stop 删除管理控制台应用&#xff1a; 进入Tomcat的webapps目录&#xff1a; cd /path/to/tomcat/webapps List item 删除manager和host-manager文件夹&#xff1a; rm -rf manager host-manager 启动Tomcat&#xff1a; ./catali…...

Java虚拟机面试题:JVM调优

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

MySQL 插入替换语句(replace into statement)

我们日常使用 insert into 语句向表中插入数据时&#xff0c;一定遇到过主键或唯一索引冲突的情况&#xff0c;MySQL的反应是报错并停止执行后续的语句&#xff0c;而replace into语句可以实现强制插入。 文章目录 一、replace into 语句简介1.1 基本用法1.2 使用set语句 二、注…...

基于单片机的多功能热水器设计(论文+源码)

2.1系统方案设计 基于单片机的多功能热水器系统&#xff0c;其系统框图如图2.1所示。主要采用了DS18B20温度传感器&#xff0c;HC-SR04超声波模块&#xff0c;STC89C52单片机&#xff0c;液晶&#xff0c;继电器等来构成整个系统。硬件上主要通过温度传感器进行水温的检测&…...

DeepSeek R1本地部署 DeepSeek Api接口调用 java go版本

1、本地ollama的API接口 接着上一章所本地部署deepseek&#xff0c;这一章我们调用ollama api 对应的curl&#xff1a; curl --request POST \--url http://localhost:11434/api/generate \--header Accept: */* \--header Accept-Encoding: gzip, deflate, br \--header Con…...

使用python脚本提取html网页上的所有文本信息

你可以使用 BeautifulSoup 库来提取 HTML 网页上的所有文本信息。以下是一个示例脚本&#xff1a; 步骤 安装 beautifulsoup4 和 requests&#xff08;如果尚未安装&#xff09;&#xff1a; pip install beautifulsoup4 requestsPython 脚本&#xff1a; import requests fro…...

基于SSM+uniapp的购药小程序+LW示例参考

1.项目介绍 系统角色&#xff1a;管理员、普通用户功能模块&#xff1a;用户管理、商家管理、药品管理、药品信息管理、发票管理、订单管理、收藏管理、购物车、充值、下单等技术选型&#xff1a;SSM&#xff0c;Vue&#xff08;后端管理web&#xff09;&#xff0c;uniapp等测…...

YOLO11网络结构以及改进1

YOLO11 1.YOLO11网络结构图在哪里&#xff1f;2.对应的网络结构图3.每一个模块详解3.1 Conv模块3.2关于卷积模块3.3 关于给各个模块指定参数的细节 4.加入CBAM 1.YOLO11网络结构图在哪里&#xff1f; 2.对应的网络结构图 3.每一个模块详解 3.1 Conv模块 位置&#xff1a;ultr…...

AI 编程私有化部署,在使用 cline 时,可能无法避免私隐的泄漏问题

摘录&#xff1a;Cline Privacy Policy https://github.com/cline/cline/blob/main/docs/PRIVACY.md Key Points Cline operates entirely client-side as a VS Code extensionNo code or data is collected, stored, or transmitted to Clines servers 问题是&#xff1a…...

计算机视觉-局部特征

一、局部特征 1.1全景拼接 先用RANSAC估计出变换&#xff0c;就可以拼接两张图片 ①提取特征 ②匹配特征 ③拼接图像 1.2 点的特征 怎么找到对应点&#xff1f;&#xff08;才能做点对应关系RANSAC&#xff09; &#xff1a;特征检测 我们希望找到的点具有的特征有什么特…...

数据结构:Map Set(一)

目录 一、搜索树 1、概念 2、查找 3、插入 4、删除 二、搜索 1、概念及场景 2、模型 &#xff08;1&#xff09;纯key模型 &#xff08;2&#xff09;Key-Value模型 三、Map的使用 1、什么是Map&#xff1f; 2、Map的常用方法 &#xff08;1&#xff09;V put(K …...