Form validation for multiple inputs











up vote
1
down vote

favorite












I created an example of a simple form for multiple inputs (name and phone number) in React. If the user enters invalid data in input field, error text is displayed near the same field. I learned a lot of different examples of the form validation using React and I don't understand where is the better place for validation checking in form.



import React from 'react'
import { render } from 'react-dom'

const ErrorOutput = props => {
let name = props.name
let inputValue = props.case
if (name === 'firstName') {
if (!inputValue.match(/^[a-zA-Z]+$/) && inputValue.length > 0) {
return <span>Letters only</span>
}
return <span></span>
}
if (name === 'telNo') {
if(!inputValue.match(/^[0-9]+$/) && inputValue.length > 0) {
return <span>Numbers only</span>
}
return <span></span>
}
}

class App extends React.Component {
constructor(props){
super(props)

this.state = {
firstName: '',
telNo: ''
}
}

handleValidation(e) {
this.setState({
[e.target.name]: e.target.value
})
}

render() {
return (
<form>
<label>
First name:
</label>
<input
type='text'
name ='firstName'
value = {this.state.firstName}
onChange = {this.handleValidation.bind(this)}
/>
<ErrorOutput case={this.state.firstName} name={'firstName'} />
<label>
Phone number:
</label>
<input
type='tel'
name ='telNo'
value = {this.state.telNo}
onChange = {this.handleValidation.bind(this)}
/>
<ErrorOutput case={this.state.telNo} name={'telNo'} />
</form>
)
}
}

render(
<App />,
document.getElementById('root')
)









