Form 表单数据缓存的一种策略

47 篇文章 4 订阅
2 篇文章 0 订阅

背景

表单通常用于信息的收集,由输入框、选择器、级联选择、单选框、多选框、开关、日期选择器等等基础组件构成。存在这样一种场景:我们花了大把时间填好一个复杂表单后提交查询,跳转到结果页面,然后想回退修改某一个条件再查询结果,回退后发现表单之前填的数据没了,面对空白表单需要重新填写,内心一定是崩溃的。这时我们就需要一种表单缓存策略来保留用户的输入,以提升用户体验。

例子:
表单填写:
表单填写
询价结果:

策略

一、url 参数的方式

这种方式的原理是通过在 url 上附加查询参数来保存我们的表单数据。当从结果页回退到表单填写页时,我们可以通过解析 url 上的参数获取对应的表单数据,进而可以进行表单的数据填充。但考虑到 url 的长度有限制,并且与其他查询参数混合在一起显示在导航栏上也不美观,遂放弃这种方式。

二、浏览器 Storage 的方式

浏览器为我们提供了 Local Storage 和 Session Storage 来存储同源下的网站数据的能力,它们支持的存储空间更大使用起来也更方便,考虑到我们不需要持久缓存数据,这里选用 Session Storage。

整体思路:

  1. 在提交表单成功的回调中进行数据缓存:
// 伪代码
const [formValues, setValues] = useState({});
const handleSubmit = (values) => {
  fetch(values).then((res) => {
       sessionStorage.setItem('saveKey', values);
  });
};
return (
  <Form onChange={setValues} value={formValues}>
       ... 
      <FormItem>
        <Submit loading={loading} onClick={handleSubmit}>
          一键询价
        </Submit>
      </FormItem>
  </Form>
)

这里我们只需要在表单请求成功时再进行缓存,因为在请求失败或者填写不符合规则时还是停留在表单页面,数据没有丢失。
2. 在表单页面增加一个 useEffect 来获取浏览器缓存的表单数据

