【问题标题】:React-Bootstrap Popover with Form field Validation带有表单字段验证的 React-Bootstrap 弹出框
【发布时间】:2015-04-10 20:45:53
【问题描述】:

我试图播放here 显示的示例代码,以便有一个覆盖触发器,在我的表单组件的无效用户名字段正则表达式上显示一个弹出窗口。在尝试执行此代码时,我遇到了经典的 Cannot update during an existing state transition (such as within "render"). Render methods should be a pure function of props and state. 错误:

var UserField = React.createClass({
  getInitialState: function() {
    return {
      value: ''
    };
  },

  getValue: function() {
    return this.refs.input.getValue();
  },

  validationState: function() {
    let valueCode = this.state.value;
    if (valueCode.length > 0) {
      switch (valueCode.match(/^[A-Za-z0-9_-]+$/)) {
        case null:
          this.refs.userHint.show();
          return 'warning';
          break;

        default:
          this.refs.userHint.hide();
          return '';
          break;
      }
    }
  },

  handleChange: function() {
    this.setState({
      value: this.refs.input.getValue()
    });
  },

  render: function() {
    return (
      <OverlayTrigger
        ref="userHint"
        trigger="manual"
        placement="right"
        overlay={<Popover title='Invalid Username Format'>
                   <strong>Warning!</strong> Valid user credentials only contain alphanumeric characters, as well as heifens and underscores.
                 </Popover>
        }
      >
        <Input
          type = 'text'
          value = {this.state.value}
          label = 'Username'
          bsStyle = {this.validationState()}
          ref = 'input'
          groupClassName = 'input-group'
          className = 'form-control'
          onChange = {this.handleChange}
        />
      </OverlayTrigger>
    );
  }
});

一如既往地非常感谢您对此提供的任何帮助。谢谢。

【问题讨论】:

    标签: javascript twitter-bootstrap reactjs react-bootstrap


    【解决方案1】:

    如果我正在开发它,我会做不同的事情,Input 管理它自己的验证并通过其状态(可通过 refs 访问)公开它是否有效。

    在不改变你的方法的情况下,这应该会更好,因为它不会触发父组件的状态变化,直到覆盖层被显示或隐藏:

    validationState: function() {
      let valueCode = this.state.value;
      if (valueCode.length > 0) {
        switch (valueCode.match(/^[A-Za-z0-9_-]+$/)) {
          case null:
            return 'warning';
            break;
    
          default:
            return '';
            break;
        }
      }
    },
    
    handleChange: function() {
      let valueCode = this.refs.input.getValue();
    
      if (valueCode.length > 0) {
        switch (valueCode.match(/^[A-Za-z0-9_-]+$/)) {
          case null:
            this.refs.userHint.show();
            break;
    
          default:
            this.refs.userHint.hide();
            break;
        }
      }
      this.setState({
        value: valueCode
      });
    },
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-12
      相关资源
      最近更新 更多