Пользовательский редактор таблицы данных React работает с средством выбора даты в календаре semantic ui (dateinput)

#javascript #reactjs #semantic-ui #semantic-ui-react #react-data-grid

#javascript #reactjs #semantic-ui #semantic-ui-react #react-data-grid

Вопрос:

Я пытался реализовать пользовательский редактор для строки в моей таблице данных react, которую я хочу разрешить пользователю вводить из календаря вместо ввода. Я придумал кое-что, что продолжает возвращать недопустимые даты.

index.js

 import React, { Component } from "react";
import ReactDOM from "react-dom";
import "semantic-ui-css/semantic.min.css";
import {
  Icon,
  Menu,
  Checkbox,
  Grid,
  Dropdown,
  Rail,
  Segment,
  MenuHeader,
  Responsive
} from "semantic-ui-react";
import ReactDataGrid from "react-data-grid";
import autoBind from "react-autobind";
import { Editors, Formatters, Data, Filters } from "react-data-grid-addons";
import { connect } from "react-redux";
import moment from "moment";
import DateEditor from "./DateEditor";

import "./styles.css";

const columns = [
  { key: "id", name: "ID" },
  { key: "title", name: "Title" },
  { key: "date", name: "Date", editor: DateEditor }
];

const rows = [
  { id: 0, title: "Task 1", issueType: "Bug", labelColour: "#1D1D1F" },
  { id: 1, title: "Task 2", issueType: "Story", labelColour: "#1D1D1F" },
  { id: 2, title: "Task 3", issueType: "Epic", labelColour: "1D1D1F" }
];

class Example extends React.Component {
  state = { rows };

  onGridRowsUpdated = ({ fromRow, toRow, updated }) => {
    this.setState(state => {
      const rows = state.rows.slice();
      for (let i = fromRow; i <= toRow; i  ) {
        rows[i] = { ...rows[i], ...updated };
      }
      return { rows };
    });
  };
  render() {
    return (
      <div>
        <ReactDataGrid
          columns={columns}
          rowGetter={i => this.state.rows[i]}
          rowsCount={3}
          onGridRowsUpdated={this.onGridRowsUpdated}
          enableCellSelect={true}
        />
      </div>
    );
  }
}

const rootElement = document.getElementById("root");
ReactDOM.render(<Example />, rootElement);
  

DateEditor.js


 import { DateInput } from "semantic-ui-calendar-react";
import React, { Component } from "react";
import ReactDOM from "react-dom";
import { Form } from "semantic-ui-react";
import autoBind from "react-autobind";
import moment, { isMoment } from "moment";

export default class DateEditor extends React.Component {
  constructor(props) {
    super(props);
    this.state = { dateEditor: "" };
    autoBind(this);
    //moment(props.value).format('L')
  }
  getValue() {
    //return { date: moment(this.state.dateEditor).format("L") };
    return { date: this.state.dateEditor };
  }

  getInputNode() {
    return ReactDOM.findDOMNode(this);
  }

  handleChange = (event, { name, value }) => {
    this.setState({ [name]: value }, () => this.props.onCommit());
    //if (this.state.hasOwnProperty(name)) {
    //  this.setState({ [name]: value }, () => this.props.onCommit()); //);
    //}
  };

  render() {
    return (
      <Form>
        <DateInput
          name="dateEditor"
          dateFormat={moment().format("L")}
          placeholder="Date"
          value={this.state.dateEditor}
          //{moment(this.state.date).format('L')}
          iconPosition="left"
          onChange={this.handleChange}
        />
      </Form>
    );
  }
}
  

Если у кого-то есть идеи, у меня также есть свой фрагмент кода для эксперимента здесь Пользовательский редактор React-Data-Grid в CodeSandbox
Некоторые ссылки: Semantic UI Calendar и пользовательский редактор React-Data-Grid Большое спасибо, у людей могут быть какие-то идеи, где я поступил неправильно, действительно ценю.

Комментарии:

1. Проблема заключается в текущем поведении моего кода, независимо от того, какую дату я выбрал, она вернет только сегодняшнюю дату.

Ответ №1:

На самом деле, это работает, если вы дважды щелкните на вводимой дате или начнете вводить там, он покажет вам календарь для выбора даты. Проблема связана с react-data-grid, и похоже, что поведение react-data-grid по умолчанию. Вы можете увидеть примеры здесь. Проблема уже была создана на github reach-data-grid, надеюсь, они исправят эту проблему.

Смотрите здесь, вы можете легко убедиться, что компонент DateEditor работает хорошо. Я только что показал компонент там, за пределами компонента react-data-grid.

На данный момент, я думаю, было бы неплохо избежать react-data-grid и вместо этого использовать таблицу из semantic-ui-react.

Надеюсь, это поможет.

Комментарии:

1. Спасибо за быстрый ответ, однако я думаю, что желаемое поведение заключается в том, что ячейка получит дату по моему выбору. Текущий код выводит только сегодняшнюю дату, поэтому мне интересно, не сделал ли я где-то неправильно?

2. Также, согласно их обсуждению, проблема была решена, я думаю, что у меня возникли некоторые проблемы с моим кодом

3. О, проблема с датой всегда сегодняшней заключается в том, что dateFormat={moment().format("L")} я удалил этот формат moment, и он работает нормально. ознакомьтесь здесь codesandbox.io/s/q3jny4lm9j . Надеюсь, теперь это сработает. Спасибо

4. Большое вам спасибо, вы спасли мой день! Следующий вопрос заключается в том, как я предполагаю форматировать в ММ / ДД / ГГГГ? Большое спасибо!

5. Отлично! Я также исправляю это в той же изолированной среде. На самом деле вы можете задать множество строк формата, аналогичных moment formatter. вот список дополнительных опций: momentjs.com/docs/#/displaying/format