设置日期选择器 onChange 的状态

Setting state of Date Picker onChange

我正在尝试使用 html 日期选择器根据当前选择的日期更新我的两个状态。两个州;开始日期和结束日期,其中 none 正在更新 onChange。基于这些更新的状态,我需要使用这些状态数据作为查询参数来获取数据。它仅控制初始状态日期。

代码如下:

import React, { Component } from "react";
import axios from "axios";

export default class Main extends Component {
  constructor() {
    super();


    var date = new Date();


    var newdate =
      date.getFullYear() +
      "-" +
      ("0" + (date.getMonth() + 1)) +
      "-" + 
      ("0" + (date.getDate())) ;



    this.state = {
      startdate: newdate,
      enddate: newdate,
      clicked: false
    };
  }


  setStartDate = e => {
      this.setState({
        startdate: e.target.value
      })

      console.log(this.state.startdate, 'STARTDATE');
  }



  setEndDate = e => {
    //console.log(e.target.value)

    this.setState({
      enddate: e.target.value,
    });

    console.log(this.state.enddate, 'ENDDATE');
    axios.post('http://132.148.144.133:5000/api/v2/resources/sentiments', {
        sentiment_type: 'positive',
        startdate:this.state.startdate,
        enddate: this.state.enddate
    })
    .then( (result) => {

        console.log(result.data)
    })
    .catch(err => {
        console.log(err)
    })
  }


  render() {
    return (
      <div>
        <label>From</label>
        <input
          type="date"
          name="startdate"
          value={this.state.startdate}
          onChange={this.setStartDate}
        />

        <label>To</label>
        <input
          type="date"
          name="enddate"
          value={this.state.enddate}
          onChange={this.setEndDate}
        />
      </div>
    );
  }
}

我必须在第二个输入框更新为选择器中的选定日期后立即获取数据。

试试这个代码:

import React, { Component } from "react";
import axios from "axios";

export default class Main extends Component {
  constructor() {
    super();
    const date = new Date();
    const newDate =
      date.getFullYear() +
      "-" +
      ("0" + (date.getMonth() + 1)) +
      "-" +
      ("0" + date.getDate());

    this.state = {
      startDate: newDate,
      endDate: newDate
    };
  }

  handleDateChange = ({ target: { name, value } }) => {
    this.setState({
      [name]: value
    });

    if (name === "endDate") {
      const { endDate, startDate } = this.state;
      axios
        .post("http://132.148.144.133:5000/api/v2/resources/sentiments", {
          sentiment_type: "positive",
          startdate: startDate,
          enddate: endDate
        })
        .then(result => {
          console.log(result.data);
        })
        .catch(err => {
          console.log(err);
        });
    }
  };

  render() {
    const { endDate, startDate } = this.state;
    console.log(this.state);
    return (
      <>
        <label>From</label>
        <input
          type="date"
          name="startDate"
          value={startDate}
          onChange={this.handleDateChange}
        />
        <label>To</label>
        <input
          type="date"
          name="endDate"
          value={endDate}
          onChange={this.handleDateChange}
        />
      </>
    );
  }
}

使用管理日期更改的通用方法更加简洁。我也觉得可以随意重构一下。让我知道它是否按照您想要的方式工作。

我认为您应该尝试代替 this.setStartDate(e)=> this.setStartDate(e) 和其他

回答了3年,但我只想添加一个Typescript + Functional Component的例子。我使用 MomentJS 将日期解析为字符串。 顺便说一句,我不认为每次用户更改结束日期时触发 axios.post 是个好主意。也许他们可能会选择错误的值。为什么不是 post 按钮?

import moment from "moment"

const YourFC = (): JSX.Element => {
  //The input type date accepts only "YYYY-MM-DD" format
  const now = moment(new Date()).format("YYYY-MM-DD")

  const [startDate, setStartDate] = useState<string | undefined>(now)
  const [endDate, setEndDate] = useState<string | undefined>(now)

  const post = ():void => {
    axios
    .post("http://132.148.144.133:5000/api/v2/resources/sentiments", {
      sentiment_type: "positive",
      startdate: startDate,
      enddate: endDate
    })
    .then(result => {
      console.log(result.data);
    })
    .catch(err => {
      console.log(err);
    });
  }

  return (
    <>
      <Input
        type={"date"}
        value={startDate}
        onChange={(e: ChangeEvent<HTMLInputElement>) => setStartDate(e.currentTarget.value)}
      />
      <Input
        type={"date"}
        value={endDate}
        onChange={(e: ChangeEvent<HTMLInputElement>) => setEndDate(e.currentTarget.value)}
      />
      <Button onClick={post}>Post</Button>
    </>
  )
}