Как правильно перехватить значение DatePicker для Materialise-CSS в React? - PullRequest
0 голосов
/ 19 декабря 2018

Я хочу создать форму с datepicker в моем компоненте React с materialize-css .У меня не так много полей, эта форма захватывает, и структура довольно проста.Возвращенная форма выглядит следующим образом:

<form onSubmit={this.handleSubmit.bind(this)}>
     <div className="container">
          <div className="card grey lighten-3">
               <div className="card-content black-text">
                    <span className="card-title">
                            <input placeholder="Event Name"
                                    name="name" value={this.state.name}
                                    onChange={this.handleStateChange.bind(this)}/>
                    </span>
                    <input name="description" placeholder="Description"
                                      value={this.state.description}
                                      onChange={this.handleStateChange.bind(this)}/>
                    <input name="image" placeholder="Image URL"
                                      value={this.state.image}
                                      onChange={this.handleStateChange.bind(this)}/>
                    <input placeholder="Start Date"
                                className="datepicker" name="startDate" value={this.state.startDate}
                                onSelect={this.handleStateChange.bind(this)}/>
                </div>
                <div class="card-action">
                    <div className="row">
                        <span>
                           <div className="col s3">
                               <input className="btn light-blue accent-1" type="submit" value="Submit"/>
                           </div>
                           <div className="col s3">
                               <a className="btn grey" onClick={this.handleExpand.bind(this)}>Cancel</a>
                           </div>
                       </span>
                   </div>
               </div>
           </div>
       </div>
   </form>

Изменение состояния обрабатывается с помощью

handleStateChange(item) {
    this.setState({[item.target.name]: item.target.value});
}

, и я вызвал AutoInit для инициализации моего средства выбора даты

M.AutoInit();

Я пытался использовать onChange вместо onSelect для управления изменением состояния средства выбора даты, но, похоже, это событие не фиксируется.При использовании onSelect дата иногда захватывается, если я выбираю дату, а затем снова открываю средство выбора даты.

Я также пытался использовать некоторые из альтернативных методов инициализации для средства выбора даты , но безрезультатно.

Как правильно зафиксировать изменение входа при заданной настройке?

Ответы [ 4 ]

0 голосов
/ 06 августа 2019

Ни один из уже добавленных ответов не помог мне, поэтому я решил сделать это по-своему.Я не устанавливал Materialise и jQuery в свои модули, просто добавил их в index.html

Когда вы щелкаете по полю ввода, открывается модальное окно datepicker и там две кнопки CANCEL и OK.Я нахожу эту кнопку OK с помощью jQuery и добавляю функцию щелчка, которая получает значение из поля ввода и обновляет состояние;

componentDidMount(){
window.$(".datepicker-done").click(() => {
      var datepickerValue = window.$("#date-input").val();  // date-input it's 'id' on datepicker input

      this.setState({ approxLastDay: datepickerValue });
    });
}

ПРИМЕЧАНИЕ: datepickerValue будет в строковом формате (например, «Aug»).6, 2019 ")

0 голосов
/ 27 марта 2019

Спасибо, Лукас, твой ответ мне тоже помог.

Вот мое решение - без редукса или реквизита, только компонент класса с собственным состоянием

import React, { Component } from "react";
import "./calendar.css";
import Materialize from "materialize-css";
import moment from "moment";

class Calendar extends Component {
  componentDidMount() {
    var context = this;

    var elems = document.querySelectorAll(".dateset");
    Materialize.Datepicker.init(elems, {
      defaultDate: new Date(),
      format: this.state.format,
      container: "body",
      onSelect: function(date) {
        context.setState({ value: context.state.value });
        console.log(date); // Selected date is logged
      },
      autoClose: true
    });
  }

  state = {
    value: new Date(),
    format: "ddd d, mmm",
    formatMoment: "ddd D, MMM"
  };

  render() {
    return (
      <div className="input-field col s6">
        <i className="material-icons prefix">date_range</i>
        <input
          id="date"
          type="text"
          className="datepicker dateset"
          defaultValue={moment(this.state.value).format(
            this.state.formatMoment
          )}
        />
      </div>
    );
  }
}

export default Calendar;
0 голосов
/ 02 августа 2019

Привет, надеюсь, это кому-нибудь поможет -

Что происходит с Компонент состоит в том, что метод onChange по умолчанию возвращает дату (2019-08-01), а не объект-обработчик события элемента.Чтобы противостоять этому, нам нужно создать объект внутри метода onChange, который имитирует target.id и target.value обработчика событий

Другие компоненты, такие как работает как обычно.Проверьте это:

Вот как должен выглядеть компонент:

            <DatePicker
                label="myDate"
                value={state.myDate}
                id="myDate"
                onChange={(newDate) => {
                    handleChange({
                        target: {
                            id: "myDate",
                            value: newDate
                        }
                    })
                }} />

Вот полный код:

import React, { useState, useEffect } from "react";
import "materialize-css/dist/css/materialize.min.css";
import "materialize-css/dist/js/materialize.min.js";
import { DatePicker } from "react-materialize";

const PickDate = (props) => {

    const [state, setState] = useState({myName: "Mags", myDate: "2019-08-01"});

    const handleChange = (e) => {
        const key = e.target.id;
        const val = e.target.value;

        const newState = {...state};
        newState[key] = val;
        setState(newState);
    }

    return (
        <React.Fragment>
            <input type="text" value={state.myName} id="myName" onChange={handleChange} />
            <DatePicker
                label="myDate"
                value={state.myDate}
                id="myDate"
                onChange={(newDate) => {
                    handleChange({
                        target: {
                            id: "myDate",
                            value: newDate
                        }
                    })
                }} />
        </React.Fragment>
    );
}

export default PickDate;

PS.он использует React Hooks - но он будет работать и на обычных классах.

0 голосов
/ 25 февраля 2019

После изучения всей субботы о жизненном цикле React.Я получил это решение для этого:

Использование компонента:

    <DatePicker label="Fecha" value={this.state.formSchedule.start} 
onChange={(date) => {
    this.state.formSchedule.start = date;
    this.setState({ formSchedule: this.state.formSchedule });
}}/>

Класс DatePicker.tsx:

    import * as React from 'react';
import Materialize from 'materialize-css';
import moment from 'moment'
import 'moment/locale/es'
import { any } from 'prop-types';


interface IState {
  value: any;
}

interface IProps {
  label: any;
  format: any;
  onChange: any;
  formatMoment: any;
}

export default class DatePicker extends React.Component<IProps, IState> {

  static defaultProps = {
    label: "Fecha",
    value: new Date(),
    format: 'ddd d, mmm',
    formatMoment: 'ddd D, MMM'
  }

  constructor(props: any) {
    super(props);
    this.componentWillReceiveProps(props);
  }

  componentWillReceiveProps(props) {
    this.state = {
      value: props.value
    };
  }

  render() {
    return <div className="input-field col s6">
      <i className="material-icons prefix">date_range</i>
      <input id="date" type="text" className="datepicker queso"
        value={moment(this.state.value).locale('es').format(this.props.formatMoment)}
      />
      <label className="active" htmlFor="date">{this.props.label}</label>
    </div>;
  }


  componentDidMount() {
    var context = this;

    var elems = document.querySelectorAll('.queso');
    Materialize.Datepicker.init(elems, {
      defaultDate: new Date(),
      format: this.props.format,
      container: 'body',
      onSelect: function (date) {
        context.setState({ value: context.state.value });
        context.props.onChange(date);
      },
      autoClose: true
    } as Partial<any>);

  }
}
...