const [formValues, setValues] = useState({});
const handleSubmit = (values) => {
  fetch(values).then((res) => {
       sessionStorage.setItem('saveKey', values);
  });
useEffect(() => {
  const lastFormInfo = sessionStorage.getItem('saveKey');
  if (lastFormInfo) {
       setValues(lastFormInfo);
  }
}, []);
return (
  <Form onChange={setValues} value={formValues}>
       ... 
      <FormItem>
        <Submit loading={loading} onClick={handleSubmit}>
          一键询价
        </Submit>
      </FormItem>
  </Form>
)

这里我们只要在首次加载表单页面时进行缓存数据的获取,若存在缓存数据,我们就将值设置到表单中。

  1. 表单数据的处理
    简单情况下,1、2两步就可以完成对表单数据的缓存了。但有时我们表单中的数据是远程获取的,比如各种选择器的选项内容,像例子中的城市选择字段,页面上显示的是浙江/杭州,但是实际上我们的存储的字段是city: ["330000", "330100"],在远程选项数据还没获取到时,表单中城市字段会显示330000/330100,等数据获取到以后,就变成了浙江/杭州,存在一个抖动现象,如下:

    这个处理方式比较简单,我们只要在获取选项成功时,再进行表单值的赋值就行了:
const [formValues, setValues] = useState({});
==> const [area, loadingAreaFinish] = useArea();
const handleSubmit = (values) => {
  fetch(values).then((res) => {
       sessionStorage.setItem('saveKey', values);
  });
useEffect(() => {
  const lastFormInfo = sessionStorage.getItem('saveKey');
  if (lastFormInfo && loadingAreaFinish) {
       setValues(lastFormInfo);
  }
}, [loadingAreaFinish]);
return (
  <Form onChange={setValues} value={formValues}>
       ... 
      <FormItem>
        <Submit loading={loading} onClick={handleSubmit}>
          一键询价
        </Submit>
      </FormItem>
  </Form>
)

结果:

总结

使用浏览器 Storage 的能力进行表单数据缓存可以帮助我们提升用户的表单使用体验,整体的思路如上不再赘述。需要注意的一点是,表单预填充时出现值的跳闪或数据填充值为value(选择器,期望显示的是label值)等问题时,这种情况大概率是由于数据异步加载未完成而页面渲染先完成了导致的,这时,我们只要在 useEffect 中增加对应异步数据请求的监听,在它们都加载完成后再进行表单值的赋值即可。

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
最新Python3.5零基础+高级+完整项目(28周全)培训视频学习资料;本资料仅用于学习。 【课程内容】 第1周 开课介绍 python发展介绍 第一个python程序 变量 字符编码与二进制 字符编码的区别与介绍 用户交互程序 if else流程判断 while 循环 while 循环优化版本 for 循环及作业要求 第2周 本节鸡汤 模块初识 pyc是什么 python数据类型 bytes数据类型 列表的使用 元组与购物车程序练习 购物车程序练习实例 字符串常用操作 字典的使用 三级菜单实例 本周作业-购物车优化 第3周 作业 上节内容回顾 集合及其运算 文件读与写详解 心灵鸡汤 文件修改详解 字符编码转换详解 函数与函数式编程 函数式编程之参数详解 局部变量与全局变量作用域 递归 函数式编程与函数不同 高阶函数 第4周 上节内容回顾 心灵鸡汤 装饰器详解 装饰器应用详解 装饰器之函数即变量 装饰器之高阶函数 装饰器之嵌套函数 装饰器之案例剖析 装饰器之高潮讲解 迭代器与生成器 迭代器与生成器并行 内置方法详解 Json与pickle数据序列化 软件目录结构规范 本周作业 第5周 心灵分享 ATM存钱取钱案例剖析 模块定义、导入、优化详解 内置模块详解之time与datetime模块 内置模块详解之Range模块 内置模块详解之OS模块 内置模块详解之Sys模块 内置模块详解之Shelve模块 内置模块详解之Xml模块 内置模块详解之Configparser模块 内置模块详解之Hashlib、Hmac模块 正则表达式Re模块使用详解 第6周 本节小鸡汤(电影分享) 面向对象介绍 面向对象特性介绍 实例演示opp编程好处 实例变量与类变量 类变量的作用及析构函数 类的继承 经典类与新式类的继承顺序 继承实例讲解 多态实例讲解 本节作业之选课系统开发 第7周 心灵分享 上节回顾 静态方法、类方法、属性方法 课堂扯淡 深入讲解类的特殊成员方法__init__等 深入讲解类的特殊成员方法__new__等 反射详解 异常处理TryExcept 网络编程Socket介绍 Socket通信案例消息发送与接收 第8周 上节回顾 Socket实现简单的ssh客户端 Socket实现简单的ssh服务端 积极思考正能量 Socket实现简单的ssh2 Socket粘包 Socket粘包深入编码 SocketServer SocketServer多并发 多用户在线Ftp程序 第9周 上节回顾 paramiko模块详解 ssh密钥讲解 进程与线程 多线程 多线程案例 主线程与子线程 线程锁 线程之信号量 线程之Event 队列Queue 作业之主机批量管理 第10周 心灵分享 上节回顾 多进程 多进程Queue 多进程Pipes与Manager 进程锁与进程池详解 协程 协程Gevent 协程之爬虫 协程之Socket IO多路复用 IO模式 Select解析Socket通信 作业 第11周 鸡汤 消息队列介绍 RabbitMQ基本示例 RabbitMQ消息分发轮询 RabbitMQ消息持久化 RabbitMQ fanout广播模式 RabbitMQ direct广播模式 RabbitMQ topic细致的消息过滤广播模式 Redis string操作 RabbitMQ rpc实现 Redis hash操作 Redis 集合set 和有序集合操作 Redis 集合操作补充 Redis 发布订阅及本节作业 第12周 上节回顾 数据库介绍 mysql基本使用 mysql数据类型与创建表 mysql 增删改查 mysql 外键关联 mysql 连接查询 mysql 事务与索引 mysql python交互 sqlalchemy orm介绍 sqlalchemy 常用语法 sqlalchemy 外键关联 sqlalchemy 多外键关联 sqlalchemy 多对多关联 作业之学员管理系统开发 第13周 堡垒机框架开发介绍 堡垒机源码讲解 堡垒机项目表结构设计与实现 自动创建表对象 权限分组与数据初始化 第14周 开课介绍 前端技术概要 今日内容概要 Html本质以及在web程序中的作用 html的head内标签 html的body内标签之图标、换行及其他 chrome查看html样式基本操作 html的body内标签之input系列 html的body内标签之多行文本及下来框 html的body内标签之超链接 html的body内标签之图片及表格 html的body内标签之表格 html的body内标签之fieldset标签和label标签 上述内容总结 css选择器 css的存在形式及优先级 css边框以及其他常用样式 css之float样式 css之float实现作业实例 css之display样式 css之内外边距 本周作业以及思路 第15周 上节内容答疑 上节内容回顾 CSS内容补充之position CSS内容补充之overflow CSS内容之hover CSS内容之background 初始javaScript javascript代码存在形式 javascript基本预览 javascript字符串操作以及跑马灯实例 javascript数组和字典以及for循环 javascript条件语句 javascript函数的定义 Dom直接选择器 Dom间接选择器 示例之模态对话框 示例之全选和反选以及取消 javascript必须加分号 示例之后台管理左侧菜单 今日内容梳理 本周作业 第16周 上节作业问题答疑 今日内容计划 CSS内容补充以及后台管理页面布局 后台管理页面布局 JavaScript内容回顾 JavaScript函数 JavaScript序列化及转义 开小差之自动登录抽屉并点赞 eval以及时间操作 JavaScript作用域 JavaScript面向对象及原型 Dom选择器以及内容文本操作 Dom样式操作 Dom属性及创建标签 Dom提交表单及其他 Dom事件操作 Dom事件操作补充 Dom绑定时间的另外一种方式 JavaScript 词法分析解析 前端学习方法分享 Sublime Text工具使用介绍 谢幕 第17周 今日内容概要 jQuery 和Dom关系及jQuery版本 jQuery选择器 实例多选反选取消 删选器以及Tab菜单示例 示例:模态编程框 jQuery 样式以及属性操作 示例:TAB切换菜单 jQuery内容操作 点赞以及jQuery css操作 JQuery高度以及位置操作 JQuery 事件绑定的方式 JQuery事件之组织事件的发生 示例:表单验证 JQuery事件之页面框架和加载后自动执行 JQuery扩展以及自动执行函数的应用 JQuery阻止事件发生 JQuery扩展 作业 第18周 内容概要 JS正则详解 JS正则详解之验证 组件BootStrap、EasyUI、JQueryUI 插件轮播 Django_Web框架引入 Django工程创建 Django目录详解 Django创建App Django的Model使用 Django实现用户登录与前端交互 Django路由介绍 Django知识点整理 作业 第19周 今日内容概要 上课内容概要 今日Django工程的创建 Django获取多个数据以及文件上传 Django的CBV和FBV Django模板语言循环字典 Django基于正则表达式的URL Django对应的路由名称 Django路由分发 DjangoORM基本创建基本类型以及生成数据库结构 DjangoORM使用mysql注意 DjangoORM基本增删查该 基于ORM实现用户登录 基于ORM实现用户增加删除修改以及查看详细 Django字段类型介绍 DjangoORM字段参数介绍 DjangoORM外键操作 基于DjangoORM的外键实现增加用户(含select标签) 作业 第20周 课程安排 上课内容回顾 Django一对多的创建 创建一对多表结构 获取单表单数据的三种方式 一对多跨表操作 一对多块表操作的的三种方式 增加一对多数据示例 初识Ajax Ajax内容基本整理 编辑一对多示例 创建多对多以及增加示例 本节内容梳理 本周作业 第21周 今日知识点概要 上节内容回顾以及URL的补充 视图获取用户请求相关信息以及请求头 模板之继承 模板之导入 上节作业情况 自定义 simple_tag 自定义filter 自定义分页 Cookie是什么鬼 基于Cookie实现用户登录 基于cookie实现定制显示数据条数 带签名的Cookie CBV和FBV用户认证装饰器 本周作业 第22周 上节回顾 Django之url、Views Django之Model操作 Django之模版 Django之Session Django之Session与Cookie Django之CSRF原理详解 Django之中间件详解 Django之缓存实例详解 Django之信号 Django之Form组件验证 作业 第23周 主机管理项目需求分析 主机管理项目架构设计 主机管理项目初始构建 主机管理项目编写插件基类 主机管理项目命令分发器 主机管理项目提取主机列表 主机管理项目提取yaml配置文件_ 主机管理项目动态调用插件进行数据解析 主机管理项目对模块中的参数进行解析 第24周 本节题纲 上节内容回顾 ModelForm操作及验证 ajax操作-原生ajax ajax操作-JQuery的ajax ajax操作-伪ajax(iframe) ajax操作-时机选择 文件上传(3种方式)-1 文件上传-时机选择及预览-2 图片验证码 KindEditor基本使用和文件操作 作业 第25周 今日内容概要 博客系统示例预览 组合搜索组件 JSONP跨域请求jQuery方式 JSONP跨域请求本质 XSS过滤以及单例模式 博客系统表结构讲解 博客系统功能讲解 CMDB介绍 CMDB实现的三种方式 CMDB Agent客户端示例 第26周 今日内容概要以及CMDB介绍 前端插件定制之表头 前端插件定制之表内容 第27周 前端插件定制之定制td内容以及属性 CMDB插件示例演示 算法介绍与列表查找 冒泡 选择 插入排序 快排 堆排序 第28周 堆排序复习 归并排序 希尔排序 算法练习 栈和队列 数据结构其他
sessionStorage 是浏览器提供的一种本地存储方案,可以将数据存储在浏览器的会话中,当页面关闭时数据也会被清除。使用 sessionStorage 可以实现前端缓存功能。 下面是一个简单的例子,展示如何使用 sessionStorage 来实现缓存和显示缓存结果: ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Session Storage Example</title> </head> <body> <h1>Session Storage Example</h1> <form> <label for="input">Input:</label> <input type="text" id="input"> <button type="button" onclick="storeData()">Save</button> </form> <div id="output"></div> <script> function storeData() { var input = document.getElementById('input').value; sessionStorage.setItem('data', input); displayData(); } function displayData() { var output = document.getElementById('output'); var data = sessionStorage.getItem('data'); if (data) { output.innerHTML = 'Data in session storage: ' + data; } else { output.innerHTML = 'No data in session storage.'; } } displayData(); </script> </body> </html> ``` 这个例子中,我们创建了一个表单,让用户输入一些数据,然后通过点击按钮来将数据存储到 sessionStorage 中。同时,我们还创建了一个显示缓存结果的区域,通过调用 `sessionStorage.getItem()` 来获取存储在 sessionStorage 中的数据,并将其显示出来。 在页面刷新或关闭后,存储在 sessionStorage 中的数据会被清除,因此下次访问页面时将无法显示之前存储的数据。 需要注意的是,sessionStorage 只能存储字符串类型的数据,如果需要存储其他类型的数据,可以使用 `JSON.stringify()` 和 `JSON.parse()` 方法进行转换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码飞_CC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值