React - значение ввода даты не обновлено до состояния

В моем приложении React я могу установить состояние и обновить базу данных для всех значений, кроме поля ввода даты. Мой код ниже:

    import React, { Component } from 'react'
    ...
    ...
    import DateInput from '../others/input/datePicker'
    ...
    ..
      change = (what, e) => this.setState({ [what]: e.target.value })

      changeDOB() {
        this.setState({ age: document.getElementByClassNames("datePicker").value })
      }

      render() {
        let {
    ...
    ...
    age,
    ...
      } = this.state
    ...
    ...
    //date of birth
    let stringAge = age.toString()
    stringAge =
      stringAge.substring(0, 4) +
      '-' +
      stringAge.substring(4, 6) +
      '-' +
      stringAge.substring(6, 8)
    ...
                    <DateInput
                      type = "date"
                      change = {this.changeDOB}
                      placeholder = {stringAge}
                      className = "datePicker"
                    />

...
...
const mapStateToProps = store => ({
  ud: store.User.user_details,
  tags: store.User.tags,
  session: store.User.session,
})

export default connect(mapStateToProps)(EditProfile)
export { EditProfile as PureEditProfile }

Вот код DateInput:

import React from 'react'
import { string, func, oneOf, bool } from 'prop-types'

const DateInput = ({ type, placeholder, ...props }) => (
  <input
    type = {type}
    placeholder = {placeholder}
    spellCheck = "false"
    autoComplete = "false"
    {...props}
  />
)

DateInput.defaultProps = {
  type: 'date',
  placeholder: '',
  disabled: false,
}

DateInput.propTypes = {
  type: oneOf(['date']),
  placeholder: string.isRequired,
  maxLength: string,
  disabled: bool,
}

export default DateInput

Я пробовал this.change, как и другие поля, но это тоже не работает.

Как обновить новое значение в состоянии?

Примечание: красный текст - это значение, которое в настоящее время находится в базе данных.

React - значение ввода даты не обновлено до состояния

Кажется, вы не привязываете this.changeDOB в конструкторе. Добавьте this.changeDOB = this.changeDOB.bind (это); в конструкторе или используйте стрелочные функции. Также вы передаете this.changeDOB для изменения свойств в компоненте DateInput, так что DateInput - это библиотека или ваш пользовательский компонент?

Hemadri Dasari 04.09.2018 06:32

Пожалуйста, включите также код компонента DateInput

Harikrishnan 04.09.2018 06:33

не могли бы вы приставить document.getElementByClassNames("datePicker").value к функции changeDOB?

Amruth L S 04.09.2018 06:38

импортировать DateInput из "../others/input/datePicker"?

Thilina Sampath 04.09.2018 06:53
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
4
7 024
2

Ответы 2

Вы передаете все реквизиты входному компоненту, но вам нужно передать свою функцию обработчика событий в элемент ввода onchange или вместо этого попробовать onkeypress. Что-то вроде ниже. Вы также можете попробовать получить входное значение с событием вместо документа

Функция стрелки: нет необходимости в ручном связывании

changeDOB = (event) => {
    this.setState({ age: event.target.value 
      })
  }

<DateInput
    type = "date"
    change = {this.changeDOB}
    placeholder = {stringAge}
    className = "datePicker"
    value = {this.state.age}
 />

<input
    type = {type}
    placeholder = {placeholder}
    spellCheck = "false"
    autoComplete = "false"
    onchange = {(event) => props.change(event)}
    value = {props.value}
    {...props}
  />

Нормальная функция: требуется привязка и только в конструкторе

this.changeDOB = this.changeDOB.bind(this);

  changeDOB(event){
    this.setState({ age: event.target.value  
      })
  }

<DateInput
    type = "date"
    change = {this.changeDOB}
    placeholder = {stringAge}
    className = "datePicker"
    value = {this.state.age}
 />


  <input
    type = {type}
    placeholder = {placeholder}
    spellCheck = "false"
    autoComplete = "false"
    onchange = {props.change}
    value = {props.value}
    {...props}
  />

Спасибо. Как только я добавляю value= в поле ввода даты, средство выбора даты больше не меняет дату. Когда я меняю тип ввода на простое текстовое поле вместо DateInput, база данных обновляется. Значит, я что-то не так делаю. Я попробую завтра и обновлю, так как уже поздно. Спасибо за помощь

Kal 04.09.2018 07:13

Не работает - состояние не обновляется, а также средство выбора даты не меняет дату при добавлении значения.

Kal 04.09.2018 23:37

Вам необходимо добавить атрибут onChange для поля ввода в компоненте DateInput как

const DateInput = ({ type, placeholder, ...props }) => (
  <input
    type = {type}
    placeholder = {placeholder}
    spellCheck = "false"
    autoComplete = "false"
    onChange = {props.Onchange}
    {...props}
  />
)

Тогда ваш основной компонент должен быть таким

  changeDOB(e) {
       this.setState({ age: e.target.value });
  }

  render() {
    return(
              <DateInput
                  type = "date"
                  Onchange = {this.changeDOB}
                  placeholder = {stringAge}
                  className = "datePicker"
                />
          )
             }

Найдите рабочий пример здесь

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

Kal 04.09.2018 07:06

Нет, состояние по-прежнему имеет то же значение. НО, если я изменю тип ввода на простое текстовое поле вместо DateInput, база данных будет обновлена. Так что я делаю что-то не так

Kal 04.09.2018 07:16

@Harikrishnan - да, мне пришлось изменить getElementById - changeDOB = () => {this.setState({ age: document.getElementById("datePicker").value })} .. По какой-то причине getElementByClassName вызывало проблему. Также пришлось добавить value = {age} в DateInput

Kal 05.09.2018 06:10

Другие вопросы по теме