Я пытался реализовать собственный редактор для строки в моей сетке данных реакции, которую я хочу разрешить пользователю вводить из календаря, а не печатать. Я придумал что-то, что продолжает возвращать неверные даты.
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);
}
handleChangeEvent = (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.handleChangeEvent}
/>
</Form>
);
}
}
Если у кого-то есть идеи, у меня также есть мой эксперимент с кодом здесь Пользовательский редактор React-Data-Grid в CodeSandBox Некоторая ссылка: Календарь семантического пользовательского интерфейса и Пользовательский редактор React-Data-Grid Большое спасибо людям, у которых могут быть некоторые идеи, где я сделал неправильно, очень ценю.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


На самом деле, это работает, если вы дважды щелкнете по вводу даты или начнете печатать там, он покажет вам календарь для выбора даты. Проблема связана с react-data-grid, и это похоже на поведение по умолчанию для react-data-grid. Вы можете увидеть примеры здесь. Проблема уже была создана в сетке данных гитхаб. Надеюсь, они исправят эту проблему.
См. здесь, вы легко можете видеть, что компонент DateEditor работает хорошо. Я просто показал компонент вне компонента react-data-grid.
На данный момент я думаю, что было бы хорошо избегать сетки react-data-grid и вместо этого использовать таблицу из semantic-ui-react.
Надеюсь, это поможет.
Спасибо за быстрый ответ, однако я думаю, что желаемое поведение заключается в том, что ячейка получит дату, которую я выберу. Текущий код выводит дату только сегодня, поэтому мне интересно, не ошибся ли я где-нибудь?
Также, согласно их обсуждению, проблема была решена, я думаю, что у меня проблемы с моим кодом.
О, проблема с датой всегда сегодня из-за dateFormat = {moment().format("L")}, я удалил этот формат момента, и он работает нормально. посмотрите здесь codeandbox.io/s/q3jny4lm9j . Надеюсь, теперь это сработает. Спасибо
Большое спасибо, вы спасли мой день! Следующий вопрос заключается в том, как я предполагаю форматировать MM/DD/YYYY? Большое спасибо!
Здорово! Я также исправляю это в той же песочнице. На самом деле вы можете указать много строк формата, таких же, как форматирование моментов. вот список дополнительных опций: momentjs.com/docs/#/отображение/формат
Для справки, я использую React 16.4.2/React Data Grid 6.1.0/Semantic UI Calendar 0.14.4/Semantic UI 0.84.0 в своей сборке, если использовать зависимости от более старой версии, возникнет проблема с передачей даты, выбранной в RDG.
Проблема заключается в текущем поведении моего кода, независимо от того, какую дату я выбрал, он вернет дату только сегодня.