Как передать значение поля ввода из экспортированного компонента в реакции js

Я не могу получить значение в поле ввода из пользовательского компонента.

dateFormat.jsx

import React from "react";

const DateFormat = ({ seconds, nanoseconds, format }) => {
  const dates = new Date(seconds * 1000 + nanoseconds / 1000000);
  const day = new Date(dates).toLocaleString("default", { day: "2-digit" });
  const month = new Date(dates).toLocaleString("default", { month: "2-digit" });
  const year = new Date(dates).toLocaleString("default", { year: "numeric" });

  if (format === "dd/mm/yyyy") {
    return <>{day + "/" + month + "/" + year}</>;
  }
  return <>{year + "-" + month + "-" + day}</>;
};

export default DateFormat;

Когда я вызываю это DateFormat на другой странице, как в примере ниже, все работает нормально.

<DateFormat
  nanoseconds = {dt.dob.nanoseconds}
  seconds = {dt.dob.seconds}
  format = {"text"}
/>

Вывод такой, как показано ниже

02.12.2001

Однако когда я хочу получить значение в текстовом поле или DatePicker, это не работает нормально.

<input
  type = "date"
  className = "form-control"
  id = "input-datetime-local"
  value = {
    <DateFormat
      nanoseconds = {dt.dob.nanoseconds}
      seconds = {dt.dob.seconds}
      format = {"yyyy/mm/dd"}
    />
  }
  onChange = {(e) => {
    e.preventDefault();
  }}
  name = "dob"
/>

Я ожидаю результата, как показано ниже

<input
  type = "date"
  className = "form-control"
  id = "input-datetime-local"
  value = "2001/02/12"
  onChange = {(e) => {
    e.preventDefault();
  }}
  name = "dob"
/>

🤔 А знаете ли вы, что...
JavaScript позволяет создавать динамические и интерактивные веб-приложения.


1
50
1

Ответ:

Решено

input реквизит value элемента набирается как

React.InputHTMLAttributes<HTMLInputElement>.value?: string | number | readonly string[] | undefined

Это означает, что вы можете передать строку, массив строк, число или неопределенное значение в качестве значения. Передача JSX недопустима.

Я предлагаю преобразовать DateFormat в служебную функцию, которая возвращает вычисленное строковое значение.

const formatDate = ({ seconds, nanoseconds, format }) => {
  const dates = new Date(seconds * 1000 + nanoseconds / 1000000);
  const day = new Date(dates).toLocaleString("default", { day: "2-digit" });
  const month = new Date(dates).toLocaleString("default", { month: "2-digit" });
  const year = new Date(dates).toLocaleString("default", { year: "numeric" });

  if (format === "dd/mm/yyyy") {
    return [day, month, year].join("/");
  }
  return [year, month, day].join("-");
};

export default formatDate;
<input
  type = "date"
  className = "form-control"
  id = "input-datetime-local"
  value = {formatDate({
    nanoseconds: dt.dob.nanoseconds,
    seconds: dt.dob.seconds,
    format: "dd/mm/yyyy", // <-- pass correct format for condition test
  })}                     // <-- "02/12/2001" | "2001-02-12"
  onChange = {(e) => {
    e.preventDefault();
  }}
  name = "dob"
/>