健身记录应存 localstorage 而非 sessionstorage,需字符串化、结构化存储并用唯一 key;chart.js 图表要设 canvas 尺寸或启用 responsive;表单提交须防重、校验并提示;日期输入需 fallback 校验;务必提供 csv 导出功能。

用 localStorage 存运动记录,别碰 sessionStorage
页面关了数据就丢?那是用了 sessionStorage。健身记录要持久,必须用 localStorage——它不随标签页关闭消失,适合存训练日期、动作组数、重量这些关键字段。
注意两个坑:
• localStorage 只存字符串,JSON.stringify() 写入前必做,JSON.parse() 读取后必做;
• 浏览器限制单域名约 5–10MB,但别真塞大图或视频路径——只存结构化数据,比如:{"date":"2024-06-15","exercise":"Bench Press","sets":[{"reps":10,"weight":60},{"reps":8,"weight":65}]};
• 同一域名下所有页面共享 localStorage,别用通用 key 名如 "data",改用 "fitness-log-v2" 这类带版本/用途标识的 key。
用 Chart.js 渲染周度力量趋势,避开 canvas 尺寸塌陷
图表不显示?大概率是 <canvas></canvas> 父容器没设宽高,或 CSS 里写了 width: 100% 却没给父级定死尺寸。Chart.js 默认依赖 canvas 的 width/height 属性(不是 CSS),得手动设或用 responsive: true + maintainAspectRatio: false。
实操建议:
• HTML 中写 <canvas id="strength-chart" width="400" height="250"></canvas>;
• 初始化时加 plugins: { legend: { display: true } },否则移动端可能默认隐藏图例;
• 数据按日期排序再传入,否则折线图会乱跳——别依赖 localStorage 里存的顺序,Array.sort((a, b) => new Date(a.date) - new Date(b.date)) 跑一遍再喂给 chart。
表单提交防重复:禁用按钮 + 本地校验比 loading 状态更可靠
用户狂点“保存”按钮导致同一条记录写两次?光靠 button.disabled = true 不够——刷新页面后状态重置,还得配合本地校验逻辑。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
关键三步:
• 提交前查 localStorage 是否已存在同日同动作记录(用 date + exercise 拼唯一 key);
• 真提交成功后,清空表单并重置按钮 disabled = false;
• 错误处理别只弹 alert,在表单下方加 <div id="form-error" class="error"></div> 动态填提示,比如:"2024-06-15 的深蹲已存在,请编辑或换日期"。
移动端日期输入用 type="date",但得 fallback 到文本框
iOS Safari 对 type="date" 支持稳定,但部分安卓 WebView 会渲染成普通文本框且无校验。不能只信 HTML5 原生控件。
稳妥做法:
• 标签用 <input type="date" id="log-date">,同时加 pattern="\d{4}-\d{2}-\d{2}" 和 title="格式:YYYY-MM-DD";
• JS 提交前强制校验:if (!/^\d{4}-\d{2}-\d{2}$/.test(dateValue)) { /* 提示错误 */ };
• 不要用 new Date(dateString) 直接解析——Safari 对 "2024/06/15" 格式支持差,坚持用 "2024-06-15" 字符串存取。
最易被忽略的是数据导出:别等用户问才加 CSV 导出功能。一行 URL.createObjectURL(new Blob([csvContent], {type: 'text/csv'})) 配个下载链接,就能让记录真正属于自己——毕竟浏览器随时可能清缓存,而你写的这个页面,不该成为数据孤岛。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










