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企业级项目(八) 组件封装(二) 4、searchForm 创建components/searchForm/index.js import XSearchForm from "./index.vue"; export default XSearchForm;使用案例 <template><div class"wrap"…...

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

【雕爷学编程】Arduino动手做(177)---ESP-32 掌控板
37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…...

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

【12】STM32·HAL库开发-STM32时钟系统 | F1/F4/F7时钟树 | 配置系统时钟
目录 1.认识时钟树(掌握)1.1什么是时钟?1.2认识时钟树(F1)1.2.1STM32F103时钟树简图1.2.2STM32CubeMX时钟树(F103) 1.3认识时钟树(F4)1.3.1F407时钟树1.3.2F429时钟树1.3…...

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

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

使用easyui的tree组件实现给角色快捷分配权限功能
这篇文章主要介绍怎么实现角色权限的快捷分配功能,不需要像大多数项目的授权一样,使用类似穿梭框的组件来授权。 具体实现:通过菜单树的勾选和取消勾选来给角色分配权限,在这之前,需要得到角色的菜单树,角色…...
Postman打不开/黄屏/一直转圈/Windows
环境背景 内网环境Postman-win64-8.11.1-Setup.exe 问题描述 电脑重启后,打开Postman后,出现加载弹窗:Preparing your workspaces…This might take a few minutes; 等待数分钟后,还是没有反应,于是关闭…...

使用SVM模型完成分类任务
SVM,即支持向量机(Support Vector Machine),是一种常见的机器学习算法,用于分类和回归分析。SVM的基本思想是将数据集映射到高维空间中,在该空间中找到一个最优的超平面,将不同类别的数据点分开…...

计算机毕设 深度学习实现行人重识别 - python opencv yolo Reid
文章目录 0 前言1 课题背景2 效果展示3 行人检测4 行人重识别5 其他工具6 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉…...
开发经验分享之:import引入包和@Autowired注入类有什么区别
大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。 import 和 Autowired 想必大家在 Java 开发中使用频率最多的关键字之一了把,这篇博客将解释这两个概念的区别和作用,帮助你更好地理解它们在Ja…...

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

QT--day6(人脸识别、图像处理)
人脸识别: /***********************************************************************************头文件****************************************************************************************/#ifndef WIDGET_H #define WIDGET_H#include <QWidget>…...

深度学习:常用优化器Optimizer简介
深度学习:常用优化器Optimizer简介 随机梯度下降SGD带动量的随机梯度下降SGD-MomentumSGDWAdamAdamW 随机梯度下降SGD 梯度下降算法是使权重参数沿着整个训练集的梯度方向下降,但往往深度学习的训练集规模很大,计算整个训练集的梯度需要很大…...
【算法心得】二维dp的状态转移狂练
LCS: LCS变式:使两个字符串变成一样的,删除的和最小 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)? 感觉 ( m 1 ) ∗ ( n …...

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

【C++从0到王者】第十四站:list基本使用及其介绍
文章目录 一、list基本介绍二、list基本使用1.尾插头插接口使用2.insert接口使用3.查找某个值所在的位置4.erase接口使用以及迭代器失效5.reverse6.sort7.merge8.unique9.remove11.splice 三、list基本使用完整代码 一、list基本介绍 如下所示,是库里面对list的基本…...
正则表达式、常用的正则
文章目录 正则表达式字符含意义RegExp函数RegExp属性RegExp对象方法RegExp构造函数的第二个参数 常用的正则例子只包含数字(包括正数、负数、零)只包含中英文数字及键盘上的特殊字符校验密码是否符合规则的正则校验http或者https端口号的正则只校验端口号…...

ST官方基于米尔STM32MP135开发板培训课程(一)
本文将以Myirtech的MYD-YF13X以及STM32MP135F-DK为例,讲解如何使用STM32CubeMX结合Developer package实现最小系统启动。 1.开发准备 1.1 Developer package准备 a.Developer package下载: https://www.st.com/en/embedded-software/stm32mp1dev.ht…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...
电脑桌面太单调,用Python写一个桌面小宠物应用。
下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡,可以响应鼠标点击,并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...

小智AI+MCP
什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析:AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github:https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...
学习 Hooks【Plan - June - Week 2】
一、React API React 提供了丰富的核心 API,用于创建组件、管理状态、处理副作用、优化性能等。本文档总结 React 常用的 API 方法和组件。 1. React 核心 API React.createElement(type, props, …children) 用于创建 React 元素,JSX 会被编译成该函数…...