gpt4 book ai didi

reactjs - 如何将react-intl-tel-input与formik集成?

转载 作者:行者123 更新时间:2023-12-03 14:17:56 25 4
gpt4 key购买 nike

我正在使用 Formik 来处理 ReactJs 应用程序中的表单,我想使用 React-intl-tel-input 来处理电话号码,但是我无法将 handleChange、handleBlur 和验证与 Formik 集成。现在,我正在使用表单的状态来保存电话号码及其验证状态,但这会通过重新呈现我的其他字段而导致 Formik 出现问题。

这是我的电话号码部分:

<IntlTelInput
fieldId="userPhoneNumber"
fieldName="userPhoneNumber"
value={values.userPhoneNumber}
preferredCountries={preferredMobileCountries}
css={['intl-tel-input', `form-control ${(!validPhoneNumber) ? 'is-invalid' : ''}`]}
style={{display: 'block',width: '100%'}}
format
onPhoneNumberChange={this.handlePhoneChange}
/>
{!validPhoneNumber && <div className="invalid-feedback">Invalid phone number</div>}

实现这一目标的正确方法是什么?我的意思是使用自定义组件,但能够使用 Formik 的 handleChange、handleBlur 和验证模式?

提前致谢...

最佳答案

这不是最佳解决方案,但将 IntlTelInput 链接回 formik 的 setFieldTouched 和 setFieldValue。

// @flow

import React, {Component, Fragment} from 'react';
import {ErrorMessage, Field} from 'formik';
import IntlTelInput from 'react-intl-tel-input';

export default class MobileField extends Component {
formatPhoneNumberOutput(
isValid: boolean,
newNumber: string,
countryData: Object,
fullNumber: string,
isExtension: boolean
) {
if (isValid && fullNumber) {
return fullNumber.replace(/(\s|-)/g, '');
}
return 'invalid_phone_number'; // caught by validator
}

render() {
return (
<Field
name={name}
render={({field, form: {errors, isSubmitting, touched, setFieldTouched, setFieldValue}}) => {
return (
<Fragment>
<IntlTelInput
defaultCountry="fr"
defaultValue={field.value}
disabled={isSubmitting}
fieldId={name}
fieldName={name}
onPhoneNumberBlur={() => {
setFieldTouched(name, true);
}}
onPhoneNumberChange={(...args) => {
setFieldValue(name, this.formatPhoneNumberOutput(...args));
}}
preferredCountries={['fr', 'gb', 'es', 'be', 'de']}
/>
<ErrorMessage name={name} render={msg => <p>{msg}</p>} />
</Fragment>
);
}}
/>
);
}
}

使用 validate.js 等验证器来检查电话号码是否不是“invalid_phone_number”

// @flow

import _mapValues from 'lodash/mapValues';
import validate from 'validate.js';

export type Values = {
mobile: string,
landline: string
};

export default (values: Values) => {
const options = {
fullMessages: false
};
const validation: {[key: string]: string[]} = validate(
values,
{
mobile: {
presence: {message: 'Please add a mobile phone number'},
format: {
pattern: '^((?!invalid_phone_number).)*$', // is not invalid_phone_number
message: 'This phone number looks like being invalid'
}
},
landline: {}
},
options
);
return _mapValues(validation, messages => messages[0]);
};

关于reactjs - 如何将react-intl-tel-input与formik集成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54461158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com