【问题标题】:Make a field or all fields required in React在 React 中创建一个字段或所有字段
【发布时间】:2020-11-03 04:04:15
【问题描述】:

我有一个这样的输入字段:

<Form.Field
  name="contactName"
  className=""
  control={Input}
  label="Contact Name"
  placeholder="Contact Name"
  value={this.state.contactName || ''}
  onChange={this.onChange}
/>

我想让它成为必需的,因此它应该添加required 属性,现在看起来像这样:

<Form.Field
  name="contactName"
  className=""
  control={Input}
  label="Contact Name"
  placeholder="Contact Name"
  value={this.state.contactName || ''}
  onChange={this.onChange}
  required
/>

我注意到它还在输入标题附近添加了一个红色星号。问题是用户仍然可以单击提交按钮,他们不会知道条目没有创建(他们不检查网络以查看调用失败)。

如果没有引入所需的数据,有没有办法使无法提交?还有像弹出/悬停说它需要数据的东西吗?

【问题讨论】:

    标签: javascript html reactjs forms input


    【解决方案1】:

    假设您使用语义 UI 设置组件样式,您可以使用 &lt;Form.Field /&gt;error 属性在表单无效时引发错误。

    要跟踪表单是否有效,您可以使用您的状态。作为一个选项,您可以将Submit 按钮的disabled 属性设置为等于指示表单是否有效的状态变量。

    您可以在以下现场演示中找到非常基本的表单验证(匹配一个大写字母后跟小写字母的模式):

    const { Component } = React,
          { render } = ReactDOM,
          { Form, Input, Button } = semanticUIReact
    
    const rootNode = document.getElementById('root')
    
    class App extends Component {
    
      state = {
        submitAttempted: false,
        isValid: {
          contactName: false,
          contactPhone: false,
          contactMail: false
        }
      }
      
      validateInput = (name,value) => { 
        switch(name){
          case 'contactName' : {
            if(/^[A-Z][a-z]+$/.test(value)){
              return true
            } else return false
          }
          case 'contactPhone' : {
            if(/^\d+$/.test(value)){ 
              return true
            } else return false
          }
          case 'contactMail' : {
            if(/^\w+@\w+\.\w{1,4}$/i.test(value)){
              return true
            } else return false
          }
          default: return false
        }
      }    
    
      onChange = ({target:{name,value}}) => 
        this.setState({
          [name]: value,
          isValid: {
            ...this.state.isValid,
            [name]: this.validateInput(name, value)
          }
        })
      
      onSubmit = e => {
        e.preventDefault()
        this.setState({
          submitAttempted: true
        })
        Object.values(this.state.isValid).every(Boolean) &&
        console.log(this.state.contactName, this.state.contactPhone, this.state.contactMail)
      }
    
      render(){    
        return (
          <Form onSubmit={this.onSubmit} >
            <Form.Field
              name="contactName"
              className=""
              control={Input}
              label="Contact Name"
              placeholder="Contact Name"
              value={this.state.contactName || ''}
              onChange={this.onChange}
              required
              error={(
                (this.state.submitAttempted && !this.state.isValid.contactName) &&
                {
                  content: 'Valid contact name should contain upper-case letters followed by lower-case letters',
                  pointing: 'below'
                }
              )}
            />
            <Form.Field
              name="contactPhone"
              className=""
              control={Input}
              label="Contact Phone"
              placeholder="Contact Phone"
              value={this.state.contactPhone || ''}
              onChange={this.onChange}
              required
              error={(
                (this.state.submitAttempted && !this.state.isValid.contactPhone) && 
                {
                  content: 'Valid phone, should contain numbers only',
                  pointing: 'below'
                }
              )}
            />
            <Form.Field
              name="contactMail"
              className=""
              control={Input}
              label="Contact Mail"
              placeholder="example@hello.com"
              value={this.state.contactMail || ''}
              onChange={this.onChange}
              required
              error={(
                (this.state.submitAttempted && !this.state.isValid.contactMail) &&
                {
                  content: 'Valid e-mail format should be fulfilled',
                  pointing: 'below'
                }
              )}
            />
            <Button 
              type="submit"
              disabled={
                this.state.submitAttempted && 
                !Object.values(this.state.isValid).every(Boolean)
              }
            >
              Submit
            </Button>
          </Form>
        )
      }
    
    }
    
    render (
      <App />,
      rootNode
    )
    &lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.css" /&gt;&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.12.0/umd/react.production.min.js"&gt;&lt;/script&gt;&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.11.0/umd/react-dom.production.min.js"&gt;&lt;/script&gt;&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui-react/0.88.2/semantic-ui-react.min.js"&gt;&lt;/script&gt;&lt;div id="root"&gt;&lt;/div&gt;

    【讨论】:

    • 此时,onChange 看起来像这样:` onChange = (e, { name, value }) => { this.setState({ [name]: value }); };` .可以修改它以接受您的更改吗?我不知道该怎么做
    • 我有更多字段,但我也尝试评论所有字段,但只有一个,但仍然无效。现在,它不允许我在输入字段中写任何东西。我把代码复制到这里,如果是all文件可能会更清楚:pastebin.com/inV3wGip
    • 我接受你的回答,因为你付出了很多努力来帮助我,即使它仍然不适合我的情况
    • 我不知道这样做,因为应用程序太大,我需要获得很多依赖项。感谢您的帮助
    • 如果你有时间,我可以在谷歌会议上与你分享我的屏幕以进行现场演示
    【解决方案2】:

    您需要添加自己的验证来检查任何输入是否为空,当单击提交按钮时,如果任何输入为空,则显示警报。

    这不是您需要添加代码进行验证和提醒自己的内置功能。

    【讨论】:

    • 除非 OP 使用插件,否则这是正确的,我们不只是喜欢 React 中的表单验证吗?
    猜你喜欢
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多