Vue 项目实战:三种方式实现列表→详情页表单数据保留与恢复

背景:在Vue项目中,实现列表页跳转详情页并保留表单数据,返回时恢复表单状态。
核心功能

  1. 保存缓存:点击查询按钮时,表单数据保存
  2. 恢复缓存:从详情页返回时,恢复表单数据
  3. 清除缓存:页面刷新时自动清除缓存数据

实现以上功能,常见有以下3种方式:

  1. 路由参数/查询字符串
    将表单数据通过路由参数传递,详情页返回时带回。
    代码如下:

userList.vue

<script setup lang="ts">
import { ref, reactive, onMounted } from 'vue'
import { ElTable, ElTableColumn, ElForm, ElFormItem, ElInput, ElSelect, ElOption, ElButton } from 'element-plus'
import { useRouter, useRoute } from 'vue-router'interface UserFilter {username: stringgender: string
}interface User {id: numberusername: stringgender: stringage: numberemail: stringphone: string
}const route = useRoute()
const router = useRouter()const filterForm = reactive<UserFilter>({username: '',gender: ''
})const users = ref<User[]>([{id: 1,username: '张三',gender: '男',age: 25,email: 'zhangsan@example.com',phone: '13800138000'},{id: 2,username: '李四',gender: '女',age: 28,email: 'lisi@example.com',phone: '13800138001'},])const filteredUsers = ref<User[]>(users.value)onMounted(() => {if (route.query.username) {filterForm.username = route.query.username as string}if (route.query.gender) {filterForm.gender = route.query.gender as string}if (filterForm.username || filterForm.gender) {handleFilter()}
})const handleFilter = () => {filteredUsers.value = users.value.filter(user => {const usernameMatch = filterForm.username ? user.username.includes(filterForm.username) : trueconst genderMatch = filterForm.gender ? user.gender === filterForm.gender : truereturn usernameMatch && genderMatch})
}const resetFilter = () => {filterForm.username = ''filterForm.gender = ''filteredUsers.value = users.valuerouter.replace({ query: {} })
}const viewDetail = (row: User) => {router.push({name: 'userDetail',params: { id: row.id },query: {username: filterForm.username,gender: filterForm.gender}})
}
</script><template><div class="user-list"><el-form :model="filterForm" inline class="filter-form"><el-form-item label="用户名"><el-input v-model="filterForm.username" placeholder="请输入用户名" /></el-form-item><el-form-item label="性别"><el-select v-model="filterForm.gender" placeholder="请选择性别" style="width: 200px"><el-option label="男" value="男" /><el-option label="女" value="女" /></el-select></el-form-item><el-form-item><el-button type="primary" @click="handleFilter">查询</el-button><el-button @click="resetFilter">重置</el-button></el-form-item></el-form><el-table :data="filteredUsers" style="width: 100%"><el-table-column prop="username" label="用户名" /><el-table-column prop="gender" label="性别" /><el-table-column prop="age" label="年龄" /><el-table-column prop="email" label="邮箱" /><el-table-column prop="phone" label="电话" /><el-table-column label="操作"><template #default="{ row }"><el-button type="primary" size="small" @click="viewDetail(row)">查看详情</el-button></template></el-table-column></el-table></div>
</template><style scoped>
.user-list {padding: 20px;
}.filter-form {margin-bottom: 20px;
}
</style>

userDetail.vue

<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { ElButton, ElDescriptions, ElDescriptionsItem } from 'element-plus'const route = useRoute()
const router = useRouter()interface User {id: numberusername: stringgender: stringage: numberemail: stringphone: string
}const user = ref<User>()onMounted(() => {
// 实际开发中,调用接口获取数据user.value = {id: 1,username: '张三',gender: '男',age: 25,email: 'zhangsan@example.com',phone: '13800138000'}
})const goBack = () => {router.push({name: 'userList',query: {username: route.query.username,gender: route.query.gender}})
}
</script><template><div class="user-detail"><div class="header"><h2>用户详情</h2><el-button @click="goBack">返回</el-button></div><el-descriptions v-if="user" :column="2" border><el-descriptions-item label="用户名">{{ user.username }}</el-descriptions-item><el-descriptions-item label="性别">{{ user.gender }}</el-descriptions-item><el-descriptions-item label="年龄">{{ user.age }}</el-descriptions-item><el-descriptions-item label="邮箱">{{ user.email }}</el-descriptions-item><el-descriptions-item label="电话">{{ user.phone }}</el-descriptions-item></el-descriptions></div>
</template><style scoped>
.user-detail {padding: 20px;
}.header {display: flex;justify-content: space-between;align-items: center;margin-bottom: 20px;
}
</style>

