React, Formik, Ага: Как отформатировать ввод телефона

Я новичок в React, и я сделал многоэтапную форму для регистрации с использованием React bootstrap, Formik и проверки с помощью Yup. Я хочу добавить функциональность, которая позволит мне форматировать (или маскировать) вводимые пользователем данные в нескольких полях.
Во время ввода пользователем я хочу отформатировать вводимые с телефона данные в следующем формате: 111-111-1111. Почтовый индекс для формата: N0G 1A3. Как я могу это сделать? Какие-либо предложения? Мне нужно добавить какие-нибудь библиотеки? Что я должен делать?

Вот код, который я сделал:

export const step1Scehma = Yup.object({
firstName: Yup.string()
            .required("This field is required"),
lastName: Yup.string()
           .required("This field is required"),
email: Yup.string()
           .email()
           .required("Email is required"),
password: Yup.string()
             .required("This field is required")
             .matches(
              "^(?=.*[A-Za-z])(?=.*d)(?=.*[@$!%*#?&])[A-Za-zd@$!%*#?&]{8,}$",
              "Must Contain at least 8 Characters: One Uppercase, One Lowercase, One Number and one 
               special case Character"
              ),
phone: Yup.string()
           .required("This field is required")
});

export const Step1 = ({ formik }) => {
   const { handleChange, values, errors, touched } = formik;

return (
<React.Fragment>
  <Container>
    <Card.Title className="text-center">New User</Card.Title>
    <Card.Body>
      <Form.Group as={Col}>
        <Form.Label>First Name</Form.Label>
        <Form.Control
          type="text"
          name="firstName"
          onChange={handleChange}
          value={values.firstName}
          isValid={touched.firstName && !errors.firstName}
          isInvalid={!!errors.firstName}
          className={touched.firstName && errors.firstName ? "error" : null}
        />
        {touched.firstName && errors.firstName ? (<div className="error-message">{errors.firstName}</div>): null}
      </Form.Group>

      <Form.Group as={Col}>
        <Form.Label>Last Name</Form.Label>
        <Form.Control
          type="text"
          name="lastName"
          onChange={handleChange}
          value={values.lastName}
          isValid={touched.lastName && !errors.lastName}
          isInvalid={!!errors.lastName}
          className={touched.lastName && errors.lastName ? "error" : null}
        />
        {touched.lastName && errors.lastName ? (<div className="error-message">{errors.lastName}</div>): null}
      </Form.Group>

      <Form.Group as={Col} >
        <Form.Label>Email</Form.Label>
        <Form.Control
          type="text"
          name="email"
          onChange={handleChange}
          value={values.email}
          isValid={touched.email && !errors.email}
          isInvalid={!!errors.email}
          className={touched.email && errors.email ? "error" : null}
        />
        {touched.email && errors.email ? (<div className="error-message">{errors.email}</div>): null}
      </Form.Group>

      <Form.Group as={Col} >
        <Form.Label>Password</Form.Label>
        <Form.Control
          type="password"
          name="password"
          onChange={handleChange}
          value={values.password}
          isValid={touched.password && !errors.password}
          isInvalid={!!errors.password}
          className={touched.password && errors.password ? "error" : null}
        />
        {touched.password && errors.password ? (<div className="error-message">{errors.password}</div>): null}
      </Form.Group>
  
      <Form.Group as={Col} >
        <Form.Label>Phone Number</Form.Label>
        <Form.Control
          type="tel"
          name="phone"
          onChange={handleChange}
          value={values.phone}
          isValid={touched.phone && !errors.phone}
          isInvalid={!!errors.phone}
          className={touched.phone && errors.phone ? "error" : null}
        />
        {touched.phone && errors.phone ? (<div className="error-message">{errors.phone}</div>): null}
      </Form.Group>
    </Card.Body>
  </Container>
</React.Fragment>
);
};

person Sereban    schedule 20.10.2020    source источник


Ответы (1)


Вы можете использовать https://github.com/sanniassin/react-input-mask.

https://www.npmjs.com/package/react-input-mask

Примеры очень подробны. Я использовал это с Yup и Material UI.

<InputMask mask="999-999-9999" onChange={ handleChange } onBlur={ handleBlur } value={values.billing_phone} error={errors.billing_phone && touched.billing_phone} helperText={(errors.billing_phone && touched.billing_phone) && errors.billing_phone}>
    {(inputProps) => <TextField {...inputProps} className={classes.MuiInputBase} id="billing_phone" variant="outlined"  name="billing_phone" placeholder={addressObj.phone}  />}
</InputMask>

Если вы не используете простой <input />, вам придется обернуть свой элемент, как это сделал я. Вы можете найти обсуждение этого вопроса на странице NPM.

person pandabrand    schedule 28.10.2020