javascript - react / react Hook : I am trying to trigger a validation using hooks whenever a user leaves input field

标签 javascript reactjs react-hooks

我有一个使用 react Hook 设计的组件,并连接了更改功能,以便输入字段预先填充客户电子邮件地址,如果用户单击电子邮件选择退出复选框,它将清除并禁用输入。我现在尝试设计一个更改事件,当用户输入新的电子邮件地址并离开输入字段时,该事件将触发电子邮件验证以确保其格式正确。我已经使用正则表达式编写了一个函数,其中包含我想要显示的错误消息,但我不确定如何使用现在的主要组件来实现它。我在下面包含了验证函数以及主要组件。我对钩子(Hook)相当陌生,因此事实证明,尝试了解如何实现所有这些逻辑有点困难,因此任何有关如何实现这一点的建议/代码示例都将是一个巨大的帮助

Function for Email Validation
export default function validate(values) {
  let errors = {};
  if (!values.email) {
    errors.email = 'Email address is required';
  } else if (!/\S+@\S+\.\S+/.test(values.email)) {
    errors.email = 'Email address is invalid';
  }
  return errors;
};

Main Component
import React from 'react'
import PropTypes from 'prop-types'
import styled from 'styled-components'
import {
  Col, Row, Icon, Input, Tooltip
} from 'antd'
import Checkbox from '../elements/Checkbox'
import Markup from '../core/Markup'

const CustomerDetails = ({ customer }) => {
  const { contact = {}, account = {}, site = {} } = customer || {}
  const [disableInput, setDisableInput] = React.useState(false)
  const [inputValue, setInputValue] = React.useState(contact.email)

  function clearInput() {
    setInputValue(' ')
  }

  function handleInputChange(event) {
    setInputValue(event.target.value)
  }

  function CheckboxClick() {
    if (!disableInput) {
      clearInput()
    }
    setDisableInput(prevValue => !prevValue)
  }


  return (
    <Container>
      <h2>{account.name}</h2>
      <Row>
        <Col span={8}>
          <H3>
            <strong>Primary Contact:</strong>
          </H3>
          <P>{contact.name}</P>
          <P>{contact.phone}</P>
        </Col>
        <Col span={8}>
          <H3>
            <strong>Service Address:</strong>
          </H3>
          <P>{site.address1}</P>
          <P>{site.address2}</P>
          <P>
            {site.city},&nbsp;{site.state}&nbsp;
            {site.postalCode}
          </P>
        </Col>
        <Col span={8}>
          <H3>
            <strong>Billing Address:</strong>
          </H3>
          <StyledMarkup>{account.billingStreet}</StyledMarkup>
          <P>
            {account.billingCity},&nbsp;{account.billingState}
            &nbsp;
            {account.billingPostalCode}
          </P>
        </Col>
      </Row>
      <br />
      <Row>
        <Col span={10}>
          <h4>
            PRIMARY CONTACT EMAIL &nbsp;
            <Tooltip
              placement="right"
              title={primaryContact}
            >
              <StyledTooltipIcon
                type="question-circle"
                theme="filled"
              />
            </Tooltip>
          </h4>
        </Col>
      </Row>
      <Row>
        <Col span={8}>
          <StyledInput
            value={inputValue}
            onChange={handleInputChange}
            disabled={disableInput}
          />
        </Col>
        <Col span={2} />
        <Col span={8}>
          <StyledCheckbox
            value={disableInput}
            onChange={CheckboxClick}
          /> EMAIL
          OPT OUT{' '}
        </Col>
      </Row>
      <br />
    </Container>
  )
}

CustomerDetails.propTypes = {
  customer: PropTypes.object
}

CustomerDetails.defaultProps = {
  customer: {}
}

export default CustomerDetails

最佳答案

以下是您可以执行的操作:

看看这是否适合您。

function validateEmail(value) {
  let errors = {};
  if (value === '') {
    errors.email = 'Email address is required';
  } else if (!/\S+@\S+\.\S+/.test(value)) {
    errors.email = 'Email address is invalid';
  }
  return errors;
};

function App() {
  const [inputValue, setInputValue] = React.useState('');
  const [errors, setErrors] = React.useState({});
  
  function onChange(e) {
    setInputValue(e.target.value);
  }
  
  function onBlur(e) {
    setErrors(validateEmail(e.target.value));
  }
  
  return(
    <div>
      <div>Fill the email input and click elsewhere to blur the field</div>
      <input onChange={onChange} onBlur={onBlur} value={inputValue} placeholder="Enter email..."/>
      {errors.email && <div>{errors.email}</div>}
    </div>
  );
}

ReactDOM.render(<App/>, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.3/umd/react-dom.production.min.js"></script>
<div id="root"></div>

关于javascript - react / react Hook : I am trying to trigger a validation using hooks whenever a user leaves input field,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56487796/

相关文章:

reactjs - react native 日历

javascript - React Router Dom,使用 useNavigate 将数据传递给组件

reactjs - React 中使用 useCallback 和 useMemo 重新渲染的问题

javascript - 收到post数据后触发setinterval

javascript - 使用 AWS SDK for JavaScript 访问 AWS S3

javascript - 如何从Vue中创建的axios函数访问属性

javascript - 我应该在 useEffect 钩子(Hook)中使用 IIFE 吗?

javascript - 修复 header 偏移 html anchor

reactjs - Ant Design + React-table。如何在 Ant Design 提供的 UI 元素之上构建 react-table 的过滤能力?

reactjs - 如何在 ReactJS 中共享当前 URL