React + Formik:对嵌套对象使用值

问题描述 投票:1回答:1

我的React(TypeScript)应用程序具有以下模型:

interface IProjectInput {
    id?: string;
    name: string | i18n;
    description: string | i18n;
}
export interface i18n {
    [key: string]: string;
}

我正在使用Formikreact-bootstrapProjectInput创建新的Form

import { i18n as I18n, ... } from 'my-models';

interface State {
    validated: boolean;
    project: IProjectInput;
}

/**
 * A Form that can can edit a project
 */
class ProjectForm extends Component<Props, State> {
    constructor(props: any) {
        super(props);
        this.state = {
            project: props.project || {
                name: {},
                description: ''
            },
            validated: false
        };
    }

    async handleSubmit(values: FormikValues, actions: FormikHelpers<IProjectInput>) {
        let project = new ProjectInput();
        project = { ...project, ...values };
        console.log("form values", values);
        // actions.setSubmitting(true);
        // try {
        //     await this.props.onSubmit(project);
        // } catch (e) { }
        // actions.setSubmitting(false);
    }

    render() {
        const { t } = this.props;
        const getCurrentLng = () => i18n.language || window.localStorage.i18nextLng || '';
        const init = this.state.project || {
            name: {},
            description: ''
        };

        return (
            <div>
                <Formik
                    // validationSchema={ProjectInputSchema}
                    enableReinitialize={false}
                    onSubmit={(values, actions) => this.handleSubmit(values, actions)}
                    initialValues={init}
                >
                    {({
                        handleSubmit,
                        handleChange,
                        handleBlur,
                        values,
                        touched,
                        errors,
                        isSubmitting,
                        setFieldTouched
                    }) => {

                        return (
                            <div className="project-form">
                                <Form noValidate onSubmit={handleSubmit}>
                                    <Form.Row>
                                        <Form.Group as={Col} md={{span: 5}} controlId="projectName">
                                            <Form.Label>
                                                {t('projectName')}
                                            </Form.Label>
                                            // Input for ENGLISH text
                                            <Form.Control
                                                type="text"
                                                name="name"
                                                value={(values['name'] as I18n).en}
                                                onChange={handleChange}
                                            />
                                            // Input for FRENCH text
                                            <Form.Control
                                                type="text"
                                                name="name"
                                                value={(values['name'] as I18n).fr}
                                                onChange={handleChange}
                                            />
                                        </Form.Group>

所以最后它应该看起来像:

{
  "name": {
    "en": "yes",
    "fr": "oui"
  },
  "description" : "test",
  ...
}

我的问题是,name输入的值保持为空。

我试图在const init = this.state.project || { name: { 'en': '' },render中添加state,但这没有做任何事情。

javascript reactjs forms typescript formik
1个回答
0
投票

首先,initialValues是一个道具,除非您通过道具enableReinitialize,否则它将不会更改。因此,执行this.state.project || { name: { 'en': '' }并不好,因为它只会采用该值的第一个值,可以是this.state.project{ name: { 'en': '' },但您永远不会知道。

第二,如果您查看有关handleChange的文档:

常规输入更改事件处理程序。这将更新handleChange,其中键是事件发送输入的values[key]属性。如果不存在name属性,则name将查找输入的handleChange属性。注意:“输入”在这里表示所有HTML输入。

但是在id中,您将FormLabel属性传递为name

因此它正在尝试更新name="name",而不是例如name

您应该更改

name.en

收件人

   <Form.Control
        type="text"
        name="name"
        value={(values['name'] as I18n).en}
        onChange={handleChange}
    />
    // Input for FRENCH text
    <Form.Control
        type="text"
        name="name"
        value={(values['name'] as I18n).fr}
        onChange={handleChange}
    />
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.