I have one container component and one form component:
Form component:
import * as React from 'react';
import { reduxForm, Field, InjectedFormProps } from 'redux-form';
export type LoginState = {
email: string;
password: string;
};
interface LoginProps extends InjectedFormProps {
isLoading: boolean;
onSubmit(userCredential: LoginState): void;
}
class Login extends React.Component<LoginProps, LoginState> {
constructor(props: LoginProps) {
super(props);
this.state = {
email: '',
password: '',
otp: '',
};
}
onEmailChange = (e: React.FormEvent<HTMLInputElement>) => {
this.setState({ email: e.currentTarget.value.trim() });
};
onPasswordChange = (e: React.FormEvent<HTMLInputElement>) => {
this.setState({ password: e.currentTarget.value.trim() });
};
onSubmit = () => {
this.props.onSubmit(this.state);
};
render() {
return (
<div>
<h3 className="ac-section__title">Login</h3>
<div className="ac-section__body">
<form onSubmit={this.props.handleSubmit(this.onSubmit)}>
<Field
name="email"
placeholder="Email"
component={renderInput}
type="email"
value={this.state.email}
onChange={this.onEmailChange}
validate={[required, email]}
/>
<Field
name="password"
placeholder="Password"
component={renderInput}
type="password"
value={this.state.password}
onChange={this.onPasswordChange}
validate={required}
/>
<br />
<div className="loginBtnContainer">
<button className="btn primaryButton" type="submit">
Login
</button>
</div>
</form>
<div className="ac-password__wrapper">
<Link to="/forgot-password" className="ac-password-link">
Forgot your password?
</Link>
</div>
</div>
</div>
);
}
}
export default reduxForm({ form: 'loginForm' })(Login);
Container component:
return (
<div>
<Login onSubmit={this.onSubmit} isLoading={true} />
/* here throwing error: Property 'isLoading' does not exist on type 'IntrinsicAttributes & IntrinsicClassAttributes<FormInstance<{}, Partial<ConfigProps<{}, {}>>>> & ...'. */
</div>
);
here isLoading
is not passing as a props to form component. please help me out with a good solution.
Thanks :)
IntrinsicAttributes interface can be used to specify extra properties used by the JSX framework which are not generally used by the components' props or arguments - for instance key in React. Specializing further, the generic JSX.
The error "Type is missing the following properties from type" occurs when the type we assign to a variable is missing some of the properties the actual type of the variable expects. To solve the error, make sure to specify all of the required properties on the object.
To pass an object as props to a component in React TypeScript: Define an interface for the type of the object. Pass an object of the specified type to the child component, e.g. <Employee {... obj} /> .
Redux Form is a very efficient approach for form handling and validation in React + Redux environments. Here the issue you are having looks to be about missing props, and a few interface definitions. I have provided a sandbox at the end.
A solution could be to specify the form interface by yourself, something like this:
export interface FormInterface {
handleSubmit: PropTypes.func;
handleChange?: PropTypes.func;
reset?: PropTypes.func;
pristine?: PropTypes.bool;
submitting?: PropTypes.bool;
error?: PropTypes.bool;
invalid?: PropTypes.bool;
submitSucceeded?: PropTypes.bool;
submitFailed?: PropTypes.bool;
anyTouched?: PropTypes.bool;
}
and use that to derive LoginProps
from. Then typescript won't complain about missing props, which is apparently the way redux form works.
See this sandbox for details. I have gone over a few minor stuff for you, as well.
Hope this helps.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With