Как визуализировать элемент управления вводом material-ui вместо текстового поля для материалов-ui-datepicker

В моем приложении React (v16.3) я визуализирую элементы управления выбора даты с помощью компонента DatePicker библиотеки material-ui-pickers. Этот компонент отображает компонент TextField UI материала. Я хотел бы изменить это так, чтобы он отображал только Material-UI Input без визуализации хрома пользователя TextField.

Как я понял, это можно сделать с помощью поля DatePickers TextFieldComponent (здесь внизу ), но я не мог понять, как использовать это поле.

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

Есть идеи, как это сделать?

Обновление. Мы сделали еще один шаг, найдя правильный синтаксис для использования, а не его визуализацию без хрома (FormControl, InputLabel и т. д.). Но и 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}
   /> );
 }

person Marc    schedule 18.04.2018    source источник
comment
Вы используете последнюю версию? material-ui @ следующий? Если последняя, ​​попробуйте: inputComponent union: string | func Компонент, используемый для собственного ввода. Либо строка для использования элемента DOM, либо компонента.   -  person Adolfo Onrubia    schedule 18.04.2018
comment
Я использую последние версии vnext material-ui и material-ui-pickers. Я не вижу ничего, что называется inputComponent. Только TextFieldComponent.   -  person Marc    schedule 18.04.2018
comment
Понятно, что вы имеете в виду. Это именно то, что я пытаюсь сделать, но безуспешно. Он работает до такой степени, что он только отображает ввод, но теперь сборщик данных больше не отображается. Думаю, мне нужно открыть его грамматически. Смотрите обновление.   -  person Marc    schedule 18.04.2018
comment
Попробуйте добавить onClick={props.onClick} в свой Input компонент.   -  person Luke Peavey    schedule 18.04.2018


Ответы (1)


Обновлено в октябре 2020 г.

@ material-ui / pickers v3.x (последняя версия)

Чтобы отобразить Input вместо компонента TextField, вы можете передать пользовательский компонент в опору TextFieldComponent на DatePicker.

Вам нужно будет передать Input следующие реквизиты: value, onChange и onClick.

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 в настоящее время находится на стадии альфа-тестирования, поэтому API может измениться в будущем.

В V4 вы используете опору renderInput на DatePicker для настройки ввода (см. документацию). В следующем примере отображается материал 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}
    />
  );
}

 Пример редактирования средств выбора материалов в интерфейсе v4

person Luke Peavey    schedule 18.04.2018
comment
Песочница кода в данный момент возвращает ошибку - person Matt Stobbs; 30.04.2020
comment
Спасибо за внимание! Этот ответ был написан в 2018 году, поэтому он относится к более старым версиям Material UI и Material UI Pickers. Демоверсию CodeSandbox необходимо перестроить с использованием текущих версий этих библиотек. Я временно удалил ссылку, пока работаю над ее обновлением. - person Luke Peavey; 03.05.2020
comment
@LukePeavey Вы когда-нибудь пытались понять, как это делается с текущим API? У меня много проблем с "@material-ui/pickers": "^4.0.0-alpha.9" - person Murcielago; 04.10.2020
comment
@Murcielago Я посмотрю на него в эти выходные и посмотрю, смогу ли я обновить его для текущих версий material-ui. - person Luke Peavey; 04.10.2020
comment
@Murcielago Я обновил свой ответ и добавил новую демонстрацию песочницы, в которой используется последняя версия обеих библиотек. Сообщите мне, работает ли это решение для вас. - person Luke Peavey; 04.10.2020
comment
@Murcielago Извините, я только что понял, что вы спрашивали об альфа-версии v4. Завтра я посмотрю на API v4 и добавлю второй пример. - person Luke Peavey; 04.10.2020
comment
@Murcielago Я добавил пример, используя @ material-ui / pickers 4.0.0-alpha - person Luke Peavey; 05.10.2020
comment
Привет, @ Люк Пиви, извини, что побеспокоил тебя. Я пытаюсь этого добиться. Все работает нормально, за исключением того, что мой сборщик отображается не на своем месте. У меня есть эта ошибка: Material-UI: Опора anchorEl, предоставленная компоненту, недействительна. Есть ли у вас какие-либо идеи? Спасибо за вашу помощь - person Nicolas Ould Bouamama; 06.11.2020
comment
@NicolasOuldBouamama Не уверен, что могло быть причиной этого. Трудно сказать, не увидев вашего кода. Я бы предложил создать для этого новый вопрос. Я был бы рад взглянуть на это! - person Luke Peavey; 06.11.2020
comment
@LukePeavey спасибо за ваш ответ. Я только что обнаружил, что использование TextFieldComponent со встроенным вариантом вызывает проблему с v3.x, поэтому я изменил вариант на диалог, и теперь все работает нормально. В любом случае спасибо - person Nicolas Ould Bouamama; 06.11.2020
comment
@NicolasOuldBouamama рад, что вы смогли это понять - person Luke Peavey; 07.11.2020