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

vue2企业级项目(八)

vue2企业级项目(八)

组件封装(二)

4、searchForm

  • 创建components/searchForm/index.js

    import XSearchForm from "./index.vue";
    export default XSearchForm;
  • 使用案例

    <template><div class="wrap"><h3>基础搜索</h3><div class="box"><x-search-form :columns="columns1" @search="handleSearch"></x-search-form></div><h3>自动布局</h3><div class="box"><x-search-form:columns="columns2"@search="handleSearch":lineNum="4"></x-search-form></div><h3>自定义搜索按钮</h3><div class="box"><x-search-form:columns="columns3":hasSearch="false"@search="handleSearch"ref="search"></x-search-form></div></div>
    </template><script>
    export default {name: "Page7",data() {return {searchLoading: false,resetLoading: false,columns1: [{ type: "input", label: "姓名", prop: "name" },{ type: "input", label: "年龄", prop: "age" },{type: "select",label: "性别",prop: "sex",options: [{ label: "男", value: "1" },{ label: "女", value: "0" },],},],columns2: [{ type: "input", label: "姓名1", prop: "name1" },{ type: "input", label: "姓名2", prop: "name2" },{ type: "input", label: "姓名3", prop: "name3" },{ type: "input", label: "姓名4", prop: "name4" },{ type: "input", label: "姓名5", prop: "name5" },],columns3: [{ type: "input", label: "姓名", prop: "name" },{span: 16,align: "right",render: () => {return (<div><el-button type="success" icon="el-icon-upload">导入</el-button><el-button type="warning" icon="el-icon-download">导出</el-button><el-buttontype="primary"icon="el-icon-search"loading={this.searchLoading}onClick={this.triggerSearch}>搜索</el-button><el-buttonicon="el-icon-refresh"loading={this.resetLoading}onClick={this.triggerReset}>重置</el-button></div>);},},],};},mounted() {},methods: {handleSearch(searchForm, callback) {if (searchForm) {console.log(searchForm);this.$message.success("搜索成功");} else {this.$message.success("重置成功");}setTimeout(() => {callback();this.searchLoading = false;this.resetLoading = false;}, 1000);},triggerSearch() {this.searchLoading = true;this.$refs.search.triggerSearch();},triggerReset() {this.resetLoading = true;this.$refs.search.triggerReset();},},
    };
    </script><style lang="less" scoped>
    .wrap {width: 100%;height: 100%;display: flex;align-items: center;flex-direction: column;
    }.box {width: 800px;height: 200px;padding: 10px;margin-bottom: 20px;background: #1f03034d;
    }
    </style>