share|improve this question




























    up vote
    1
    down vote

    favorite












    I created an example of a simple form for multiple inputs (name and phone number) in React. If the user enters invalid data in input field, error text is displayed near the same field. I learned a lot of different examples of the form validation using React and I don't understand where is the better place for validation checking in form.



    import React from 'react'
    import { render } from 'react-dom'

    const ErrorOutput = props => {
    let name = props.name
    let inputValue = props.case
    if (name === 'firstName') {
    if (!inputValue.match(/^[a-zA-Z]+$/) && inputValue.length > 0) {
    return <span>Letters only</span>
    }
    return <span></span>
    }
    if (name === 'telNo') {
    if(!inputValue.match(/^[0-9]+$/) && inputValue.length > 0) {
    return <span>Numbers only</span>
    }
    return <span></span>
    }
    }

    class App extends React.Component {
    constructor(props){
    super(props)

    this.state = {
    firstName: '',
    telNo: ''
    }
    }

    handleValidation(e) {
    this.setState({
    [e.target.name]: e.target.value
    })
    }

    render() {
    return (
    <form>
    <label>
    First name:
    </label>
    <input
    type='text'
    name ='firstName'
    value = {this.state.firstName}
    onChange = {this.handleValidation.bind(this)}
    />
    <ErrorOutput case={this.state.firstName} name={'firstName'} />
    <label>
    Phone number:
    </label>
    <input
    type='tel'
    name ='telNo'
    value = {this.state.telNo}
    onChange = {this.handleValidation.bind(this)}
    />
    <ErrorOutput case={this.state.telNo} name={'telNo'} />
    </form>
    )
    }
    }

    render(
    <App />,
    document.getElementById('root')
    )









    share|improve this question


























      up vote
      1
      down vote

      favorite









      up vote
      1
      down vote

      favorite











      I created an example of a simple form for multiple inputs (name and phone number) in React. If the user enters invalid data in input field, error text is displayed near the same field. I learned a lot of different examples of the form validation using React and I don't understand where is the better place for validation checking in form.



      import React from 'react'
      import { render } from 'react-dom'

      const ErrorOutput = props => {
      let name = props.name
      let inputValue = props.case
      if (name === 'firstName') {
      if (!inputValue.match(/^[a-zA-Z]+$/) && inputValue.length > 0) {
      return <span>Letters only</span>
      }
      return <span></span>
      }
      if (name === 'telNo') {
      if(!inputValue.match(/^[0-9]+$/) && inputValue.length > 0) {
      return <span>Numbers only</span>
      }
      return <span></span>
      }
      }

      class App extends React.Component {
      constructor(props){
      super(props)

      this.state = {
      firstName: '',
      telNo: ''
      }
      }

      handleValidation(e) {
      this.setState({
      [e.target.name]: e.target.value
      })
      }

      render() {
      return (
      <form>
      <label>
      First name:
      </label>
      <input
      type='text'
      name ='firstName'
      value = {this.state.firstName}
      onChange = {this.handleValidation.bind(this)}
      />
      <ErrorOutput case={this.state.firstName} name={'firstName'} />
      <label>
      Phone number:
      </label>
      <input
      type='tel'
      name ='telNo'
      value = {this.state.telNo}
      onChange = {this.handleValidation.bind(this)}
      />
      <ErrorOutput case={this.state.telNo} name={'telNo'} />
      </form>
      )
      }
      }

      render(
      <App />,
      document.getElementById('root')
      )









      share|improve this question















      I created an example of a simple form for multiple inputs (name and phone number) in React. If the user enters invalid data in input field, error text is displayed near the same field. I learned a lot of different examples of the form validation using React and I don't understand where is the better place for validation checking in form.



      import React from 'react'
      import { render } from 'react-dom'

      const ErrorOutput = props => {
      let name = props.name
      let inputValue = props.case
      if (name === 'firstName') {
      if (!inputValue.match(/^[a-zA-Z]+$/) && inputValue.length > 0) {
      return <span>Letters only</span>
      }
      return <span></span>
      }
      if (name === 'telNo') {
      if(!inputValue.match(/^[0-9]+$/) && inputValue.length > 0) {
      return <span>Numbers only</span>
      }
      return <span></span>
      }
      }

      class App extends React.Component {
      constructor(props){
      super(props)

      this.state = {
      firstName: '',
      telNo: ''
      }
      }

      handleValidation(e) {
      this.setState({
      [e.target.name]: e.target.value
      })
      }

      render() {
      return (
      <form>
      <label>
      First name:
      </label>
      <input
      type='text'
      name ='firstName'
      value = {this.state.firstName}
      onChange = {this.handleValidation.bind(this)}
      />
      <ErrorOutput case={this.state.firstName} name={'firstName'} />
      <label>
      Phone number:
      </label>
      <input
      type='tel'
      name ='telNo'
      value = {this.state.telNo}
      onChange = {this.handleValidation.bind(this)}
      />
      <ErrorOutput case={this.state.telNo} name={'telNo'} />
      </form>
      )
      }
      }

      render(
      <App />,
      document.getElementById('root')
      )






      beginner validation form react.js jsx






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 3 mins ago









      Jamal

      30.2k11115226




      30.2k11115226










      asked May 23 at 13:15









      Kate Herasimenak

      3036




      3036






















          1 Answer
          1






          active

          oldest

          votes

















          up vote
          0
          down vote













          A pattern I use for this is individual validators:



          function validateName(value) {
          if (value.length > 0) {
          if (!inputValue.match(/^[a-zA-Z]+$/)) {
          return 'Letters only'
          }
          }
          return ''
          }


          Obviously this can be heavy for simple forms, but it's a very reusable pattern, and it keeps your components lighter:



          handleValidation(e) {
          const name = e.target.name
          const value = e.target.value
          this.setState({ [name]: value }, () => {
          if (name === 'firstName') {
          this.setState({ errors[name]: validateName(value) })
          }
          })
          }


          This allows you to do:



          {this.state.errors['firstName'] && <div className="form-error">{this.state.errors['firstName']}</div>}


          One benefit I find to this pattern is that it scales well - as your forms grow, you'll refactor to have your inputs as their own components and managing their own state, and this pattern will scale better and better as you refactor, as opposed to doing all the checking within a single function.






          share|improve this answer








          New contributor




          Toby is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
          Check out our Code of Conduct.


















            Your Answer





            StackExchange.ifUsing("editor", function () {
            return StackExchange.using("mathjaxEditing", function () {
            StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
            StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
            });
            });
            }, "mathjax-editing");

            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "196"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            convertImagesToLinks: false,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: null,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f195021%2fform-validation-for-multiple-inputs%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes








            up vote
            0
            down vote













            A pattern I use for this is individual validators:



            function validateName(value) {
            if (value.length > 0) {
            if (!inputValue.match(/^[a-zA-Z]+$/)) {
            return 'Letters only'
            }
            }
            return ''
            }


            Obviously this can be heavy for simple forms, but it's a very reusable pattern, and it keeps your components lighter:



            handleValidation(e) {
            const name = e.target.name
            const value = e.target.value
            this.setState({ [name]: value }, () => {
            if (name === 'firstName') {
            this.setState({ errors[name]: validateName(value) })
            }
            })
            }


            This allows you to do:



            {this.state.errors['firstName'] && <div className="form-error">{this.state.errors['firstName']}</div>}


            One benefit I find to this pattern is that it scales well - as your forms grow, you'll refactor to have your inputs as their own components and managing their own state, and this pattern will scale better and better as you refactor, as opposed to doing all the checking within a single function.






            share|improve this answer








            New contributor




            Toby is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
            Check out our Code of Conduct.






















              up vote
              0
              down vote













              A pattern I use for this is individual validators:



              function validateName(value) {
              if (value.length > 0) {
              if (!inputValue.match(/^[a-zA-Z]+$/)) {
              return 'Letters only'
              }
              }
              return ''
              }


              Obviously this can be heavy for simple forms, but it's a very reusable pattern, and it keeps your components lighter:



              handleValidation(e) {
              const name = e.target.name
              const value = e.target.value
              this.setState({ [name]: value }, () => {
              if (name === 'firstName') {
              this.setState({ errors[name]: validateName(value) })
              }
              })
              }


              This allows you to do:



              {this.state.errors['firstName'] && <div className="form-error">{this.state.errors['firstName']}</div>}


              One benefit I find to this pattern is that it scales well - as your forms grow, you'll refactor to have your inputs as their own components and managing their own state, and this pattern will scale better and better as you refactor, as opposed to doing all the checking within a single function.






              share|improve this answer








              New contributor




              Toby is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
              Check out our Code of Conduct.




















                up vote
                0
                down vote










                up vote
                0
                down vote









                A pattern I use for this is individual validators:



                function validateName(value) {
                if (value.length > 0) {
                if (!inputValue.match(/^[a-zA-Z]+$/)) {
                return 'Letters only'
                }
                }
                return ''
                }


                Obviously this can be heavy for simple forms, but it's a very reusable pattern, and it keeps your components lighter:



                handleValidation(e) {
                const name = e.target.name
                const value = e.target.value
                this.setState({ [name]: value }, () => {
                if (name === 'firstName') {
                this.setState({ errors[name]: validateName(value) })
                }
                })
                }


                This allows you to do:



                {this.state.errors['firstName'] && <div className="form-error">{this.state.errors['firstName']}</div>}


                One benefit I find to this pattern is that it scales well - as your forms grow, you'll refactor to have your inputs as their own components and managing their own state, and this pattern will scale better and better as you refactor, as opposed to doing all the checking within a single function.






                share|improve this answer








                New contributor




                Toby is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.









                A pattern I use for this is individual validators:



                function validateName(value) {
                if (value.length > 0) {
                if (!inputValue.match(/^[a-zA-Z]+$/)) {
                return 'Letters only'
                }
                }
                return ''
                }


                Obviously this can be heavy for simple forms, but it's a very reusable pattern, and it keeps your components lighter:



                handleValidation(e) {
                const name = e.target.name
                const value = e.target.value
                this.setState({ [name]: value }, () => {
                if (name === 'firstName') {
                this.setState({ errors[name]: validateName(value) })
                }
                })
                }


                This allows you to do:



                {this.state.errors['firstName'] && <div className="form-error">{this.state.errors['firstName']}</div>}


                One benefit I find to this pattern is that it scales well - as your forms grow, you'll refactor to have your inputs as their own components and managing their own state, and this pattern will scale better and better as you refactor, as opposed to doing all the checking within a single function.







                share|improve this answer








                New contributor




                Toby is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.









                share|improve this answer



                share|improve this answer






                New contributor




                Toby is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.









                answered 10 hours ago









                Toby

                1042




                1042




                New contributor




                Toby is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.





                New contributor





                Toby is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.






                Toby is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Code Review Stack Exchange!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    Use MathJax to format equations. MathJax reference.


                    To learn more, see our tips on writing great answers.





                    Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                    Please pay close attention to the following guidance:


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f195021%2fform-validation-for-multiple-inputs%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Feedback on college project

                    Futebolista

                    Albești (Vaslui)