父组件:

 1 <template>
2 <div class="auto-wrap">
3 <div class="content-left">
4
5 <el-form :model="addReportForm" label-width="120px">
6 <el-form-item label="内容">
7 <el-button type="success" @click="selectReport" :icon="Plus" size="default">增加</el-button>
8 </el-form-item>
9 </el-form>
10 </div>
11 </div>
12 <!-- 新增报表-弹窗 -->
13 <AddReportDialog v-model:showDialog="addReportForm.showDialog" @confirmAddReport="confirmAddReport" />
14 </template>
15
16 <script setup lang="ts">
17 import { ref, reactive, onMounted, nextTick } from 'vue';
18 import { ElButton, ElDialog, ElForm, ElFormItem } from 'element-plus';
19 import { Plus, Search } from '@element-plus/icons-vue';
20 import AddReportDialog from './AddReportDialog.vue';
21 // 左侧新增节点表单
22 const addReportForm = reactive({
23 showDialog: false
24 });
25 function selectReport() {
26 addReportForm.showDialog = true;
27 };
28 function confirmAddReport(newNodes) {
29 addReportForm.tableData = [...addReportForm.tableData, ...newNodes];
30 };
31 </script>

子组件:

  1 <template>
2 <el-dialog v-model="showDialog" :title="$t('report.select')+$t('report.reportModule')"
3 width="640px" :close-on-click-modal="false" @click="closeAddReportForm">
4 <div class="tree-wrap flex-col" v-loading="addReportDialogForm.treeLoading">
5 <div class="flex-col" v-show="addReportDialogForm.treeNodeData.length">
6 <input id="searchKey" class="form-control mb-8" type="text" :placeholder="$t('general.searchKeyWord')" />
7 <ul id="reportDialogTree" class="ztree sec-module-ztree" role="menu"></ul>
8 </div>
9 <el-empty v-show="!addReportDialogForm.treeNodeData.length" class="flex-1" :image-size="120"></el-empty>
10 </div>
11 <template #footer>
12 <span class="dialog-footer">
13 <el-button type="primary" @click="confirmAddReportForm">{{$t('config.ok')}}</el-button>
14 <el-button @click="closeAddReportForm">{{$t('config.close')}}</el-button>
15 </span>
16 </template>
17 </el-dialog>
18 </template>
19
20 <script setup lang="ts">
21 import { reactive, computed, watch, nextTick } from 'vue';
22 import { ElMessage } from 'element-plus';
23 import { fuzzySearch } from '@/common/libs/ztree/fuzzySearch.js';
24 import * as api from './api';
25 const $t = $.t;
26 const props = defineProps({
27 showDialog: {
28 type: Boolean,
29 default: false,
30 },
31 });
32 const emit = defineEmits(['update:showDialog', 'confirmAddReport']);
33 const showDialog = computed({
34 get: () => props.showDialog,
35 set: (val) => {
36 emit('update:showDialog', val);
37 }
38 });
39 const addReportDialogForm = reactive({
40 treeObj: null,
41 treeLoading: false,
42 treeNodeData: [],
43 });
44 watch(
45 ( ) => props.showDialog,
46 ( ) => {
47 nextTick(async () => {
48 showTreeLoading();
49 await initReportTree();
50 hideTreeLoading();
51 });
52 },
53 { deep: true, immediate: true },
54 );
55 function showTreeLoading() {
56 addReportDialogForm.treeLoading = true;
57 };
58 function hideTreeLoading() {
59 addReportDialogForm.treeLoading = false;
60 };
61 // 初始化-系统报告树
62 async function initReportTree() {
63 try {
64 const data = await api.dailyReportZtree();
65 const nodes = [ {
66 id: 0,
67 parentId: null,
68 name: $t('general.predefine'),
69 reportType: 'Node',
70 iconSkin: 'Node',
71 remark: 'Y',
72 isParent: true,
73 }, {
74 id: -1,
75 parentId: null,
76 name: $t('general.custom1'),
77 reportType: 'Node',
78 iconSkin: 'Node',
79 isParent: true,
80 }];
81 data?.object.inside.forEach(node => {
82 if (node.reportType === 'Node') {
83 node.iconSkin = 'Node';
84 } else {
85 node.icon = `${__ctx}/static/skin/images/chart/${node.reportType}.svg`;
86 }
87 });
88 data?.object.user.forEach((userNode) => {
89 if (userNode.reportType === 'Node') {
90 userNode.iconSkin = 'Node';
91 } else {
92 userNode.icon = `${__ctx}/static/skin/images/chart/${userNode.reportType}.svg`;
93 }
94 });
95 if(data?.object && data?.object.inside.length > 0 && data?.object.user.length > 0) {
96 addReportDialogForm.treeNodeData = [...data?.object.inside, ...data?.object.user, ...nodes];
97 initZtree();
98 };
99 } catch (err) {
100 console.log(`[log]: initAssetTree -> err`, err);
101 }
102 };
103 // 初始化 zTree
104 function initZtree() {
105 let data = addReportDialogForm.treeNodeData;
106 if (!_.isArray(data) || _.isEmpty(data)) {
107 data = [];
108 };
109 const setting = {
110 view: {
111 selectedMulti: true,
112 showIcon: true,
113 },
114 check: {
115 enable: true,
116 chkStyle: 'checkbox',
117 radioType: 'all',
118 chkboxType: { 'Y': 's', 'N': 'ps' },
119 },
120 data: {
121 simpleData: {
122 enable: true,
123 idKey: 'id',
124 pIdKey: 'parentId',
125 rootPId: 0,
126 },
127 },
128 };
129 const treeObj = $.fn.zTree.init($('#reportDialogTree'), setting, data);
130 if (treeObj.getNodes().length >= 1) {
131 treeObj.expandNode(treeObj.getNodes()[0], true);
132 };
133 if (treeObj.getNodes().length >= 2) {
134 treeObj.expandNode(treeObj.getNodes()[1], true);
135 };
136 // 添加模糊搜索
137 fuzzySearch('reportDialogTree', '#searchKey', {
138 highlight: true,
139 expand: true,
140 });
141 return treeObj;
142 };
143 // 确认
144 function confirmAddReportForm() {
145 addReportDialogForm.treeObj = $.fn.zTree.getZTreeObj('reportDialogTree');
146 var nodes = addReportDialogForm.treeObj.getCheckedNodes(true);
147 nodes = _.filter(nodes, (v) => v.reportType !== 'Node');
148 let newNodes = nodes.map((item: {id: number, name: string, desc: string}) => ({
149 id: item.id,
150 title: item.name,
151 desc: '',
152 }));
153 if(newNodes.length > 50) {
154 ElMessage.warning($t('report.addReportTip'));
155 newNodes = newNodes.splice(0, 50);
156 };
157 addReportDialogForm.treeObj?.destroy?.();
158 addReportDialogForm.treeObj = null;
159 showDialog.value = false;
160 emit('confirmAddReport', newNodes);
161 };
162 function closeAddReportForm() {
163 addReportDialogForm.treeObj?.destroy?.();
164 addReportDialogForm.treeObj = null;
165 showDialog.value = false;
166 };
167 </script>

