vue数据重置

前言

大家在开发后台管理系统的过程中,一定会遇到一个表格的条件查询重置功能吧,如果说查询条件少,重置起来还算是比较简单,如果元素特别多呢,那玩意写起来可遭老罪喽,那今天就给大家整一个如何快速重置数据的功能吧

实现方式一

实现方式一较为简单,就不上代码了,大概就是创建两个一样的数据,修改的是其中一个,然后需要重置的时候,将另一个定义的数据深拷贝给被修改的数据,就可以实现了

实现方式二

基本的思路跟实现方式一是一样的,只不过稍微处理了一下,封装成一个hooks,这样只需要自定义数据的时候执行这个函数即可; 上代码

import { reactive, isRef } from 'vue';// 深拷贝函数,避免使用 JSON.parse(JSON.stringify) 的局限性
const deepClone = (obj: any) => {return JSON.parse(JSON.stringify(obj));// 或者使用更健壮的实现,比如 lodash 的 cloneDeep// return _.cloneDeep(obj);
};export const useReset = <T extends object>(value: T) => {// 如果 value 是 ref,则获取其值const state = isRef(value)? reactive(deepClone(value.value)): reactive(deepClone(value));const reset = (key?: keyof T, specificResetValue?: any) => {// 如果指定了 key,重置该属性if (key) {if (specificResetValue !== undefined) {// 如果提供了 specificResetValue,重置为这个值state[key] = specificResetValue;} else if (key in value) {// 否则重置为初始值state[key] = deepClone((value as any)[key]);}} else {// 如果没有指定 key,重置为初始值Object.assign(state, deepClone(value));}// 删除 state 中不再存在于 value 的属性Object.keys(state).forEach((k) => {if (!(k in value)) {delete state[k];}});};return { state, reset };
};

注意:深拷贝建议使用已经lodash或者其他比较完善的深拷贝方法,这里只是简单处理,知道原理即可
使用方式:

 <el-button @click="reset('form')">重置</el-button>