5、searchTable

  • 创建components/searchTable/index.js

    import XSearchTable from "./index.vue";
    export default XSearchTable;
  • 创建components/searchTable/index.vue

    <template><div class="x-search-table"><x-search-formv-bind="searchConfig":columns="searchFields"@search="handleSearch"ref="search"></x-search-form><div class="x-search-table-box"><x-tablev-bind="tableConfig":columns="tableFields":api="api":tableData="data"ref="table"></x-table></div></div>
    </template><script>
    /*** @param { Array } columns: 配置* @param { Array } data: 数据* @param { Function } api: 接口* @param { Object } searchForm: search的配置* @param { Object } tableForm: table的配置** @event { Function } getSearchForm: 获取搜索值* @event { Function } setSearchForm: 获取搜索值* @event { function } toggleSelection:设置默认多选* @event { function } setCurrent: 设置单选* @event { function } clearFilter:清空筛选项* @event { function } getSelection: 获取选中结果* @event { function } getTableData: 获取表格值*/export default {name: "XSearchTable",props: {columns: {type: Array,default: () => [],},data: {type: Array,default: () => [],},api: {type: Function,default: null,},searchConfig: {type: Object,default: () => ({}),},tableConfig: {type: Object,default: () => ({}),},},data() {return {searchFields: [],tableFields: [],searchForm: null,};},watch: {columns: {immediate: true,deep: true,handler() {this.handleFields();},},},methods: {handleFields() {this.searchFields = this.columns.map((item) => {let searchItem = { ...item, ...item.search };delete searchItem.form;delete searchItem.table;delete searchItem.search;delete searchItem.dialog;return searchItem;});this.tableFields = this.columns.map((item) => {let tableItem = { ...item, ...item.table };delete tableItem.form;delete tableItem.table;delete tableItem.search;delete tableItem.dialog;return tableItem;});},handleSearch(searchForm, callback) {this.searchForm = searchForm;this.$refs.table.setTableData(searchForm).then(callback);},getSearchForm() {return this.$refs.search.getSearchForm();},setSearchForm(form) {this.$refs.search.setSearchForm(form);},toggleSelection(rows) {this.$refs.table.toggleSelection(rows);},setCurrent(row) {this.$refs.table.setCurrent(row);},clearFilter() {this.$refs.table.clearFilter();},getSelection() {return this.$refs.table.getSelection();},getTableData() {return this.$refs.table.getTableData();},},
    };
    </script><style lang="less" scoped>
    .x-search-table {width: 100%;height: 100%;display: flex;align-items: center;flex-direction: column;.x-search-table-box {width: 100%;flex: 1;}
    }
    </style>
  • 使用案例

    <template><div class="wrap"><!-- 基础搜索 --><h3>基础搜索</h3><div class="box"><x-search-table :columns="columns" :data="data"></x-search-table></div><!-- 接口搜索 --><h3>接口搜索</h3><div class="box"><x-search-table :columns="columns2" :api="getList"></x-search-table></div></div>
    </template><script>
    import { getList } from "@/api/mock.js";export default {name: "Page8",data() {return {columns: [{ type: "input", label: "姓名", prop: "name" },{ type: "input", label: "年龄", prop: "age" },{type: "select",label: "性别",prop: "sex",options: [{ label: "男", value: "1" },{ label: "女", value: "0" },],},{type: "input",label: "地址",prop: "address",search: { isShow: false },},],data: [],columns2: [{ type: "input", label: "姓名", prop: "name" },{ type: "input", label: "年龄", prop: "age" },{type: "select",label: "性别",prop: "sex",options: [{ label: "男", value: "1" },{ label: "女", value: "0" },],},{ label: "日期", prop: "date", props: { valueFormat: "yyyy-MM-DD" } },{type: "input",label: "地址",prop: "address",search: { isShow: false },},],};},created() {this.init();},methods: {getList: getList,init() {let list = new Array(99).fill({});list = list.map((item, index) => {return {name: index > 20 ? `张三${index}` : "张三",age: index.toString(),sex: (index % 2).toString(),address: `北京市朝阳区${index}号`,};});this.data = list;},},
    };
    </script><style lang="less" scoped>
    .wrap {width: 100%;height: 100%;display: flex;align-items: center;flex-direction: column;
    }.box {width: 800px;height: 700px;padding: 10px;margin-bottom: 20px;background: #1f03034d;
    }
    </style>

