Javascript 如何使浏览器自动填充值显示在序列化的React`Field`组件数据中?

Javascript 如何使浏览器自动填充值显示在序列化的React`Field`组件数据中?,javascript,forms,autofill,reactjs,Javascript,Forms,Autofill,Reactjs,我在React中构建了一个表单组件,这个表单有一些字段组件作为子组件。我正在使用这些组件构建一个具有电子邮件地址和密码的登录表单。我的表单有一个onSubmit处理程序,它序列化它的子项(字段),并发送一个AJAX请求 在正常情况下,一切正常。但是,当像Chrome这样的浏览器使用我的电子邮件地址和密码创建表单时,序列化不会获取输入的值 字段当前看起来像这样: /** @jsx React.DOM */ var Field = React.createClass({ serialize:

我在React中构建了一个
表单
组件,这个表单有一些
字段
组件作为子组件。我正在使用这些组件构建一个具有电子邮件地址和密码的登录表单。我的表单有一个
onSubmit
处理程序,它序列化它的子项(
字段),并发送一个AJAX请求

在正常情况下,一切正常。但是,当像Chrome这样的浏览器使用我的电子邮件地址和密码创建表单时,序列化不会获取输入的值

字段当前看起来像这样:

/** @jsx React.DOM */

var Field = React.createClass({
  serialize: function() {
    return { name: this.props.name, value: this.refs.field.state.value };
  },

  render: function() {
    return (
      <div>
        <label>
          {this.props.label}
          <input type={this.props.type} ref="field"
            name={this.props.name}
            defaultValue={this.props.value} />
        </label>
      </div>
    )
  }
});
/**@jsx React.DOM*/
变量字段=React.createClass({
序列化:函数(){
返回{name:this.props.name,value:this.refs.field.state.value};
},
render:function(){
返回(
{this.props.label}
)
}
});

如何使浏览器自动填充值显示在序列化的
字段中?

状态应朝一个方向流动,从顶层到底层。因此,接触子元素以获取其状态是一个坏主意。要使用此结构完成序列化,只需访问DOM即可获得输入的值。在上面的代码示例中,
serialize
方法应该是:

serialize: function() {
  return { name: this.props.name, value: this.refs.field.getDOMNode().value };
},

状态应该朝一个方向流动,从顶层到底层。因此,接触子元素以获取其状态是一个坏主意。要使用此结构完成序列化,只需访问DOM即可获得输入的值。在上面的代码示例中,
serialize
方法应该是:

serialize: function() {
  return { name: this.props.name, value: this.refs.field.getDOMNode().value };
},

状态应该朝一个方向流动,从顶层到底层。因此,接触子元素以获取其状态是一个坏主意。要使用此结构完成序列化,只需访问DOM即可获得输入的值。在上面的代码示例中,
serialize
方法应该是:

serialize: function() {
  return { name: this.props.name, value: this.refs.field.getDOMNode().value };
},

状态应该朝一个方向流动,从顶层到底层。因此,接触子元素以获取其状态是一个坏主意。要使用此结构完成序列化,只需访问DOM即可获得输入的值。在上面的代码示例中,
serialize
方法应该是:

serialize: function() {
  return { name: this.props.name, value: this.refs.field.getDOMNode().value };
},

这是我的解决方案,使用refs:)…基本上我在第一秒钟手动触发更改事件..原因是每个浏览器都以不同的方式处理自动填充,并且这些更改基于浏览器版本..到目前为止,没有办法正确地覆盖这一点

  componentDidMount () {
    let tries = 4;
    this.int  = setInterval(() => {
      tries--;
      if (tries === 0) {
        this._createChangeEvent();
        clearInterval(this.int);
      }
    }, 300);
  }

  _createChangeEvent = () => {
    if ("createEvent" in document) {
      const evt = document.createEvent("HTMLEvents");
      evt.initEvent("change", false, true);
      this.input.dispatchEvent(evt);
    } else {
      this.input.fireEvent("onchange");
    }
  };

这是我的解决方案,使用refs:)…基本上我在第一秒钟手动触发更改事件..原因是每个浏览器都以不同的方式处理自动填充,并且这些更改基于浏览器版本..到目前为止,没有办法正确地覆盖这一点

  componentDidMount () {
    let tries = 4;
    this.int  = setInterval(() => {
      tries--;
      if (tries === 0) {
        this._createChangeEvent();
        clearInterval(this.int);
      }
    }, 300);
  }

  _createChangeEvent = () => {
    if ("createEvent" in document) {
      const evt = document.createEvent("HTMLEvents");
      evt.initEvent("change", false, true);
      this.input.dispatchEvent(evt);
    } else {
      this.input.fireEvent("onchange");
    }
  };

