【问题标题】:Getting React state of input that has been selected from datepicker获取已从 datepicker 中选择的输入的 React 状态
【发布时间】:2016-02-24 17:01:08
【问题描述】:

目前正在为表单创建一个反应组件。我正在通过常规 javascript 文件将 datepicker 应用于我的输入,这些输入在 react (jsx) 中呈现。

当从日期选择器中选择日期时,我试图从输入中提取状态。不幸的是,反应并没有获得价值。我知道这可能与从常规 javascript 文件调用 datepicker 到呈现的输入有关。问题是,当我在选择日期后在输入上调用常规 .val 时,它会为我提供值。

另外应该提一下,我正在使用 bootstrap-datepicker

任何建议或建议将不胜感激:)

form.js.jsx

var StepOne = React.createClass({
  getInitialState: function() {
    return {start: '', end: ''};
  },
startDateChange: function(e) {
    this.setState({start: e.target.value});
  },
  endDateChange: function(e) {
    this.setState({end: e.target.value});
  },
  render: function() {
    return (
      <div className="stepOne">
        <ul>
          <li>
            <label>Starts</label>
            <input id="event-start" type="text" value={this.state.start} onChange={this.startDateChange} />
            <label>Ends</label>
            <input id="event-end" type="text" value={this.state.end} onChange={this.endDateChange} />
          </li>
        </ul>
      </div>
    );
  },
}); // end of component

stepone_datepicker.js

$(function() {
  var date = new Date();
  date.setDate(date.getDate()-1);
  $('#event-start, #event-end').each(function() {
    $(this).datepicker({
      autoclose: true,
      minDate: new Date(),
      startDate: date
    });
  });
});

【问题讨论】:

  • 您使用的日期选择器控件是什么?
  • 首先,我注意到您在一端使用this.state.end,并将状态设置为end_date。其次,我不会混合 jquery 对此做出反应。也许您可以尝试 github 上提供的一些 react datepicker 组件。如果你真的需要使用 jQuery,使用 react 组件的 componentDidMount 生命周期钩子来运行你的 jquery 代码,不要乱用 react 的渲染方式。
  • @AlexMoldovan 是正确的。由于 React 的虚拟 DOM 的工作方式,如果 jQuery 从外部修改 DOM,React 不会“知道”它,相反,当 React 重新渲染时,jQuery 不会知道这些更新。如果你想在 React 中使用 jQuery,你需要在 React 的生命周期方法中使用它,并且应该使用 ReactDOM.findDOMNode() 来引用 DOM 元素。
  • 有道理。我知道 jQuery 会对 DOM 产生不同的影响,但不认为它会影响从输入中获取实际值。看起来我终于要让 Browserify 运行并使用实际的反应日期选择器。感谢您帮助我理解这一点!

标签: javascript jquery reactjs datepicker


【解决方案1】:

stepone_datepicker.js 文件中的代码可能在你的 React 组件渲染到 DOM 之前执行。

使用id 来引用 React 组件内的 DOM 节点很少是个好主意,而且通常会导致令人困惑的意大利面条代码。

React 为我们提供了一种通过 refs 机制获取 DOM 节点的方法。

首先,将日期选择器代码移动到组件中的新方法中。

 makeDatePicker: function(element) {
   var date = new Date();
   date.setDate(date.getDate() - 1);

   $(element).datepicker({
     autoclose: true,
     minDate: new Date(),
     startDate: date
   });
 }

现在我们可以为每个输入添加ref 属性,并将这个新方法用作回调。

<label>Starts</label>
<input ref={this.makeDatePicker} type="text" value={this.state.start} onChange={this.startDateChange} />
<label>Ends</label>
<input ref={this.makeDatePicker} type="text" value={this.state.end} onChange={this.endDateChange} />

当元素准备好时,React 将调用makeDatePicker 并将 DOM 节点作为第一个参数传递。

之后就可以截取DOM节点并应用jQuery插件了。

这样您甚至可以渲染StepOne 组件的多个实例,而不必担心id 属性之间的冲突。

【讨论】:

    【解决方案2】:

    这不是正确的做法,使用react-datepicker 可能更好

    但是你可以这样做来手动触发onChange事件

    $(function() {
      var date = new Date();
      date.setDate(date.getDate()-1);
      $('#event-start, #event-end').each(function() {
        $(this).datepicker({
          autoclose: true,
          minDate: new Date(),
          startDate: date,
          onSelect: function( selectedDate ) {
           var event = new Event('input', { bubbles: true });
           this.dispatchEvent(event);
          }
        });
      });
    });
    

    也许更好地使用react-dom 来获取 DOM 节点,我发布的代码更改最少

    【讨论】:

    • 感谢您的来信。只需将 browserify 放入我的应用程序,然后使用实际的反应日期选择器。似乎是让这个工作最简单的方法,所以我没有用 jquery 影响 DOM。
    猜你喜欢
    • 2020-08-26
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 2018-04-19
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    相关资源
    最近更新 更多