6、dialogForm

  • 创建components/dialogForm/index.js

    import XSearchTable from "./index.vue";
    export default XSearchTable;
  • 创建components/dialogForm/index.vue

    <template><x-dialogsubmitText="提交":submitLoading="true":title="title"v-bind="dialogConfig"ref="dialog"><x-formlabelWidth="100px"v-bind="formConfig":columns="formFields":defaultValue="defaultForm":ctrl="false"ref="form"></x-form></x-dialog>
    </template><script>
    /*** @param { Array } columns: 配置* @param { String } defaultTitle: 默认标题* @param { String } addTitle: 新增标题* @param { String } editTitle: 编辑标题* @param { Boolean } saveAdd: 是否暂存新增的内容* @param { Object } dialogConfig: dialog的配置* @param { Object } formConfig: form的配置** @event { Function } open: 打开dialogform* @event { Function } triggerSubmit: 手动触发表单校验,校验通过后关闭dialog* @evnet { Function } triggerReset: 手动触发表单重置,完成后关闭dialog**/export default {name: "XDialogForm",props: {columns: {type: Array,default: () => [],},defaultTitle: {type: String,default: "弹框",},addTitle: {type: String,default: "新增",},editTitle: {type: String,default: "编辑",},saveAdd: {type: Boolean,default: false,},dialogConfig: {type: Object,default: () => ({}),},formConfig: {type: Object,default: () => ({}),},},data() {return {title: "",formFields: [],defaultForm: {},handleResolve: null,handleReject: null,handleCallback: null,};},watch: {columns: {immediate: true,deep: true,handler() {this.init();},},},methods: {init() {this.formFields = this.columns.map((item) => {const formItem = { ...item, ...item.dialog };delete formItem.form;delete formItem.table;delete formItem.search;delete formItem.dialog;return formItem;});this.formFields = this.formFields.filter((item) => item.isShow !== false);},open(form) {if (!this.saveAdd || form) {this.defaultForm = form || {};}if (form) this.title = this.editTitle || this.defaultTitle;else this.title = this.addTitle || this.defaultTitle;this.$refs.dialog.open().then((callback) => {this.handleCallback = callback;this.triggerSubmit();}).catch(this.triggerReset.bind(this));return new Promise((resolve, reject) => {this.handleResolve = resolve;this.handleReject = reject;});},triggerSubmit() {this.$refs.form.submit().then(({ form, valid }) => {console.log(form, valid);if (valid) {this.handleResolve(form);this.handleCallback();this.closeBefore();} else {this.handleCallback(false);}}).finally(() => {this.handleCallback = null;});},triggerReset() {if (this.addTitle && this.title === this.addTitle) {this.close();return true;}this.closeBefore();},closeBefore() {this.defaultForm = {};this.$refs.form.reset().then(() => {this.handleReject();this.close();});},close() {this.title = "";this.handleResolve = null;this.handleReject = null;this.handleCallback = null;},},
    };
    </script>
  • 使用案例

    <template><div><el-button type="primary" @click="openDialog()">新增</el-button><el-button type="primary" @click="openDialog(data)">编辑</el-button><x-dialog-form :columns="columns" ref="dialogForm"></x-dialog-form></div>
    </template><script>
    export default {name: "Page9",data() {return {columns: [{ type: "input", label: "用户", prop: "name", required: true },{ type: "input", label: "年龄", prop: "age" },{type: "radio",label: "性别",prop: "sex",options: [{ label: "男", value: "1" },{ label: "女", value: "0" },],},],data: {name: "张三",age: "20",sex: "1",},};},methods: {openDialog(data) {this.$refs.dialogForm.open(data).then((form) => {console.log(form, "------编辑后的值");}).catch(() => {console.log("-----------取消");});},},
    };
    </script>

相关文章:

vue2企业级项目(八)

vue2企业级项目&#xff08;八&#xff09; 组件封装&#xff08;二&#xff09; 4、searchForm 创建components/searchForm/index.js import XSearchForm from "./index.vue"; export default XSearchForm;使用案例 <template><div class"wrap"…...

小研究 - 主动式微服务细粒度弹性缩放算法研究(二)

微服务架构已成为云数据中心的基本服务架构。但目前关于微服务系统弹性缩放的研究大多是基于服务或实例级别的水平缩放&#xff0c;忽略了能够充分利用单台服务器资源的细粒度垂直缩放&#xff0c;从而导致资源浪费。为此&#xff0c;本文设计了主动式微服务细粒度弹性缩放算法…...

【雕爷学编程】Arduino动手做(177)---ESP-32 掌控板

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…...

使用Gunicorn+Nginx部署Flask项目

部署-开发机上的准备工作 确认项目没有bug。用pip freeze > requirements.txt将当前环境的包导出到requirements.txt文件中&#xff0c;方便部署的时候安装。将项目上传到服务器上的/srv目录下。这里以git为例。使用git比其他上传方式&#xff08;比如使用pycharm&#xff…...

【12】STM32·HAL库开发-STM32时钟系统 | F1/F4/F7时钟树 | 配置系统时钟

目录 1.认识时钟树&#xff08;掌握&#xff09;1.1什么是时钟&#xff1f;1.2认识时钟树&#xff08;F1&#xff09;1.2.1STM32F103时钟树简图1.2.2STM32CubeMX时钟树&#xff08;F103&#xff09; 1.3认识时钟树&#xff08;F4&#xff09;1.3.1F407时钟树1.3.2F429时钟树1.3…...

Kotlin基础(十):函数进阶

前言 本文主要讲解kotlin函数&#xff0c;之前系列文章中提到过函数&#xff0c;本文是kotlin函数的进阶内容。 Kotlin文章列表 Kotlin文章列表: 点击此处跳转查看 目录 1.1 函数基本用法 Kotlin 是一种现代的静态类型编程语言&#xff0c;它在函数的定义和使用上有一些特点…...

计算机视觉(四)神经网络与典型的机器学习步骤

文章目录 神经网络生物神经元人工神经元激活函数导数 人工神经网络“层”的通俗理解 前馈神经网络Delta学习规则前馈神经网络的目标函数梯度下降输出层权重改变量 误差方向传播算法误差传播迭代公式简单的BP算例随机梯度下降&#xff08;SGD&#xff09;Mini-batch Gradient De…...

