我们的应用程序中有<input type="date" />分,我正在努力让它像你预期的那样工作.

我在这里举了一个例子:https://codesandbox.io/s/romantic-microservice-pg62sq,但通常的问题是,如果您使用键盘输入日期(例如,01012023代表2023年1月1日),它会认为这是一个不完整的0101日期,但只要您一键入2,它就会将其设置为2000年1月1日,由于时区/日历原因,它将呈现为Mon Dec 31 0001 23:58:45 GMT-0001 (Greenwich Mean Time)并填充控件以读取31/12/0001.

在这一点上,如果不使用鼠标,你就无法恢复,这感觉不太理想.

我知道我们可以用defaultValue而不是value来避免这个问题,但我们还有其他东西可以更新这个字段,如果可能的话,我们想要避免使用裁判

推荐答案

不要转换输入值并将其传递回输入元素.如您所见,它很脆弱,在重新呈现组件时可能会导致意外行为.

除非您try 进行自己的解析和输入格式化,否则存储在STATE中并传递到REACT中的输入元素的值应该始终与从事件目标检索到的.value相同.(还要注意,初始值也应该匹配,并且始终为空字符串).

相反,如果您需要以某种方式转换value,请使用derived state(也可能使用useMemo),如下所示:

function getValueForDateInput(value: string): string {
  return !value ? "" : format(new Date(value), "yyyy-MM-dd");
}

export default function App() {

  const [value, setValue] = useState<string>("");
  
  const derivedValue = useMemo(() => getValueForDateInput(value), [value]);
  console.log(derivedValue)

  return (
    <input
      autoFocus
      type="date"
      pattern="####-##-##"
      value={value}
      onInput={(e) => setValue(e.target.value)}
    />
  );
}

Html相关问答推荐

如何让一个动态列表以网格方式水平显示

如何修复与导航栏重叠的css网格?

窗口视图之外的下拉菜单位置

需要帮助创建一个简单的html css网格布局

如何使用CSS在<;表格中<;SVG&>?

CSS Grid:使网格行填充屏幕,将下一行推离屏幕

如何生成随机字符串的字母数字字符集长度到html跨度?

文本css后面未显示背景 colored颜色

如何修剪 flex: 1 内的垂直文本?

下划线在 Bootstrap 5 导航链接下无法正常工作

如何将内容放置在侧边栏旁边?

如何使容器的大小适合其 position:absolute; 子元素的大小

将图像的高度限制为固定的纵横比,并在超过时使用 object-fit

两部分问题 - 是什么导致了这个空白?

如何并排放置
的定义列表,但如果
变长,
会向下移动?

使用 css 将内容居中并向左对齐?

以 HTML 格式显示的 LaTeX 表格

用 flexbox 和 overflow 覆盖

无法在 css 的 body 标签中正确呈现(内联显示)

粘性定位的子元素忽略父母的填充