Skip to content

前端工作中的经验与教训

🕒 Published at:

关于表单元素 input 上的 v-model 绑定

一直以来我都有个错觉,认为在 input 等输入类型的表单元素上,v-model 指令绑定的是 value 属性和 change 事件,直到后来自己封装某个自定义指令的时候(需要手动触发一下双向绑定),使用 dispatch 分发 change 事件并没有触发绑定值的更新,遂去翻看文档,发现了以下内容。

image

看来有些事情还是不能想当然,多看文档总是对的。。。

总结: 官方文档中,input 元素上的 v-model 绑定的是 value 属性和 input 事件。

Axios 提交 Date 类型数据时的时区自动变更问题

问题描述

在使用 Axios 提交 Date 类型的数据时,发现请求体中的时间总是与代码中的时间不一致,这使我非常困惑。这个问题是在某次改项目中的 bug 时发现的,排查了很久。

根本原因

Axios 对于提交的 Date 类型的数据,会将其序列化为时间字符串。 这里涉及到 JavaScript 语言在序列化 Date 对象时的默认行为:

JavaScript 语言在序列化 Date 对象时(如通过 JSON.stringify),会调用 Date.prototype.toISOString() 方法,将日期转换为 ISO 8601 格式(如 2025-05-04T01:00:00.000Z)。其中的 Z 表示 UTC 时间(0 时区),而本地时间(如东八区)会被自动转换为 UTC 时间(减去 8 小时)。如图:

image

为什么要这样做?JavaScript 语言这样做的合理性: Date 对象的 ISO 序列化是为了标准化时间表示,便于跨系统传输。UTC 时间是国际通用标准,因此 JavaScript 的行为是合理的。

解决方案

  1. 不要直接提交 Date 类型的数据,而是将 Date 对象转换为本地时间字符串,然后再提交。
  2. 后端进行时区处理

关于使用 CSS order 属性在不改变 dom 结构的情况下改变元素的显示顺序

是这样的,最近我在维护一个项目的时候遇到这样一个需求,页面上有一个元素,它的内部有两个子元素,它们的dom结构从上到下是 A -> B,现在我希望让 B 显示在父盒子的左侧, A 显示在右侧,并且 A 的宽度是父盒子的宽度减去B的宽度(也就是 A 要自适应剩余的宽度)

这种情况下使用 flex 布局 + order 属性 正好可以解决这个问题。

html
<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8" />
		<meta
			name="viewport"
			content="width=device-width, initial-scale=1.0"
		/>
		<title>Document</title>
		<style>
			.container {
				display: flex;
				width: 300px;
				color: #fff;
			}
			.item1 {
				order: 2;
				flex: 1;
				background-color: blue;
			}
			.item2 {
				order: 1;
				width: 50px;
				background-color: red;
			}
		</style>
	</head>
	<body>
		<div class="container">
			<div class="item1">item1</div>
			<div class="item2">item2</div>
		</div>
	</body>
</html>
image

🔗查看 mdn 关于 order 属性的描述

最后更新于: