为什么setCustomValidity()在React应用程序中不起作用?

KAT*_*ATq 8 html javascript reactjs

为什么setCustomValidity()在React中不起作用?我错过了什么吗?使用vanillia HTML和JS工作正常.或者还有其他方法可以轻松地制作类似的东西setCustomValidity

反应代码:

class Form extends React.Component {
  formVal(e) {
    e.target.setCustomValidity("Test_1");
  }
  formVal2() {
    let inpt = document.getElementById("input");
    inpt.target.setCustomValidity("TEST_2");
  }
  render() {
    return (
      <div>
        <form>
          <input
            id="input"
            type="datetime-local"
            onBlur={this.formVal}
          />
        </form>
        <button onClick={this.formVal2}>Click </button>
      </div>
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

CodePen - React

没有React:

<form>
  <input type="email" id="mail" name="mail">
  <button onclick="test()">Submit</button>
</form>
Run Code Online (Sandbox Code Playgroud)

// JS

var input = document.getElementById("mail");
function test() {
 input.setCustomValidity("test")
}
Run Code Online (Sandbox Code Playgroud)

CodePen - 没有反应

Pau*_*aul 8

setCustomValidity不会立即触发验证,您必须有一个表单提交事件来触发或调用checkValidity.我已经更新了你的CodePen,以展示如何在React中实现这一点,它也包含在下面.

class Form extends React.Component {
  
  onChange(e) {
    let date = new Date(Date.parse(e.target.value));
    
    if (date > new Date()) {
      e.target.setCustomValidity("Please select a date in the past."); 
    } else {
      e.target.setCustomValidity("");
    }
  }
    
  render() {
    return (
      <div>
        <form>
          <input
            id="input"
            type="datetime-local"
            onChange={this.onChange}
          />
          <button type="submit">Submit</button>
        </form>
      </div>
    );
  }
}

ReactDOM.render(<Form />, document.getElementById("root"));
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>
Run Code Online (Sandbox Code Playgroud)