javascript - 如果为空或数字,则 react 输入验证

标签 javascript reactjs

我创建了这个方法来获取计算器输入的状态并检查其是否为空。我需要两件事的帮助:

  • 在此处添加验证以检查每个输入是否也是数字并输出和错误“输入必须是数字”的最简洁方法是什么
  • 目前,我有一条错误消息,无论所有输入是否存在,都会触发,我想要的是它单独验证每个输入并在每个输入下触发错误。我该如何做,但仍然保持这个功能简洁?

           constructor(props) {
            super(props);
            this.state = {
                price: 0,
                downP: 0,
                term: 0,
                interest: 0,
                error: ''
            };
        }
    
     handleValidation = () => {
                    const {
                        price,
                        downP,
                        loan,
                        interest,
                    } = this.state;
                    let error = '';
                    let formIsValid = true;
                        if(!price || 
                            !downP ||
                            !loan ||
                            !interest){
                            formIsValid = false;
                            error = "Input fields cannot be empty";
                        } 
    
           this.setState({error: error});
          return formIsValid;
        }
    

    然后这是错误消息

         <span style={{color: "red"}}>{this.state.error}</span>
    

最佳答案

如果您想将错误消息分开,我建议您重新组织您的状态。

如此可扩展的解决方案(您可以通过将它们添加到状态来添加更多控件)可能如下所示:

class NumberControlsWithErrorMessage extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      inputs: [
        { name: 'price', value: 0, error: ''},
        { name: 'downP', value: 0, error: '' },
        { name: 'term', value: 0, error: '' },
        { name: 'interest', value: 0, error: '' }
      ]
    };
  }

  handleInputChange = (idx, event) => {
    const target = event.target;
    const name = target.name;
    let error = '';

    if (isNaN(target.value)) {
      error = `${name} field can only be number`
    }

    if (!target.value) {
      error = `${name} field cannot be empty`
    }

    this.state.inputs[idx] = {
      ...this.state.inputs[idx],
       value: target.value,
      error
    }

    this.setState({
      inputs: [...this.state.inputs]
    });
  }

  render() {
    return (
      <form>
        {this.state.inputs.map((input, idx) => (
          <div>
          <label htmlFor="">{input.name}</label>
          <input type="text" value={input.value} onChange={(e) => this.handleInputChange(idx, e)}/>
          {input.error && <span>{input.error}</span> }
          </div>
        ))}
      </form>
    );
  }
}

Working example

此外,如果您正在构建一个复杂的表单,您可能想尝试一些针对表单的 React 解决方案,其中所有监听事件、状态更新、验证的机制都已经为您处理好了。喜欢reactive-mobx-form

关于javascript - 如果为空或数字,则 react 输入验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54450445/

相关文章:

javascript - AWS Lambda 无法调用 Cognito Identity - IAM 角色

javascript - 如何在服务器上保存内联编辑器内容?

reactjs - (React-Native) undefined 不是一个对象(评估 _'this.props.navigation.navigate' )

reactjs - 使用 sinon.fakeTimers 测试 setInterval() 不起作用?

javascript - 如何在我的 React 应用程序中使用 Firebase 身份验证强制注册?

javascript - 在reactjs中以编程方式取消选中复选框

javascript - 使用 JQuery 显示和隐藏具有多个选项的菜单的子菜单

javascript - Amcharts - 当 php json 输出文件位于包含文件夹中时,Dataloader 插件不加载图表

javascript - opencart $_GET 使用参数重定向到 index.php

javascript - 如果特定 prop 发生变化,则重新渲染整个组件