vue3组件el-dialog提取的更多相关文章

  1. 开箱即用 yyg-cli(脚手架工具):快速创建 vue3 组件库和vue3 全家桶项目

    1 yyg-cli 是什么 yyg-cli 是优雅哥开发的快速创建 vue3 项目的脚手架.在 npm 上发布了两个月,11月1日进行了大升级,发布 1.1.0 版本:支持创建 vue3 全家桶项目和 ...

  2. Vite+TS带你搭建一个属于自己的Vue3组件库

    theme: nico 前言 随着前端技术的发展,业界涌现出了许多的UI组件库.例如我们熟知的ElementUI,Vant,AntDesign等等.但是作为一个前端开发者,你知道一个UI组件库是如何被 ...

  3. 从0搭建Vue3组件库:button组件

    button组件几乎是每个组件库都有的:其实实现一个button组件是很简单的.本篇文章将带你一步一步的实现一个button组件.如果你想了解完整的组件库搭建,你可以先看使用Vite和TypeScri ...

  4. 从0搭建vue3组件库:Shake抖动组件

    先看下效果 其实就是个抖动效果组件,实现起来也非常简单.之所以做这样一个组件是为了后面写Form表单的时候会用到它做一个规则校验,比如下面一个简单的登录页面,当点击登录会提示用户哪个信息没输入,当然这 ...

  5. 从0搭建vue3组件库: 如何完整搭建一个前端脚手架?

    相信大家在前端开发中都使用过很多前端脚手架,如vue-cli,create-vite,create-vue等:本篇文章将会为大家详细介绍这些前端脚手架是如何实现的,并且从零实现一个create-kit ...

  6. 从0搭建vue3组件库:自动化发布、管理版本号、生成 changelog、tag

    今天看到一篇文章中提到了一个好用的工具release-it.刚好可以用在我正在开发的vue3组件库.纸上得来终觉浅,绝知此事要躬行,说干就干,下面就介绍如何将release-it应用到实际项目中,让组 ...

  7. 从0搭建vue3组件库: Input组件

    本篇文章将为我们的组件库添加一个新成员:Input组件.其中Input组件要实现的功能有: 基础用法 禁用状态 尺寸大小 输入长度 可清空 密码框 带Icon的输入框 文本域 自适应文本高度的文本域 ...

  8. 从0搭建Vue3组件库(二):Monorepo项目搭建

    本篇文章是从0搭建Vue3组件库系列文章第二篇,本篇文章将带领大家使用pnpm搭建一个简单的Monorepo项目,并完成包的关联与测试 什么是 Monorepo 其实很简单,就是一个代码库里包含很多的 ...

  9. 从0搭建Vue3组件库(三): 组件库的环境配置

    本篇文章将在项目中引入 typescript,以及手动搭建一个用于测试组件库组件 Vue3 项目 因为我们是使用 Vite+Ts 开发的是 Vue3 组件库,所以我们需要安装 typescript.v ...

  10. 从0搭建Vue3组件库(六):前端流程化控制工具gulp的使用

    前言 随着前端诸如webpack,rollup,vite的发展,gulp感觉似乎好像被取代了.其实并没有,只不过它从台前退居到了幕后.我们仍然可以在很多项目中看到它的身影,比如elementplus. ...

