我正在使用 React、Redux、Redux-Form 和 TypeScript 开发应用程序。我正在努力使用包 @types/redux-form 定义的类型(绝对打字 https://github.com/DefinitelyTyped/DefinitelyTyped),特别是对于 FieldArray。有一个属性“组件”,我在其中传递对组件的引用,但我不知道在描述其道具时应该使用什么类型。我从下载了使用 FieldArray 的示例Redux-Form 存储库 https://github.com/erikras/redux-form并稍微修改它以与 TypeScript 一起使用。我想用compilerOption "noImplicitAny": true 来编译它。所以这是 FieldArraysForm.tsx (类似于官方示例 https://redux-form.com/7.3.0/examples/fieldarrays/):
import * as React from 'react';
import { Field, FieldArray, reduxForm } from 'redux-form';
import validate from './validate';
const renderField = (props) => {
const { touched, error } = props.meta;
const { input, label, type } = props;
return (
<div>
<label>{label}</label>
<div>
<input {...input} type={type} placeholder={label} />
{touched && error && <span>{error}</span>}
</div>
</div>
)
}
const renderHobbies = (props) => {
const { fields } = props;
const { error } = props.meta;
return (
<ul>
<li>
<button type="button" onClick={() => fields.push()}>
Add Hobby
</button>
</li>
{fields.map((hobby, index) => (
<li key={index}>
<button
type="button"
title="Remove Hobby"
onClick={() => fields.remove(index)}
/>
<Field
name={hobby}
type="text"
component={renderField}
label={`Hobby #${index + 1}`}
/>
</li>
))}
{error && <li className="error">{error}</li>}
</ul>
)
}
const renderMembers = (props) => {
const { fields } = props;
const { error, submitFailed } = props.meta;
return (
<ul>
<li>
<button type="button" onClick={() => fields.push({})}>
Add Member
</button>
{submitFailed && error && <span>{error}</span>}
</li>
{fields.map((member, index) => (
<li key={index}>
<button
type="button"
title="Remove Member"
onClick={() => fields.remove(index)}
/>
<h4>Member #{index + 1}</h4>
<Field
name={`${member}.firstName`}
type="text"
component={renderField}
label="First Name"
/>
<Field
name={`${member}.lastName`}
type="text"
component={renderField}
label="Last Name"
/>
<FieldArray name={`${member}.hobbies`} component={renderHobbies} />
</li>
))}
</ul>
)
}
const FieldArraysForm = props => {
const { handleSubmit, pristine, reset, submitting } = props
return (
<form onSubmit={handleSubmit}>
<Field
name="clubName"
type="text"
component={renderField}
label="Club Name"
/>
<FieldArray name="members" component={renderMembers} />
<div>
<button type="submit" disabled={submitting}>
Submit
</button>
<button type="button" disabled={pristine || submitting} onClick={reset}>
Clear Values
</button>
</div>
</form>
)
}
export default reduxForm({
form: 'fieldArrays', // a unique identifier for this form
validate
})(FieldArraysForm)
我如何让它与类型一起工作?
我找到了解决方案。如果有人遇到和我一样的问题,我会留下答案。
import * as React from 'react';
import { Field, FieldArray, reduxForm, WrappedFieldProps, WrappedFieldArrayProps, InjectedFormProps, GenericFieldArray } from 'redux-form';
import validate from './validate';
interface CustomFieldProps {
type?: string;
}
const FieldArrayCustom = FieldArray as new () => GenericFieldArray<Field, any>;
const renderField = (props: WrappedFieldProps & CustomFieldProps) => {
const { touched, error } = props.meta;
const { input, label, type } = props;
return (
<div>
<label>{label}</label>
<div>
<input {...input} type={type} placeholder={label} />
{touched && error && <span>{error}</span>}
</div>
</div>
)
}
const renderHobbies = (props: WrappedFieldArrayProps<undefined>) => {
const { fields } = props;
const { error } = props.meta;
return (
<ul>
<li>
<button type="button" onClick={() => fields.push(undefined)}>
Add Hobby
</button>
</li>
{fields.map((hobby, index) => (
<li key={index}>
<button
type="button"
title="Remove Hobby"
onClick={() => fields.remove(index)}
/>
<Field
name={hobby}
type="text"
component={renderField}
label={`Hobby #${index + 1}`}
/>
</li>
))}
{error && <li className="error">{error}</li>}
</ul>
)
}
const renderMembers = (props: WrappedFieldArrayProps<{}>) => {
const { fields } = props;
const { error, submitFailed } = props.meta;
return (
<ul>
<li>
<button type="button" onClick={() => fields.push({})}>
Add Member
</button>
{submitFailed && error && <span>{error}</span>}
</li>
{fields.map((member, index) => (
<li key={index}>
<button
type="button"
title="Remove Member"
onClick={() => fields.remove(index)}
/>
<h4>Member #{index + 1}</h4>
<Field
name={`${member}.firstName`}
type="text"
component={renderField}
label="First Name"
/>
<Field
name={`${member}.lastName`}
type="text"
component={renderField}
label="Last Name"
/>
<FieldArrayCustom name={`${member}.hobbies`} component={renderHobbies} />
</li>
))}
</ul>
)
}
const FieldArraysForm = (props: InjectedFormProps) => {
const { handleSubmit, pristine, reset, submitting } = props
return (
<form onSubmit={handleSubmit}>
<Field
name="clubName"
type="text"
component={renderField}
label="Club Name"
/>
<FieldArrayCustom name="members" component={renderMembers} />
<div>
<button type="submit" disabled={submitting}>
Submit
</button>
<button type="button" disabled={pristine || submitting} onClick={reset}>
Clear Values
</button>
</div>
</form>
)
}
export default reduxForm({
form: 'fieldArrays', // a unique identifier for this form
validate
})(FieldArraysForm)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)