如何呈现材料 UI 输入控件而不是材料 UI 日期选择器的文本字段

Posted

技术标签:

【中文标题】如何呈现材料 UI 输入控件而不是材料 UI 日期选择器的文本字段【英文标题】:How to render a material-ui input control instead a textfield for materials-ui-datepicker 【发布时间】:2018-09-28 16:48:47 【问题描述】:

在我的 React (v16.3) 应用程序中,我使用 material-ui-pickers 库的 DatePicker 组件呈现日期选择器控件。这个组件渲染一个 Material-UI TextField 组件。我喜欢更改它,使其仅呈现 Material-UI Input,而没有 TextField 呈现的 chrome。

据我了解,可以使用 DatePickers TextFieldComponent 字段(底部的here)来解决此问题,但我不知道如何使用此字段。

 <DatePicker 
     id=name
     TextFieldComponent=...<HOW_TO> ...
     value=value 
     onChange=this.handleChange
     disabled=isReadOnly />

任何想法如何做到这一点?

更新: 通过找到要使用的正确语法而不是在没有 chrome 的情况下呈现(FormControlInputLabel 等),更进一步。但也不再打开 DatePicker。我必须以编程方式打开它吗?

<DatePicker 
    id=name
    TextFieldComponent=(props) => this.renderInput(props)
    value=value 
    onChange=this.handleChange
    disabled=isReadOnly />

这里是 renderInput():

renderInput(props: TextFieldProps): any 
   return ( <Input
     id=props.id
     value=props.value
     onChange=this.handleChange
     type='text'
     disabled=props.disabled
   /> );
 

【问题讨论】:

您使用的是最新版本吗?材料-ui@下一个?如果最新,请尝试: inputComponent union: string | func 用于本机输入的组件。使用 DOM 元素或组件的字符串。 我使用最新的 vnext material-ui 和 material-ui-pickers。我看不到任何名为“inputComponent”的东西。只有'TextFieldComponent'。 明白你的意思。这正是我试图做的,但没有成功。让它运行到它只呈现输入但现在不再显示数据选择器的地步。我想我需要按语法打开它。见“更新”。 尝试将onClick=props.onClick 添加到您的Input 组件中。 【参考方案1】:

2020 年 10 月更新

@material-ui/pickers v3.x(最新)

要渲染Input 而不是TextField 组件,您可以将自定义组件传递给DatePicker 上的TextFieldComponent 属性。

您需要将以下道具传递给InputvalueonChangeonClick

import React,  useState  from "react";
import  Input, TextFieldProps  from "@material-ui/core";
import  DatePicker  from "@material-ui/pickers";
import  MaterialUiPickersDate  from "@material-ui/pickers/typings/date";

export default function Demo() 
  const [selectedDate, setSelectedDate] = useState<MaterialUiPickersDate>(
    new Date()
  );

  const renderInput = (props: TextFieldProps): any => (
    <Input
      type="text"
      onClick=props.onClick
      value=props.value
      onChange=props.onChange
    />
  );

  return (
    <DatePicker
      label="Basic example"
      value=selectedDate
      onChange=setSelectedDate
      TextFieldComponent=renderInput
    />
  );

@material-ui/pickers v4.0.0-alpha12(下一个)

注意:v4 目前处于 alpha 阶段,因此 API 将来可能会发生变化。

在 V4 中,您可以使用 DatePicker 上的 renderInput 属性来自定义输入 (see docs)。以下示例渲染材质 ui Input 而不是 TextField

import React,  useState  from "react";
import  Input, TextFieldProps  from "@material-ui/core";
import  DatePicker  from "@material-ui/pickers";

export default function Demo() 
  const [selectedDate, setSelectedDate] = useState<Date | null>(new Date());

  const renderInput = (props: TextFieldProps): any => (
    <Input
      type="text"
      inputRef=props.inputRef
      inputProps=props.inputProps
      value=props.value
      onClick=props.onClick
      onChange=props.onChange
      endAdornment=props.InputProps?.endAdornment
    />
  );

  return (
    <DatePicker
      label="Basic example"
      value=selectedDate
      onChange=setSelectedDate
      renderInput=renderInput
    />
  );

【讨论】:

代码沙箱目前正在返回错误 感谢您的提醒!这个答案写于 2018 年,所以它指的是旧版本的 Material UI 和 Material UI Pickers。 CodeSandbox 演示需要使用这些库的当前版本进行重建。我在进行更新时暂时删除了该链接。 @LukePeavey 你有没有想过用当前的 API 来解决这个问题? "@material-ui/pickers": "^4.0.0-alpha.9" 给我带来了很多麻烦 @Murcielago 这个周末我会看看它,看看我是否可以为当前版本的 material-ui 更新它。 @Murcielago 我更新了我的答案并添加了一个使用两个库的最新版本的新沙盒演示。让我知道此解决方案是否适合您。

以上是关于如何呈现材料 UI 输入控件而不是材料 UI 日期选择器的文本字段的主要内容,如果未能解决你的问题,请参考以下文章

对话框中的材料 UI 更改日期字段样式

如何使用获取的变量作为材料 UI 日期选择器的初始状态?

在材料ui的日期选择器中更改formatDate

从材料 ui 处理自动完成组件的更改

使用材料 ui 键盘日期选择器动态设置日期

材料 ui 实验室日期选择器,无法解析“@material-ui/lab/AdapterDateFns”