【问题标题】:React-bootstrap-daterangepicker with input behaves weirdly带有输入的 React-bootstrap-daterangepicker 行为怪异
【发布时间】:2019-05-15 12:18:21
【问题描述】:

我正在尝试使用带有输入的react-bootstrap-datepicker,但遇到了一个令人不快的错误:每次单击其中一个输入或按任意键时,都会切换日历(如果它被隐藏并且显示反之亦然)。我在代码沙箱上复制了它:https://codesandbox.io/s/4zx1l0n6p4 你还可以看到我在那里使用的依赖项的版本。 我不确定问题出在包中还是在我的代码中,因此我将不胜感激!

【问题讨论】:

标签: jquery reactjs datepicker bootstrap-daterangepicker


【解决方案1】:

您需要更新您的代码以喜欢这样,并且需要在日期选择器中添加处理程序以在您选择日期时处理更改。我在您的代码中添加了 handelEvent 方法。

import React from "react";
import ReactDOM from "react-dom";

import "./styles.css";
import "bootstrap/dist/css/bootstrap.css";
import DateRangePicker from "react-bootstrap-daterangepicker";
// you will need the css that comes with bootstrap@3. if you are using
// a tool like webpack, you can do the following:
import "bootstrap/dist/css/bootstrap.css";
// you will also need the css that comes with bootstrap-daterangepicker
import "bootstrap-daterangepicker/daterangepicker.css";

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      inputStart: "01/01/2018",
      inputFinish: "02/01/2018"
    };
    this.handleEvent = this.handleEvent.bind(this);
  }
  handleChangeS = event => {
    event.preventDefault();
    event.stopPropagation();
    this.setState({ inputStart: event.target.value });
  };
  handleChangeF = event => {
    this.setState({ inputFinish: event.target.value });
  };

  handleEvent(event, picker) {
    this.setState({
      inputStart: picker.startDate,
      inputFinish: picker.endDate
    });
  }
  render() {
    return (
      <div className="App" style={{ paddingTop: 30 }}>
        <DateRangePicker
          autoApply={true}
          autoUpdateInput={false}
          startDate={this.state.inputStart}
          endDate={this.state.inputFinish}
          locale={{ format: "DD/MM/YYYY" }}
          onEvent={this.handleEvent}
        >
          <input
            type="text"
            value={this.state.inputStart}
            onChange={this.handleChangeS}
          />
          <input
            type="text"
            value={this.state.inputFinish}
            onChange={this.handleChangeF}
          />
        </DateRangePicker>
      </div>
    );
  }
}

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

【讨论】:

  • 谢谢,但很遗憾,它并没有解决我的问题,我更新了我的代码框,所以你可以看到它:codesandbox.io/s/kwy30z9rl3
  • 您能否详细说明您所面临的实际问题。
  • 当然!如果您打开我的沙箱并尝试在其中一个输入中输入内容,或者只是用箭头键移动光标,则日历将在每次按键时显示/隐藏,并且不应该是这样。它的行为应该更像这样:daterangepicker.com/#examples
  • 我想我遇到了您的问题,您需要删除 autoApply 并需要通过 'onApply={this.handleEvent}' 更新 onEvent。之后,当您单击日期时,它不会切换日期选择器。
  • autoApply 选项仅控制此:“隐藏应用和取消按钮,并在单击两个日期后自动应用新的日期范围。”,所以这并不重要,但我改变了一切都按照你的建议,但它仍然不起作用。 (此外,codesandbox 上有一个选项可以创建一个沙盒并自己编辑它,所以如果您愿意,请随意使用我的代码 :))
【解决方案2】:

更新:我设法通过安装 3.4.0 版并用单个输入替换两个输入来使其工作:https://codesandbox.io/s/kwy30z9rl3。 我描述的错误可能是由于在更高版本之一中添加了包装器 div 引起的。在最新版本中,react-bootstrap-daterangepicker 将您传递给它的任何子项包装到一个容器中:

render() {
const { children, containerStyles, containerClass } = this.props;
return (
  <div
    ref={picker => {
      this.$picker = $(picker);
    }}
    className={containerClass}
    style={containerStyles}
  >
    {children}
  </div>
);

}

并且 bootstrap-daterangepicker 检查日期选择器的父级是否是输入/按钮并应用必要的事件处理程序:

if (this.element.is('input') || this.element.is('button')) {
this.element.on({
    'click.daterangepicker': $.proxy(this.show, this),
    'focus.daterangepicker': $.proxy(this.show, this),
    'keyup.daterangepicker': $.proxy(this.elementChanged, this),
    'keydown.daterangepicker': $.proxy(this.keydown, this) //IE 11 compatibility
});
} else {
    this.element.on('click.daterangepicker', $.proxy(this.toggle, this));
    this.element.on('keydown.daterangepicker', $.proxy(this.toggle, this));
}

而且由于所讨论的元素是一个普通的 div,因此输入上的每次点击或按键都会触发切换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-20
    • 2021-03-21
    • 1970-01-01
    • 2020-07-18
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多