I am new to React and started with class based components. I ended up using Formik and i am having trouble converting a function based component example to a class based one. Below is the example i am trying to convert.
const MyTextInput = ({ label, ...props }) => {
// useField() returns [formik.getFieldProps(), formik.getFieldMeta()]
// which we can spread on <input> and alse replace ErrorMessage entirely.
const [field, meta] = useField(props);
return (
<>
<label htmlFor={props.id || props.name}>{label}</label>
<input className="text-input" {...field} {...props} />
{meta.touched && meta.error ? (
<div className="error">{meta.error}</div>
) : null}
</>
);
};
I did all the rendering part, but is having trouble with the
{ label, ...props } // How do i extract this?
and
const [field, meta] = useField(props); // Hooks are not allowed in class based components
React apparently does not allow to use Hooks in class based components. Any help is appreciated.
Thanks.
On class methods your field be like:
class MyTextInput extends React.Component {
handleChange = value => {
const { name, onChange } = this.props;
onChange(name, value.target.value);
};
handleBlur = () => {
const { name, onBlur } = this.props;
if (onBlur) {
onBlur(name, true);
}
};
render() {
const { label, touched, errors, id, name, value, ...attributes } = this.props;
const err = getIn(errors, name);
const touch = getIn(touched, name);
return (
<>
<label htmlFor={id || name}>{label}</label>
<Field
{...attributes}
name={name}
value={value || ''}
className="text-input"
onChange={this.handleChange}
onBlur={this.handleBlur}
/>
{touch && err ? <div className="error">{err}</div> : null}
</>
);
}
}
And formik
field:
const SignupForm = () => {
return (
<>
<h1>Subscribe!</h1>
<Formik
...
>
{({ setFieldValue, setFieldTouched, values, errors, touched }) => (
<Form>
<MyTextInput
label="First Name"
name="firstName"
errors={errors}
touched={touched}
value={values.firstName}
onChange={setFieldValue}
onBlur={setFieldTouched}
placeholder="Jane"
/>
<MyTextInput
label="Last Name"
name="lastName"
type="text"
placeholder="Doe"
/>
<MyTextInput
label="Email Address"
name="email"
type="email"
placeholder="jane@formik.com"
/>
<button type="submit">Submit</button>
</Form>
)}
</Formik>
</>
);
};
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.