随机推荐

  1. C++ 共享内存ShellCode跨进程传输

    在计算机安全领域,ShellCode是一段用于利用系统漏洞或执行特定任务的机器码.为了增加攻击的难度,研究人员经常探索新的传递ShellCode的方式.本文介绍了一种使用共享内存的方法,通过该方法,两 ...

  2. VMware安装虚拟机详细步骤

    在VMware中安装CentOS7 01.目录 CentOS7的下载 CentOS7的配置 CentOS7的安装 CentOS7的网络配置 自动获取IP 固定获取IP 02.安装前提 准备工作: 提前 ...

  3. jextract的使用

    写这个博客的目的:新人去看jextract的官网是看不懂的,就算看懂了也不会使用,一头雾水,我会从0开始教如何使用,如何搭配java去调用c函数. 首先我们得了解jextract是什么,官网的解释是一 ...

  4. Reformer 模型 - 突破语言建模的极限

    Reformer 如何在不到 8GB 的内存上训练 50 万个词元 Kitaev.Kaiser 等人于 20202 年引入的 Reformer 模型 是迄今为止长序列建模领域内存效率最高的 trans ...

  5. JavaImprove--Lesson01--枚举类,泛型

    一.枚举 认识枚举类 枚举是一种特殊的类 枚举的格式: 修饰符  enmu   枚举类名{ 名称1,名称2: 其它成员 } //枚举类 public enum A { //枚举类的第一列必须是罗列枚举 ...

  6. hutool的常用方法

    https://www.hutool.cn/docs/#/ 官方文档 Hutool 是一个 Java 开发工具包,提供了丰富实用的工具类,包括字符串处理.日期处理.文件操作.加密解密.网络请求等等.以 ...

  7. 手动实现BERT

      本文重点介绍了如何从零训练一个BERT模型的过程,包括整体上BERT模型架构.数据集如何做预处理.MASK替换策略.训练模型和保存.加载模型和测试等. 一.BERT架构   BERT设计初衷是作为 ...

  8. 斐波那契数Fibonacci

    509. 斐波那契数 斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列.该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0,   F(1) = ...

  9. 玩转Sermant开发,开发者能力机制解析

    本文分享自华为云社区<开发者能力机制解析,玩转Sermant开发>,作者:华为云开源 . 前言: 在<Sermant框架下的服务治理插件快速开发及使用指南>中带大家一起体验了S ...

  10. HTTP请求转发那些事:你可能不知道的Hop-by-hop Headers和End-to-end Headers

    摘要:不是所有的web容器都能帮助开发者屏蔽hop-by-hop headers,有些容器反而允许开发者自定义hop-by-hop headers来实现更大程度的灵活性. 本文分享自华为云社区< ...