**优点:**简单直接,无需额外存储。
**缺点:**数量有限(URL长度限制),敏感数据不安全。
效果如图所示:
在这里插入图片描述
2. Vuex/Pinia状态管理
将表单数据存储在全局状态中,详情页返回时从状态中恢复。
代码实现如下:
建立一个stores文件夹,建user.ts文件

import { defineStore } from 'pinia'
import { ref, computed } from 'vue'export interface User {id: numberusername: stringgender: stringage: numberemail: stringphone: stringdepartment: stringposition: stringcreateTime: string
}export interface UserFilter {username: stringgender: stringdepartment: string
}export const useUserStore = defineStore('user', () => {const users = ref<User[]>([{id: 1,username: '张三',gender: '男',age: 25,email: 'zhangsan@example.com',phone: '13800138000',department: '技术部',position: '前端工程师',createTime: '2023-01-15'},{id: 2,username: '李四',gender: '女',age: 28,email: 'lisi@example.com',phone: '13800138001',department: '产品部',position: '产品经理',createTime: '2023-02-20'},{id: 3,username: '王五',gender: '男',age: 32,email: 'wangwu@example.com',phone: '13800138002',department: '技术部',position: '后端工程师',createTime: '2023-03-10'},{id: 4,username: '赵六',gender: '女',age: 26,email: 'zhaoliu@example.com',phone: '13800138003',department: '设计部',position: 'UI设计师',createTime: '2023-04-05'},{id: 5,username: '钱七',gender: '男',age: 30,email: 'qianqi@example.com',phone: '13800138004',department: '运营部',position: '运营专员',createTime: '2023-05-12'},{id: 6,username: '孙八',gender: '女',age: 24,email: 'sunba@example.com',phone: '13800138005',department: '技术部',position: '测试工程师',createTime: '2023-06-18'},{id: 7,username: '周九',gender: '男',age: 29,email: 'zhoujiu@example.com',phone: '13800138006',department: '产品部',position: '产品助理',createTime: '2023-07-22'},{id: 8,username: '吴十',gender: '女',age: 27,email: 'wushi@example.com',phone: '13800138007',department: '设计部',position: '视觉设计师',createTime: '2023-08-14'}])// 表单数据(用于输入)const filterForm = ref<UserFilter>({username: '',gender: '',department: ''})// 实际应用的筛选条件(只在点击查询时更新)const appliedFilter = ref<UserFilter>({username: '',gender: '',department: ''})// 缓存的表单数据const cachedFilterForm = ref<UserFilter>({username: '',gender: '',department: ''})const loading = ref(false)const currentUser = ref<User | null>(null)// Getters - 基于 appliedFilter 进行筛选const filteredUsers = computed(() => {return users.value.filter(user => {const usernameMatch = appliedFilter.value.username ? user.username.includes(appliedFilter.value.username) : trueconst genderMatch = appliedFilter.value.gender ? user.gender === appliedFilter.value.gender : trueconst departmentMatch = appliedFilter.value.department ? user.department === appliedFilter.value.department : truereturn usernameMatch && genderMatch && departmentMatch})})const departments = computed(() => {const depts = [...new Set(users.value.map(user => user.department))]return depts.sort()})const setFilter = (filter: Partial<UserFilter>) => {Object.assign(filterForm.value, filter)}// 应用筛选条件(点击查询按钮时调用)const applyFilter = () => {appliedFilter.value = { ...filterForm.value }}const resetFilter = () => {filterForm.value = {username: '',gender: '',department: ''}appliedFilter.value = {username: '',gender: '',department: ''}}// 保存表单数据到缓存const saveFilterToCache = () => {cachedFilterForm.value = { ...filterForm.value }}// 从缓存恢复表单数据const restoreFilterFromCache = () => {filterForm.value = { ...cachedFilterForm.value }// 同时应用筛选条件appliedFilter.value = { ...cachedFilterForm.value }}// 清除缓存的表单数据const clearFilterCache = () => {cachedFilterForm.value = {username: '',gender: '',department: ''}}// 检查是否有缓存的表单数据const hasCachedFilter = computed(() => {return Object.values(cachedFilterForm.value).some(value => value !== '')})// 检查是否有应用的筛选条件const hasAppliedFilter = computed(() => {return Object.values(appliedFilter.value).some(value => value !== '')})const getUserById = (id: number): User | undefined => {return users.value.find(user => user.id === id)}const setCurrentUser = (user: User | null) => {currentUser.value = user}const fetchUserById = async (id: number): Promise<User | null> => {loading.value = truetry {await new Promise(resolve => setTimeout(resolve, 500))const user = getUserById(id)setCurrentUser(user || null)return user || null} finally {loading.value = false}}const updateUser = (id: number, userData: Partial<User>) => {const index = users.value.findIndex(user => user.id === id)if (index !== -1) {users.value[index] = { ...users.value[index], ...userData }}}const deleteUser = (id: number) => {const index = users.value.findIndex(user => user.id === id)if (index !== -1) {users.value.splice(index, 1)}}const addUser = (userData: Omit<User, 'id'>) => {const newId = Math.max(...users.value.map(u => u.id)) + 1users.value.push({...userData,id: newId})}return {// Stateusers,filterForm,appliedFilter,cachedFilterForm,loading,currentUser,// GettersfilteredUsers,departments,hasCachedFilter,hasAppliedFilter,// ActionssetFilter,applyFilter,resetFilter,saveFilterToCache,restoreFilterFromCache,clearFilterCache,getUserById,setCurrentUser,fetchUserById,updateUser,deleteUser,addUser}
}, {persist: {key: 'user-store',storage: localStorage,paths: ['cachedFilterForm'] // 只持久化缓存的表单数据}
})

userList.vue

<script setup lang="ts">
import { onMounted, onBeforeUnmount } from 'vue'
import { ElTable, ElTableColumn, ElForm, ElFormItem, ElInput, ElSelect, ElOption, ElButton,ElTag,ElLoading,ElMessage
} from 'element-plus'
import { useRouter } from 'vue-router'
import { useUserStore, type User } from '../stores/user'const router = useRouter()
const userStore = useUserStore()// 页面初始化时从缓存恢复表单数据
onMounted(() => {if (userStore.hasCachedFilter) {userStore.restoreFilterFromCache()}
})// 页面刷新时清除缓存
onBeforeUnmount(() => {userStore.clearFilterCache()
})// 监听页面刷新事件,清除缓存的表单数据
window.addEventListener('beforeunload', () => {userStore.clearFilterCache()
})const handleFilter = () => {// 应用筛选条件userStore.applyFilter()// 保存到缓存userStore.saveFilterToCache()
}const resetFilter = () => {userStore.resetFilter()userStore.clearFilterCache()
}const viewDetail = (row: User) => {// 查看详情前保存当前筛选状态userStore.saveFilterToCache()router.push({name: 'userDetail',params: { id: row.id.toString() }})
}
</script><template><div class="user-list"><div class="header"><h2>用户管理</h2></div><el-form :model="userStore.filterForm" inline class="filter-form"><el-form-item label="用户名"><el-input v-model="userStore.filterForm.username" placeholder="请输入用户名" clearablestyle="width: 200px"@keyup.enter="handleFilter"/></el-form-item><el-form-item label="性别"><el-select v-model="userStore.filterForm.gender" placeholder="请选择性别" clearablestyle="width: 120px"><el-option label="男" value="男" /><el-option label="女" value="女" /></el-select></el-form-item><el-form-item label="部门"><el-select v-model="userStore.filterForm.department" placeholder="请选择部门" clearablestyle="width: 150px"><el-option v-for="dept in userStore.departments" :key="dept" :label="dept" :value="dept" /></el-select></el-form-item><el-form-item><el-button type="primary" @click="handleFilter">查询</el-button><el-button @click="resetFilter">重置</el-button></el-form-item></el-form><!-- User Table --><el-table :data="userStore.filteredUsers" style="width: 100%" v-loading="userStore.loading"stripeborder><el-table-column prop="id" label="ID" width="80" /><el-table-column prop="username" label="用户名" width="120" /><el-table-column prop="gender" label="性别" width="80" /><el-table-column prop="age" label="年龄" width="80" /><el-table-column prop="department" label="部门" width="120" /><el-table-column prop="position" label="职位" width="150" /><el-table-column prop="email" label="邮箱" width="200" /><el-table-column prop="phone" label="电话" width="130" /><el-table-column prop="createTime" label="创建时间" width="120" /><el-table-column label="操作" width="120" fixed="right"><template #default="{ row }"><el-button type="primary" size="small" @click="viewDetail(row)">查看详情</el-button></template></el-table-column></el-table><div v-if="userStore.filteredUsers.length === 0 && !userStore.loading" class="empty-state"><p>{{ userStore.hasAppliedFilter ? '没有找到符合条件的用户' : '暂无用户数据' }}</p></div></div>
</template><style scoped>
.user-list {padding: 20px;
}.header {display: flex;justify-content: space-between;align-items: center;margin-bottom: 20px;
}.header h2 {margin: 0;color: #303133;
}.header-info {display: flex;align-items: center;
}.cache-indicator {color: #67c23a;font-size: 14px;background: #f0f9ff;padding: 4px 8px;border-radius: 4px;border: 1px solid #b3d8ff;
}.filter-form {margin-bottom: 20px;padding: 20px;background: #f5f7fa;border-radius: 8px;
}.empty-state {text-align: center;padding: 60px 0;color: #909399;
}.empty-state p {font-size: 16px;margin: 0;
}
</style>

userDetail.vue

<script setup lang="ts">
import { onMounted, computed } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { ElButton, ElDescriptions, ElDescriptionsItem, ElTag, ElCard,ElLoading,ElMessage
} from 'element-plus'
import { useUserStore } from '../stores/user'const route = useRoute()
const router = useRouter()
const userStore = useUserStore()const userId = computed(() => parseInt(route.params.id as string))onMounted(async () => {if (userId.value) {await userStore.fetchUserById(userId.value)}
})const goBack = () => {router.push({name: 'userList'})
}</script><template><div class="user-detail" v-loading="userStore.loading"><div class="header"><h2>用户详情</h2><div class="header-actions"><el-button @click="goBack" type="primary">返回列表</el-button></div></div><el-card v-if="userStore.currentUser" class="detail-card"><template #header><div class="card-header"><span class="user-name">{{ userStore.currentUser.username }}</span></div></template><el-descriptions :column="2" border><el-descriptions-item label="用户ID">{{ userStore.currentUser.id }}</el-descriptions-item><el-descriptions-item label="用户名">{{ userStore.currentUser.username }}</el-descriptions-item><el-descriptions-item label="性别">{{ userStore.currentUser.gender }}</el-descriptions-item><el-descriptions-item label="年龄">{{ userStore.currentUser.age }}</el-descriptions-item><el-descriptions-item label="部门">{{ userStore.currentUser.department }}</el-descriptions-item><el-descriptions-item label="职位">{{ userStore.currentUser.position }}</el-descriptions-item><el-descriptions-item label="邮箱" :span="2">{{ userStore.currentUser.email }}</el-descriptions-item><el-descriptions-item label="电话">{{ userStore.currentUser.phone }}</el-descriptions-item><el-descriptions-item label="创建时间">{{ userStore.currentUser.createTime }}</el-descriptions-item></el-descriptions></el-card><div v-else-if="!userStore.loading" class="no-data"><p>用户不存在</p><el-button @click="goBack" type="primary">返回列表</el-button></div></div>
</template><style scoped>
.user-detail {padding: 20px;min-height: 400px;
}.header {display: flex;justify-content: space-between;align-items: center;margin-bottom: 20px;
}.header h2 {margin: 0;color: #303133;
}.header-actions {display: flex;align-items: center;gap: 16px;
}.cache-info {color: #67c23a;font-size: 14px;background: #f0f9ff;padding: 4px 8px;border-radius: 4px;border: 1px solid #b3d8ff;
}.detail-card {max-width: 800px;
}.card-header {display: flex;justify-content: space-between;align-items: center;
}.user-name {font-size: 18px;font-weight: 600;color: #303133;
}.no-data {text-align: center;padding: 60px 0;color: #909399;
}.no-data p {font-size: 16px;margin-bottom: 20px;
}
</style>

使用 pinia-plugin-persistedstate 插件实现 localStorage 持久化
Pinia持久化插件详细信息
效果如图所示:
在这里插入图片描述
优点: 数据全局共享,适合复杂场景。
缺点: 需额外维护状态,可能导致store臃肿。
3. keep-alive缓存组件
使用包裹列表组件,被缓存的列表组件在切换路由时不会被销毁,而是进入“休眠”状态,其数据和DOM结构会被保留,返回值保留状态。
App.vue

<router-view v-slot="{ Component }"><keep-alive include="List"><component :is="Component" /></keep-alive>
</router-view>

优点: 无需手动管理数据,组件状态自动保留。
缺点: 缓存所有组件可能导致内存占用过高。
根据项目规模合数据复杂度选择合适的方案,也可组合使用多种方式。

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

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

相关文章

iptables实验

实验一&#xff1a;搭建web服务&#xff0c;设置任何人能够通过80端口访问。 1.下载并启用httpd服务器 dnf -y install httpd 开启httpd服务器 systemctl start httpd 查看是否启用 下载并启用iptables&#xff0c;并关闭firewalld yum install iptable…

Razor编程RenderXXX相关方法大全

文章目录 第一章&#xff1a;RenderXXX方法概述1.1 RenderXXX方法的作用与意义1.2 基本工作原理1.3 主要方法分类 第二章&#xff1a;部分视图渲染方法2.1 Html.RenderPartial()2.2 Html.RenderAction()2.3 性能对比分析 第三章&#xff1a;视图组件渲染方法3.1 Html.RenderCom…

Go 语言 range 关键字全面解析

Go 语言 range 关键字全面解析 range 是 Go 语言中用于迭代数据结构的关键字&#xff0c;支持多种数据类型的遍历操作。它提供了一种简洁、安全且高效的方式来处理集合类型的数据。 基本语法 for index, value : range collection {// 循环体 } 1. 数组/切片迭代 fruits :…

美化显示LLDB调试的数据结构

前面的博文美化显示GDB调试的数据结构介绍了如何美化显示GDB中调试的数据结构&#xff0c;本文将还是以mupdf库为例介绍如何美化显示LLDB中调试的数据结构。 先看一下美化后的效果&#xff1a; 一、加载自定义脚本 与GDB类似&#xff0c;需要添加一个~/.lldbinit文件&#xf…

【Java学习笔记】日期类

日期类 第一代日期类&#xff1a;Date 引入包 import java.text.ParseException&#xff1a;日期转换可能会抛出转换异常 import java.text.SimpleDateFormat import java.util.Date 1. 基本介绍 Date&#xff1a;精确到毫秒&#xff0c;代表特定的瞬间 SimpleDateForma…

C++基础进阶:函数、内联函数与Lambda函数详解

引言 在C编程的旅程中&#xff0c;函数是构建复杂程序的基本单元。它们像乐高积木一样&#xff0c;允许我们将代码分解成更小、更易于管理的部分。今天&#xff0c;我们将深入探讨C中的三种重要函数类型&#xff1a;普通函数、内联函数以及Lambda函数。掌握它们&#xff0c;将…

从Node.js到React/Vue3:流式输出技术的全栈实现指南

本文将从底层原理到工程实践&#xff0c;完整解析如何使用Node.js后端结合React和Vue3前端实现流式输出功能&#xff0c;涵盖协议选择、性能优化、错误处理等关键细节&#xff0c;并通过真实场景案例演示完整开发流程。 一、流式输出的核心原理与协议选择 1.1 流式传输的底层机…

AT2401C中科微2.4g芯片PA

作为无线通信系统的核心模块&#xff0c;射频前端芯片通过整合功率放大器&#xff08;PA&#xff09;、滤波器、开关和低噪声放大器&#xff08;LNA&#xff09;等关键组件&#xff0c;成为保障通信质量、降低功耗及维持信号稳定的决定性因素。 AT2401C是一款面向2.4GHz无线通信…

Linux安装jdk、tomcat

1、安装jdk sudo yum install -y java-1.8.0-openjdk-devel碰到的问题&#xff1a;/var/run/yum.pid 已被锁定 Another app is currently holding the yum lock&#xff1b; waiting for it to exit… https://blog.csdn.net/u013669912/article/details/131259156 参考&#…

在本地电脑中部署阿里 Qwen3 大模型及连接到 Elasticsearch

在今天的文章中&#xff0c;我将参考文章 “使用 Elastic 和 LM Studio 的 Herding Llama 3.1” 来部署 Qwen3 大模型。据测评&#xff0c;这是一个非常不错的大模型。我们今天尝试使用 LM Studio 来对它进行部署&#xff0c;并详细描述如何结合 Elasticsearch 来对它进行使用。…

【设计模式】2.策略模式

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 商场收银软件为例 1. 基础版 total 0def click_ok(price,num):tot price * numtotal totprint(合计&#xff1a;, total)增加打折 total 0def cli…

c++中的输入输出流(标准IO,文件IO,字符串IO)

目录 &#xff08;1&#xff09;I/O概述 I/O分类 不同I/O的继承关系 不同I/O对应的头文件 &#xff08;2&#xff09;iostream 标准I/O流 iostream头文件中的IO流对象 iostream头文件中重载了<<和>> 缓冲区示意图 标准输入流 cin用法 cin&#xff1a;按空…

人工智能学习06-循环

人工智能学习概述—快手视频 人工智能学习06-循环—快手视频

【电路】阻抗匹配

&#x1f4dd; 阻抗匹配 一、什么是阻抗匹配&#xff1f; 阻抗匹配&#xff08;Impedance Matching&#xff09;是指在电子系统中&#xff0c;为了实现最大功率传输或最小信号反射&#xff0c;使信号源、传输线与负载之间的阻抗达到一种“匹配”状态的技术。 研究对象&#x…

【vue】Uniapp 打包Android 文件选择上传问题详解~

需求 uniapp兼容android app&#xff0c;pc&#xff0c;h5的文件选择并上传功能。 需要支持拍照和相册选择&#xff0c;以及选择其他类型文件上传~ 实践过程和问题 开始使用uni-file-picker组件 以为很顺利&#xff0c;android模拟器测试…… 忽略了平台兼容性提示~&#…

Python:操作 Excel 格式化

🔧Python 操作 Excel 格式化完整指南(openpyxl 与 xlsxwriter 双方案) 在数据处理和报表自动化中,Python 是一把利器,尤其是配合 Excel 文件的读写与格式化处理。本篇将详细介绍两大主流库: openpyxl:适合读取与修改现有 Excel 文件xlsxwriter:适合创建新文件并进行复…

Prompt Enginering(提示工程)先进技术

前沿 CoT&#xff08;Chain-of-Thought&#xff09;和 ReACT&#xff08;Reasoning and Acting&#xff09;是两种先进的 Prompt Engineering&#xff08;提示工程&#xff09; 技术&#xff0c;旨在提升大语言模型&#xff08;LLM&#xff09;的推理、规划和执行能力。 CoT&a…

【C++系列】模板类型特例化

1. C模板类型特例化介绍 ​​定义​​&#xff1a;模板类型特例化&#xff08;Template Specialization&#xff09;是C中为模板的特定类型提供定制实现的机制&#xff0c;允许开发者对通用模板无法处理的特殊类型进行优化或特殊处理。 ​​产生标准​​&#xff1a; C98/03…

AI数据分析在体育中的应用:技术与实践

在现代体育竞技领域&#xff0c;"数据驱动"已不再是一个遥远的概念。尤其随着人工智能&#xff08;AI&#xff09;和大数据分析的不断成熟&#xff0c;从职业俱乐部到赛事直播平台&#xff0c;从运动员训练到球迷观赛体验&#xff0c;AI正以前所未有的方式渗透并改变…

计数思想-众数

11203-众数 题目描述(Description) 众数是指在一组数据中&#xff0c;出现次数最多的数。例如&#xff1a;1, 1, 3 中出现次数最多的数为 1&#xff0c;则众数为 1。 给定一组数&#xff0c;你能求出众数吗&#xff1f; 输入格式(Format Input) 第 1 行输入一个整数 n (1 &…