使用easyui的tree组件实现给角色快捷分配权限功能

这篇文章主要介绍怎么实现角色权限的快捷分配功能&#xff0c;不需要像大多数项目的授权一样&#xff0c;使用类似穿梭框的组件来授权。 具体实现&#xff1a;通过菜单树的勾选和取消勾选来给角色分配权限&#xff0c;在这之前&#xff0c;需要得到角色的菜单树&#xff0c;角色…...

Postman打不开/黄屏/一直转圈/Windows

环境背景 内网环境Postman-win64-8.11.1-Setup.exe 问题描述 电脑重启后&#xff0c;打开Postman后&#xff0c;出现加载弹窗&#xff1a;Preparing your workspaces…This might take a few minutes&#xff1b; 等待数分钟后&#xff0c;还是没有反应&#xff0c;于是关闭…...

使用SVM模型完成分类任务

SVM&#xff0c;即支持向量机&#xff08;Support Vector Machine&#xff09;&#xff0c;是一种常见的机器学习算法&#xff0c;用于分类和回归分析。SVM的基本思想是将数据集映射到高维空间中&#xff0c;在该空间中找到一个最优的超平面&#xff0c;将不同类别的数据点分开…...

计算机毕设 深度学习实现行人重识别 - python opencv yolo Reid

文章目录 0 前言1 课题背景2 效果展示3 行人检测4 行人重识别5 其他工具6 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉…...

开发经验分享之:import引入包和@Autowired注入类有什么区别

大家好&#xff0c;我是三叔&#xff0c;很高兴这期又和大家见面了&#xff0c;一个奋斗在互联网的打工人。 import 和 Autowired 想必大家在 Java 开发中使用频率最多的关键字之一了把&#xff0c;这篇博客将解释这两个概念的区别和作用&#xff0c;帮助你更好地理解它们在Ja…...

MySQL和Oracle区别

由于SQL Server不常用&#xff0c;所以这里只针对MySQL数据库和Oracle数据库的区别 (1) 对事务的提交 MySQL默认是自动提交&#xff0c;而Oracle默认不自动提交&#xff0c;需要用户手动提交&#xff0c;需要在写commit;指令或者点击commit按钮 (2) 分页查询 MySQL是直接在SQL…...

QT--day6(人脸识别、图像处理)

人脸识别&#xff1a; /***********************************************************************************头文件****************************************************************************************/#ifndef WIDGET_H #define WIDGET_H#include <QWidget>…...

深度学习:常用优化器Optimizer简介

深度学习&#xff1a;常用优化器Optimizer简介 随机梯度下降SGD带动量的随机梯度下降SGD-MomentumSGDWAdamAdamW 随机梯度下降SGD 梯度下降算法是使权重参数沿着整个训练集的梯度方向下降&#xff0c;但往往深度学习的训练集规模很大&#xff0c;计算整个训练集的梯度需要很大…...

【算法心得】二维dp的状态转移狂练

LCS&#xff1a; LCS变式&#xff1a;使两个字符串变成一样的&#xff0c;删除的和最小 https://leetcode.cn/problems/minimum-ascii-delete-sum-for-two-strings/ 建表 m ∗ n m*n m∗n or ( m 1 ) ∗ ( n 1 ) (m1)*(n1) (m1)∗(n1)&#xff1f; 感觉 ( m 1 ) ∗ ( n …...

JMeter常用内置对象:vars、ctx、prev

在前文 Beanshell Sampler 与 Beanshell 断言 中&#xff0c;初步阐述了JMeter beanshell的使用&#xff0c;接下来归集整理了JMeter beanshell 中常用的内置对象及其使用。 注&#xff1a;示例使用JMeter版本为5.1 1. vars 如 API 文档 所言&#xff0c;这是定义变量的类&a…...

【C++从0到王者】第十四站:list基本使用及其介绍

文章目录 一、list基本介绍二、list基本使用1.尾插头插接口使用2.insert接口使用3.查找某个值所在的位置4.erase接口使用以及迭代器失效5.reverse6.sort7.merge8.unique9.remove11.splice 三、list基本使用完整代码 一、list基本介绍 如下所示&#xff0c;是库里面对list的基本…...

正则表达式、常用的正则

