【问题标题】:Material UI Date Range Picker材质 UI 日期范围选择器
【发布时间】:2020-08-30 02:59:52
【问题描述】:

我正在尝试按照文档上的代码设置材料 ui 日期范围选择器示例,但它给了我一个错误,TypeError: undefined is not a function。

我以前从未见过 useState 后跟组件,这就是引发错误的原因。

React.useState<DateRange>([null, null])

https://dev.material-ui-pickers.dev/demo/daterangepicker

完整代码:

import * as React from "react";
import { TextField } from "@material-ui/core";
import { DateRangePicker, DateRange, DateRangeDelimiter } from "@material-ui/pickers";

function BasicDateRangePicker() {
  const [selectedDate, handleDateChange] = React.useState<DateRange>([null, null]);

  return (
    <DateRangePicker
      startText="Check-in"
      endText="Check-out"
      value={selectedDate}
      onChange={date => handleDateChange(date)}
      renderInput={(startProps, endProps) => (
        <>
          <TextField {...startProps} />
          <DateRangeDelimiter> to </DateRangeDelimiter>
          <TextField {...endProps} />
        </>
      )}
    />
  );
}

export default BasicDateRangePicker;

【问题讨论】:

  • 我意识到错误是使用 TypeScript 造成的,但我不是,有没有简单的方法可以将它转换为非 TypeScript?
  • 只需在 ``React.useState` 之后删除 &lt;DateRange&gt;
  • 这样做会产生一个不同的错误“ React.createElement: type is invalid -- 期望一个字符串(对于内置组件)或一个类/函数(对于复合组件)但得到:未定义。你可能忘记从定义组件的文件中导出组件,或者您可能混淆了默认和命名导入“
  • 该示例适用于 v4。你在用v4.0.0-alpha.7吗?还是您使用的是 v3?
  • 我正在使用 v4.0.0-alpha.7

标签: reactjs material-ui


【解决方案1】:

它不适合我,我使用了所有 alpha 版本,它显示此错误 TypeError:无法读取未定义的属性“keyboardDate”

99 | ...其他, 100 |价值, 101 |改变,

102 |输入格式:通过输入格式 || utils.formats.keyboardDate, | ^ 103 | }; 104 | 105 | const restProps = {

稳定版说找不到 DateRangePicker

【讨论】:

【解决方案2】:

我也遇到了带有打字稿的 Mui DateRangePicker 错误, “类型 'null[]' 缺少类型 'RangeInput' 的以下属性:0、1”

最新版本 --> "@material-ui/pickers": "^4.0.0-alpha.12" , “日期-fns”:“^2.16.1”

工作代码:

import React from "react";
import TextField from "@material-ui/core/TextField"
import {
  DateRangePicker,
  DateRangeDelimiter,
  LocalizationProvider,
  DateRange,
} from "@material-ui/pickers"
import DateFnsUtils from "@material-ui/pickers/adapter/date-fns"

export default function BasicDateRangePicker() {
  const [selectedDate, handleDateChange] = React.useState<DateRange<Date | null>>([null, null]);

  return (
    <LocalizationProvider dateAdapter={DateFnsUtils}>
      <DateRangePicker
        startText="from"
        endText="to"
        value={selectedDate}
        onChange={(date: any) => handleDateChange(date)}
        renderInput={(startProps: any, endProps: any) => (
            <>
              <TextField {...startProps} />
              <DateRangeDelimiter> to </DateRangeDelimiter>
              <TextField {...endProps} />
            </>
          )
        }
      />
    </LocalizationProvider>
  );
}

【讨论】:

    【解决方案3】:

    以下是工作版本。我添加了LocalizationProvider 并删除了&lt;DateRange&gt; Typescript 语法。

    import React from "react";
    import TextField from "@material-ui/core/TextField";
    import {
      DateRangePicker,
      DateRangeDelimiter,
      LocalizationProvider
    } from "@material-ui/pickers";
    import DateFnsUtils from "@material-ui/pickers/adapter/date-fns"; // choose your lib
    
    export default function BasicDateRangePicker() {
      const [selectedDate, handleDateChange] = React.useState([null, null]);
    
      return (
        <LocalizationProvider dateAdapter={DateFnsUtils}>
          <DateRangePicker
            startText="Check-in"
            endText="Check-out"
            value={selectedDate}
            onChange={date => handleDateChange(date)}
            renderInput={(startProps, endProps) => (
              <>
                <TextField {...startProps} />
                <DateRangeDelimiter> to </DateRangeDelimiter>
                <TextField {...endProps} />
              </>
            )}
          />
        </LocalizationProvider>
      );
    }
    

    【讨论】:

    • 你在生产中使用它吗?我知道网站上说它不适合生产使用,所以我有点担心可能会发生一些不愉快的事情
    • @foreverAnIntern v4 alpha(这个问题专门针对这个问题)不被认为可以用于生产,但 v3.2.10 可以用于生产。作为 Material-UI v5 的一部分,选择器正在迁移到 @material-ui/lab (next.material-ui.com/components/date-picker),并且可能会在实验室期间对 API 进行一些更改。
    • @Ryan 届时将不再使用它。我需要日期范围选择器,但似乎 material-ui 仅通过其高级包提供。感谢您的信息
    【解决方案4】:

    DateRangePicker 组件也需要DateFnsAdapter 并且整个块应该用LocalizationProvider 包裹。

    您的代码应如下所示:

    import React from 'react';
    import { TextField } from "@material-ui/core";
    import DateFnsAdapter from '@material-ui/pickers/adapter/date-fns'; // choose your lib
    import { DateRangePicker, DateRange, DateRangeDelimiter, LocalizationProvider } from "@material-ui/pickers";
    
    
    function BasicDateRangePicker() {
      const [selectedDate, handleDateChange] = React.useState<DateRange>([null, null]);
    
      return (
        <LocalizationProvider dateAdapter={DateFnsUtils}>
          <DateRangePicker
            startText="Check-in"
            endText="Check-out"
            value={selectedDate}
            onChange={date => handleDateChange(date)}
            renderInput={(startProps, endProps) => (
              <>
                <TextField {...startProps} />
                <DateRangeDelimiter> to </DateRangeDelimiter>
                <TextField {...endProps} />
              </>
            )}
          />
        </LocalizationProvider>
      );
    }
    
    export default BasicDateRangePicker;
    

    您可以在quick startinstallation 中阅读有关dateAdapter 的更多信息。

    【讨论】:

    • 谢谢,但我仍然收到错误 TypeError: undefined is not a function on React.useState&lt;DateRange&gt;([null, null])
    • 我对 typescript 不太熟悉,VS Code 在 上说“类型参数只能在 TypeScript 文件中使用”。这个的非打字稿版本是什么?
    • 非打字稿版本呢?有吗?
    • @Omid 只需删除useState 之后的&lt;DateRange&gt;
    猜你喜欢
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多