如何在所有输入字段都填满之前禁用表单提交按钮?! ReactJS ES2015

时间:2016-03-14 01:21:38

标签: javascript reactjs

您好我为单个字段表单找到了答案...但是如果我们有一个包含多个字段的表单怎么办?

如果您有1个字段,这可以禁用它,但是当您想根据许多字段禁用它时它不起作用:

getInitialState() {
    return {email: ''}
  },
  handleChange(e) {
    this.setState({email: e.target.value})
  },
  render() {
    return <div>
      <input name="email" value={this.state.email} onChange={this.handleChange}/>
      <button type="button" disabled={!this.state.email}>Button</button>
    </div>
  }
})

4 个答案:

答案 0 :(得分:6)

我会采取一些不同的方式...

我不会在每个submitDisabled处理程序中设置onChange,而是会挂钩生命周期方法来监听更改。
准确地说是componentWillUpdate(nextProps, nextState)。在每次更改组件之前调用此方法 - 要么改变道具,要么改变状态。在这里,您可以在一个地方验证您的表单数据并设置您需要的标记 代码示例:

componentWillUpdate(nextProps, nextState) {
  nextState.invalidData = !(nextState.email && nextState.password);
},

完整的工作小提琴https://jsfiddle.net/4emdsb28/

答案 1 :(得分:4)

以下是表单验证的基本设置:

getInitialState() {
    return {
      email: '',
      text: '',
      emailValid: false,         // valid flags for each field
      textValid: false, 
      submitDisabled: true       // separate flag for submit
    }
  },
  handleChangeEmail(e) {         // separate handler for each field
    let emailValid = e.target.value ? true : false;        // basic email validation
    let submitValid = this.state.textValid && emailvalid   // validate total form
    this.setState({
      email: e.target.value
      emailValid: emailValid, 
      submitDisabled: !submitValid
    })
  },
  handleChangeText(e) {         // separate handler for each field
    let textValid = e.target.value ? true : false;        // basic text validation
    let submitValid = this.state.emailValid && textvalid   // validate total form
    this.setState({
      text: '',
      textValid: textValid, 
      submitDisabled: !submitValid
    })
  },
  render() {
    return <div>
      <input name="email" value={this.state.email} onChange={this.handleChangeEmail}/>
      <input name="text" value={this.state.text} onChange={this.handleChangeText}/>
      <button type="button" disabled={this.state.submitDisabled}>Button</button>
    </div>
  }
})

在更复杂的设置中,您可能希望将每个输入字段放在单独的组件中。并使代码更干燥(注意更改处理程序中的重复) 还有各种反应形式的解决方案,如here

答案 2 :(得分:1)

这可能会有所帮助。 (学分 - https://goshakkk.name/form-recipe-disable-submit-button-react/

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

class SignUpForm extends React.Component {
  constructor() {
    super();
    this.state = {
      email: "",
      password: ""
    };
  }

  handleEmailChange = evt => {
    this.setState({ email: evt.target.value });
  };

  handlePasswordChange = evt => {
    this.setState({ password: evt.target.value });
  };

  handleSubmit = () => {
    const { email, password } = this.state;
    alert(`Signed up with email: ${email} password: ${password}`);
  };

  render() {
    const { email, password } = this.state;
    const isEnabled = email.length > 0 && password.length > 0;
    return (
      <form onSubmit={this.handleSubmit}>
        <input
          type="text"
          placeholder="Enter email"
          value={this.state.email}
          onChange={this.handleEmailChange}
        />
        <input
          type="password"
          placeholder="Enter password"
          value={this.state.password}
          onChange={this.handlePasswordChange}
        />
        <button disabled={!isEnabled}>Sign up</button>
      </form>
    );
  }
}

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

答案 3 :(得分:0)

只有当所有输入字段都填满且输入元素的所有状态均为true时,我才通过渲染普通按钮元素来做到这一点。否则,它将呈现一个禁用的按钮。

下面是一个包含useState挂钩并使用if语句创建组件SubmitButton的示例。

import React, { useState } from 'react';

export function App() {
  const [firstname, setFirstname] = useState('');
  const [lastname, setLastname] = useState('');
  const [email, setEmail] = useState('');
    
  function SubmitButton(){
    if (firstname && lastname && email){
      return <button type="button">Button</button>
    } else {
      return <button type="button" disabled>Button</button>
    };
  };

  return (
    <div>
      <input value={email} onChange={ e => setEmail(e.target.value)}/>
      <input value={firstname} onChange={ e => setFirstname(e.target.value)}/>
      <input value={lastname} onChange={ e => setLastname(e.target.value)}/>
      <SubmitButton/>
    </div>
  );
};