文章目录 正则表达式字符含意义RegExp函数RegExp属性RegExp对象方法RegExp构造函数的第二个参数 常用的正则例子只包含数字&#xff08;包括正数、负数、零&#xff09;只包含中英文数字及键盘上的特殊字符校验密码是否符合规则的正则校验http或者https端口号的正则只校验端口号…...

ST官方基于米尔STM32MP135开发板培训课程(一)

本文将以Myirtech的MYD-YF13X以及STM32MP135F-DK为例&#xff0c;讲解如何使用STM32CubeMX结合Developer package实现最小系统启动。 1.开发准备 1.1 Developer package准备 a.Developer package下载&#xff1a; ‍https://www.st.com/en/embedded-software/stm32mp1dev.ht…...

EB Garamond 12:免费复古字体完整指南,如何优雅应用于网页和印刷设计

EB Garamond 12&#xff1a;免费复古字体完整指南&#xff0c;如何优雅应用于网页和印刷设计 【免费下载链接】EBGaramond12 项目地址: https://gitcode.com/gh_mirrors/eb/EBGaramond12 EB Garamond 12是一款基于16世纪经典设计的开源复古字体&#xff0c;为设计师和开…...

Austroads:速度管理证据与指导回顾(英) 2026

这份报告是澳大利亚和新西兰道路运输委员会&#xff08;Austroads&#xff09;2025 年发布的《车速管理证据与指南回顾》&#xff0c;核心是为更新《道路安全指南&#xff1a;安全车速》&#xff08;AGRS Part 3&#xff09;梳理研究证据、 stakeholder 反馈并给出修订建议。下…...

MicroG终极指南:3步解决华为设备Google服务依赖难题

MicroG终极指南&#xff1a;3步解决华为设备Google服务依赖难题 【免费下载链接】GmsCore Free implementation of Play Services 项目地址: https://gitcode.com/GitHub_Trending/gm/GmsCore 你是否曾为华为设备上无法正常使用Google服务而烦恼&#xff1f;想要享受完整…...

QtScrcpy:将手机屏幕变成电脑扩展屏的终极解决方案

QtScrcpy&#xff1a;将手机屏幕变成电脑扩展屏的终极解决方案 【免费下载链接】QtScrcpy Android实时投屏软件&#xff0c;此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限 项目地址: https://gitcode.com/barry-ran/QtScrcpy …...

3分钟搞定Figma中文界面:设计师必备的终极汉化方案

3分钟搞定Figma中文界面&#xff1a;设计师必备的终极汉化方案 【免费下载链接】figmaCN 中文 Figma 插件&#xff0c;设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 面对Figma满屏的英文界面感到困扰吗&#xff1f;专业术语看不懂、操作按钮…...

TVA 在宠物混合监护场景中的创新应用(1)

重磅预告&#xff1a;本专栏将独家连载新书《智能体视觉技术与应用》&#xff08;系列丛书&#xff09;部分精华内容&#xff0c;该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著&#xff0c;特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。…...

MoviePilot批量重命名:5步解决NAS媒体库命名混乱问题

MoviePilot批量重命名&#xff1a;5步解决NAS媒体库命名混乱问题 【免费下载链接】MoviePilot NAS媒体库自动化管理工具 项目地址: https://gitcode.com/gh_mirrors/mo/MoviePilot 你是否曾为NAS中杂乱无章的媒体文件名而烦恼&#xff1f;"Avengers.Endgame.2019.1…...

Unity实战:利用TriLib插件实现运行时动态加载外部3D模型

1. TriLib插件基础入门 第一次接触TriLib插件时&#xff0c;我也被它强大的功能惊艳到了。这个插件最大的价值在于&#xff0c;它能让我们在Unity运行时动态加载各种主流3D模型格式&#xff0c;比如FBX、OBJ、GLTF等&#xff0c;而不需要提前在编辑器中导入。想象一下&#xff…...

从零开始在个人项目中接入Taotoken的完整步骤与体会

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 从零开始在个人项目中接入Taotoken的完整步骤与体会 最近在维护一个个人开发的智能写作助手项目&#xff0c;最初直接使用了某家模…...

从架构到应用:DNNGP、DeepGS与DLGWAS三大基因预测模型深度剖析

1. 基因预测模型的崛起与挑战 基因组学研究正在经历一场由AI驱动的革命。过去十年间&#xff0c;随着高通量测序技术的普及&#xff0c;生物医学领域积累了海量的基因数据&#xff0c;但传统统计方法在处理复杂性状预测时逐渐显得力不从心。正是在这样的背景下&#xff0c;DNNG…...