这是我的解决方案,使用refs:)…基本上我在第一秒钟手动触发更改事件..原因是每个浏览器都以不同的方式处理自动填充,并且这些更改基于浏览器版本..到目前为止,没有办法正确地覆盖这一点

  componentDidMount () {
    let tries = 4;
    this.int  = setInterval(() => {
      tries--;
      if (tries === 0) {
        this._createChangeEvent();
        clearInterval(this.int);
      }
    }, 300);
  }

  _createChangeEvent = () => {
    if ("createEvent" in document) {
      const evt = document.createEvent("HTMLEvents");
      evt.initEvent("change", false, true);
      this.input.dispatchEvent(evt);
    } else {
      this.input.fireEvent("onchange");
    }
  };

这是我的解决方案,使用refs:)…基本上我在第一秒钟手动触发更改事件..原因是每个浏览器都以不同的方式处理自动填充,并且这些更改基于浏览器版本..到目前为止,没有办法正确地覆盖这一点

  componentDidMount () {
    let tries = 4;
    this.int  = setInterval(() => {
      tries--;
      if (tries === 0) {
        this._createChangeEvent();
        clearInterval(this.int);
      }
    }, 300);
  }

  _createChangeEvent = () => {
    if ("createEvent" in document) {
      const evt = document.createEvent("HTMLEvents");
      evt.initEvent("change", false, true);
      this.input.dispatchEvent(evt);
    } else {
      this.input.fireEvent("onchange");
    }
  };

使用onChange事件是更新绑定到组件的任何模型属性的最常见场景,但是当浏览器“自动填充”表单时,也可以使用onBlur捕捉值

var Input = React.createClass({
  getInitialState: function() {
    return {typed: ''};
  },
  onBlur: function(event) {
    this.setState({typed: event.target.value});
  },
  render: function() {
    return <div>
        <input type="text" onBlur={this.onBlur.bind(this)}/>
        You typed: <code>{this.state.typed}</code>
      </div>
  }
});

使用onChange事件是更新绑定到组件的任何模型属性的最常见场景,但是当浏览器“自动填充”表单时,也可以使用onBlur捕捉值

var Input = React.createClass({
  getInitialState: function() {
    return {typed: ''};
  },
  onBlur: function(event) {
    this.setState({typed: event.target.value});
  },
  render: function() {
    return <div>
        <input type="text" onBlur={this.onBlur.bind(this)}/>
        You typed: <code>{this.state.typed}</code>
      </div>
  }
});

使用onChange事件是更新绑定到组件的任何模型属性的最常见场景,但是当浏览器“自动填充”表单时,也可以使用onBlur捕捉值

var Input = React.createClass({
  getInitialState: function() {
    return {typed: ''};
  },
  onBlur: function(event) {
    this.setState({typed: event.target.value});
  },
  render: function() {
    return <div>
        <input type="text" onBlur={this.onBlur.bind(this)}/>
        You typed: <code>{this.state.typed}</code>
      </div>
  }
});

使用onChange事件是更新绑定到组件的任何模型属性的最常见场景,但是当浏览器“自动填充”表单时,也可以使用onBlur捕捉值

var Input = React.createClass({
  getInitialState: function() {
    return {typed: ''};
  },
  onBlur: function(event) {
    this.setState({typed: event.target.value});
  },
  render: function() {
    return <div>
        <input type="text" onBlur={this.onBlur.bind(this)}/>
        You typed: <code>{this.state.typed}</code>
      </div>
  }
});

与您的问题不同,但也可能存在onChange未调用自动填充值的问题:。与您的问题不同,但也可能存在onChange未调用自动填充值的问题:。与您的问题不同,但也可能存在onChange未调用自动填充值的问题:。与您的问题不同,但也可能存在onChange未调用自动填充值的问题:。