const { state, reset } = useReset({form: { title: '', typeId: '', type: '', isAppear: '' },formList: [{type: 'input',label: '标题',value: 'title',attrs: {placeholder: '请输入标题',width: '120',},// formLabel: '标题',formItemAttrs: {prop: 'title',label: '标题',labelWidth: '50px',},},{type: 'select',label: '分类',value: 'typeId',attrs: {placeholder: '请输入分类',width: '120',style: 'width: 120px',},formItemAttrs: {prop: 'typeId',label: '分类',},selectlabel: 'type',Keyvalue: 'id',list: [],childrenComponent: {type: 'option',},},{type: 'select',label: '类型',value: 'type',attrs: {placeholder: '请选择类型',width: '120',style: 'width: 120px',},formItemAttrs: {prop: 'type',label: '类型',},selectlabel: 'label',Keyvalue: 'value',list: [{ value: 1, label: '原创' },{ value: 2, label: '转载' },],childrenComponent: {type: 'option',},},{type: 'select',label: '状态',value: 'isAppear',attrs: {placeholder: '请选择状态',width: '120',style: 'width: 120px',},formItemAttrs: {prop: 'type',label: '状态',},selectlabel: 'label',Keyvalue: 'value',list: [{ value: 1, label: '可见' },{ value: 3, label: '草稿' },],childrenComponent: {type: 'option',},},],
});

上面的实现可以只对某一个属性进行重置,案例

<template><div style="height: 100vh"><kt-form v-model="state" :formAttrs="formAttrs"></kt-form><el-button @click="see" type="primary">查询</el-button><el-button @click="reset('form')">重置</el-button><!-- <el-button type="primary" @click="add">添加</el-button> --><kt-table:column="articleColumn":default-sort="{ prop: 'date', order: 'descending' }":tableData@selection-change="handleSelectionChange":page-sizes="[10, 20, 30, 40]"layout="total, sizes, prev, pager, next, jumper"v-model="page":total:tableColumnAttrs="tableColumnAttrs"@confirm="confirm"@handleClick="handleClick"><template #tags="scope"><el-tagv-for="(item, index) in scope.row.tags":key="index":type="tagType[index % tagType.length]">{{ item }}</el-tag></template><template #isAppear="scope"><el-selectv-model="scope.row.isAppear"style="width: 120px"@change="(value) => changeIsAppear(value, scope.row.id)"><el-optionv-for="item in isAppearList":key="item.value":label="item.label":value="item.value"></el-option></el-select></template><template #type="scope"><el-tag :type="appear(scope.row.type)">{{ scope.row.type === '1' ? '原创' : '转载' }}</el-tag></template><template #isTop="scope"><el-switchv-model="scope.row.isTop"active-value="1"inactive-value="2"@change="(value) => changeIsAppear(value, scope.row.id)"/></template><template #typeId="scope">{{ format(scope.row.typeId) }}</template></kt-table>{{ state.id }}</div>
</template>
<script setup lang="ts">
import { articleColumn } from '@/common/column';
import { list, update, del } from '@/request/article';
import { useReset } from '@/hooks/useResert';
import { ElMessage } from 'element-plus';
import { useTypelist } from '@/hooks/useTypelist';
import router from '@/router';
import { useInit } from '@/store/index.ts';
const init = useInit();
const typeList = ref<any[]>([]);import 'element-plus/theme-chalk/el-message.css';
const formAttrs = {inline: true,labelWidth: '50px',
};interface IArticle {id: number;[key: string]: any;
}
let total = 0;
const { state, reset } = useReset({form: { title: '', typeId: '', type: '', isAppear: '' },formList: [{type: 'input',label: '标题',value: 'title',attrs: {placeholder: '请输入标题',width: '120',},// formLabel: '标题',formItemAttrs: {prop: 'title',label: '标题',labelWidth: '50px',},},{type: 'select',label: '分类',value: 'typeId',attrs: {placeholder: '请输入分类',width: '120',style: 'width: 120px',},formItemAttrs: {prop: 'typeId',label: '分类',},selectlabel: 'type',Keyvalue: 'id',list: [],childrenComponent: {type: 'option',},},{type: 'select',label: '类型',value: 'type',attrs: {placeholder: '请选择类型',width: '120',style: 'width: 120px',},formItemAttrs: {prop: 'type',label: '类型',},selectlabel: 'label',Keyvalue: 'value',list: [{ value: 1, label: '原创' },{ value: 2, label: '转载' },],childrenComponent: {type: 'option',},},{type: 'select',label: '状态',value: 'isAppear',attrs: {placeholder: '请选择状态',width: '120',style: 'width: 120px',},formItemAttrs: {prop: 'type',label: '状态',},selectlabel: 'label',Keyvalue: 'value',list: [{ value: 1, label: '可见' },{ value: 3, label: '草稿' },],childrenComponent: {type: 'option',},},],
});const tagType: any = ['primary', 'success', 'info', 'warning', 'danger'];
const see = () => {// console.log(forms.form);// reset(state.form);console.log(state);getList();
};
const tableColumnAttrs = {fixed: 'right',align: 'center',minWidth: '120',
};const tableData = ref([]);
const page = ref({currentPage: 1,currentSize: 10,
});const handleSelectionChange = (val: any) => {console.log(val);
};const isAppearList = [{value: '1',label: '可见',},{value: '3',label: '草稿',},
];
const format = (id: string | number) => {// console.log(typeList, 'typeList');return typeList.value.find((item: any) => item.id === id)?.type || '';
};
const updateTable = async (id: number) => {const result: any = tableData.value.find((item: IArticle) => item.id === id);if (!result) return;const index: number = tableData.value.findIndex((item: IArticle) => item.id === id);const json: any = { ...result };json.tags = json.tags.join(',');// 调用更新const res = await update(json);if (res.status) {ElMessage.success(res.message);histList[index] = tableData.value[index] as IArticle;} else {ElMessage.error(res.message);// 还原原来的数据if (index !== -1) {(tableData.value[index] as IArticle) = histList[index];}}
};
// isAppear
// 切换状态
const changeIsAppear = async (_val: string | number | boolean, id: number) => {await updateTable(id);
};
const appear = (isAppear: string) => {switch (isAppear) {case '1':return tagType[1];case '2':return tagType[0];case '3':return tagType[3];default:return tagType[3];}
};
let histList: IArticle[] = [];
const getList = async () => {const json: any = { ...page.value, ...state.form };json.page = page.value.currentPage;json.pageSize = page.value.currentSize;const res = await list({ ...json });res.data.articles.forEach((item: any) => {item.tags = item.tags.split(',');});tableData.value = res.data.articles;total = res.data.totalCount;histList = JSON.parse(JSON.stringify(res.data.articles));
};// 删除单个
const confirm = async (row: IArticle) => {const res: any = await del(row.id);if (res.status) {ElMessage.success(res.message);getList();} else {ElMessage.error(res.message);}
};
// 编辑
const handleClick = (row: IArticle) => {init.changeCurrentTab('articleAdd', '1-2');// query传参跳转router.push({path: '/articleAdd',query: {id: row.id,},});
};
watch([() => page.value.currentPage, () => page.value.currentSize],() => {getList();},{ immediate: true },
);
onMounted(async () => {const { data } = await useTypelist();typeList.value = data.value;state.formList[1].list = data.value;
});
// 查询列表
</script>
<style lang="scss" scoped></style>

上面是一个页面,展示

image
其中,分类,类型和状态的下拉数据通过接口获取的,所以,当数据重置的时候,我是不能formList里面的数据,否则会导致下拉列表为空,这时候,只需要调用reset,然后传入需要重置的的数据,这里需要重置的是form,所以重置调用reset(‘form’)
image

总结

以上就是通过函数的方式实现数据重置,本质上还是通过一个新的数据对老数据进行覆盖,如果有问题欢迎提出

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

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

相关文章

【js逆向入门】图灵爬虫练习平台 第九题

地址&#xff1a;aHR0cHM6Ly9zdHUudHVsaW5ncHl0b24uY24vcHJvYmxlbS1kZXRhaWwvOS8 f12进入了debugger&#xff0c;右击选择一律不在此处暂停&#xff0c; 点击继续执行 查看请求信息 查看载荷&#xff0c;2个加密参数&#xff0c;m和tt 查看启动器&#xff0c;打上断点 进来 往…

OpenCV第2课 OpenCV的组成结构与图片/视频的加载及展示

1.OpenCV 的组成结构 2.OpenCV 的具体模块 3. 图像的读取 4. 视频的读取 1.OpenCV 的组成结构 OpenCV 是由很多模块组成的,这些模块可以分成很多层: 最底层是基于硬件加速层(HAL)的各种硬件优化。再上一层是opencv_contrib 模块所包含的OpenCV 由其他开发人员所贡献的代…

scNET:整合scRNA-seq和PPI用于学习基因和细胞的embedding

scRNA-seq 技术的最新进展为深入了解各种组织的异质性提供了前所未有的视角。然而&#xff0c;仅靠基因表达数据往往无法捕捉和识别细胞通路和复合物的变化&#xff0c;因为这些变化在蛋白质水平上更容易被察觉。此外&#xff0c;由于scRNA-seq数据存在高噪声水平和零膨胀等固有…

吴恩达机器学习笔记复盘(十一)逻辑回归的代价和损失函数

简介 逻辑回归是一种二分类算法&#xff0c;损失函数和代价函数和线性回归模型不同。目标是根据特征预测标签Y&#xff08;0或1&#xff09;。模型通过参数W和B拟合数据&#xff0c;但如何选择最优参数成为关键。本质上说线性回归的损失函数是对数值本身的误差平均值描述&…

ctfshow WEB web3

提示是一道php伪协议文件包含的题目&#xff0c;通过get传递的参数是 url 使用 Burp 抓包&#xff0c;发送给 Repeater 构造php伪协议&#xff0c;通过url传递 ?urlphp://input <?php system("pwd");?> 查看当前目录 <?php system("ls");?…

Windows部署deepseek R1训练数据后通过AnythingLLM当服务器创建问答页面

如果要了解Windows部署Ollama 、deepseek R1请看我上一篇内容。 这是接上一篇的。 AnythingLLM是一个开源的全栈AI客户端&#xff0c;支持本地部署和API集成。它可以将任何文档或内容转化为上下文&#xff0c;供各种语言模型&#xff08;LLM&#xff09;在对话中使用。以下是…

word中指定页面开始添加页码

第一步&#xff1a; 插入页码 第二步&#xff1a; 把光标放到指定起始页码处 第三步&#xff1a; 取消链接到前一节 此时关掉页脚先添加分节符 添加完分节符后恢复点击 第四步&#xff1a; 设置页码格式&#xff0c;从1开始 第五步&#xff1a; 删掉不要的页码&#xff0c…

多语言语料库万卷·丝路2.0开源,数据模态全面升级,搭建文化交流互鉴AI桥梁

3月22日&#xff0c;上海人工智能实验室&#xff08;上海AI实验室&#xff09;联合新华社新闻信息中心、上海外国语大学、外研在线等&#xff0c;发布全新升级的“万卷丝路2.0”多语言语料库&#xff0c;通过构建多语言开源数据底座&#xff0c;以人工智能赋能“一带一路”高质…

Windows桌面采集技术

在进入具体的方式讨论前&#xff0c;我们先看看 Windows 桌面图形界面的简化架构&#xff0c;如下图&#xff1a; 在 Windows Vista 之前&#xff0c;Windows 界面的复合画面经由 Graphics Device Interface&#xff08;以下简称 GDI&#xff09;技术直接渲染到桌面上。 在 Wi…

C# BULK INSERT导入大数据文件数据到SqlServer

BULK INSERT 的核心原理 BULK INSERT 是一种通过数据库原生接口高效批量导入数据的技术&#xff0c;其核心原理是绕过逐条插入的 SQL 解析和执行开销&#xff0c;直接将数据以二进制流或批量记录的形式传输到数据库。 在.NET中&#xff0c;主要通过 ​SqlBulkCopy 类​&#x…

Power BI嵌入应用:常见问题与调试技巧

将Power B 嵌入应用时的常见问题与调试技巧 Power BI Embedded 是一项 Microsoft Azure 服务&#xff0c;允许开发人员将交互式 Power BI 报表和仪表板嵌入到外部自定义应用程序或网站中。将Power BI嵌入应用程序能有效提升用户体验&#xff0c;但实施过程中可能面临一些典型问…

Android Studio编译问题

文章目录 GradleJDK版本不兼容 Gradle JDK版本不兼容 Incompatible because this component declares an API of a component compatible with Java 11 and the consumer needed a runtime of a component compatible with Java 8 查看module内gradle文件是否设置jdk版本&…

Four.meme是什么,一篇文章读懂

一、什么是Four.meme&#xff1f; Four.meme 是一个运行在 BNB 链的去中心化平台旨在为 meme 代币供公平启动服务。它允许用户以极低的成本创建和推出 meme 代币&#xff0c;无需预售或团队分配&#xff0c;它消除了传统的预售、种子轮和团队分配&#xff0c;确保所有参与者有…

解决PHP内存溢出问题的讨论和分析

PHP作为一种广泛使用的服务器端脚本语言&#xff0c;在处理大量数据或复杂任务时&#xff0c;常常会遇到内存溢出的问题。内存溢出不仅会导致程序崩溃&#xff0c;还可能影响服务器的稳定性。本文将探讨解决PHP内存溢出问题的最佳实践&#xff0c;并通过代码示例进行详细说明。…

git,openpnp - 根据安装程序打包名称找到对应的源码版本

文章目录 git,openpnp - 根据安装程序打包名称找到对应的源码版本概述笔记备注 - 提交时间不可以作为查找提交记录的依据END git,openpnp - 根据安装程序打包名称找到对应的源码版本 概述 想在openpnp官方最新稳定版上改一改&#xff0c;首先就得知道官方打包的安装程序对应的…

基于Spring Boot的停车场管理系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

基于Spring Boot + Vue的银行管理系统设计与实现

基于Spring Boot Vue的银行管理系统设计与实现 一、引言 随着金融数字化进程加速&#xff0c;传统银行业务向线上化转型成为必然趋势。本文设计并实现了一套基于Spring Boot Vue的银行管理系统&#xff0c;通过模块化架构满足用户、银行职员、管理员三类角色的核心业务需求…

Unity | Tag、Layer常量类生成工具

在项目开发中我们可以对诸如Layer、Tag等编辑器数据进行常量生成&#xff0c;来代替在代码中通过输入字符串生成常量的形式以提高开发效率。 Layer的生成可以通过LayerMask.LayerToName获取层名称&#xff08;也可以从TagManager.asset中获得 &#xff09;&#xff0c;Tag的生成…

两个手机都用流量,IP地址会一样吗?深入解析

在日常生活中&#xff0c;我们常常会同时使用多台手机设备上网&#xff0c;尤其是在流量充足的情况下。你是否曾好奇过&#xff0c;当两台手机同时使用流量上网时&#xff0c;它们的IP地址会是一样的吗&#xff1f;这个问题看似简单&#xff0c;却涉及移动网络的技术原理。本文…

后端——AOP异步日志

需求分析 在SpringBoot系统中&#xff0c;一般会对访问系统的请求做日志记录的需求&#xff0c;确保系统的安全维护以及查看接口的调用情况&#xff0c;可以使用AOP对controller层的接口进行增强&#xff0c;作日志记录。日志保存在数据库当中&#xff0c;为了避免影响接口的响…