You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在React动态表单提交时获取所有输入框值?

解决方法

1. 调整状态存储结构

把state里的frominput_values从空字符串改成空对象,用来存储所有输入的键值对:

constructor(props: ToscaDeploymentPageProps) {
    super(props);
    this.state = {
        frominput_values: {}, // 改为空对象存储多组输入值
    }
}

2. 修改输入变更处理函数

更新handleDefaultChange,从事件对象中获取当前输入的名称和值,只更新对应属性,保留其他输入的已有值:

const handleDefaultChange = (event: React.ChangeEvent<HTMLInputElement>) => {
    const { name, value } = event.target;
    this.setState(prevState => ({
        frominput_values: {
            ...prevState.frominput_values,
            [name]: value
        }
    }));
}

3. 修正输入框的标识与取值逻辑

因为不同分组(x/y/z)存在同名输入项(比如都有name为a的字段),需要给每个输入项设置唯一的name、id和fieldId,避免值被覆盖。同时统一value的取值逻辑:优先取用户输入的值,没有则用默认值,再为空字符串。

this.state.inputsdata[valuesmodel].map((valuesmodel1, _idx) => (                               
    <FormGroup 
        key={`${valuesmodel}-${_idx}`} // 添加唯一key避免React渲染警告
        isRequired 
        label={valuesmodel1.name} 
        fieldId={`${valuesmodel}-${valuesmodel1.name}`} // 唯一标识
    >
        <TextInput
            isRequired
            type="text"
            placeholder={valuesmodel1.default}
            id={`${valuesmodel}-${valuesmodel1.name}`} // 唯一DOM ID
            name={`${valuesmodel}-${valuesmodel1.name}`} // 唯一name用于区分输入项
            value={this.state.frominput_values[`${valuesmodel}-${valuesmodel1.name}`] || valuesmodel1.default || ''}
            onChange={handleDefaultChange}
        />
    </FormGroup>
))

4. 提交时传递完整表单值

提交按钮逻辑无需额外修改,此时this.state.frominput_values是包含所有输入项的对象,直接传入deploymodel即可:

<Button variant="primary" type="submit" onClick={ () => {this.deploymodel(this.state.frominput_values)}}>Submit</Button>

修改后的完整关键代码片段

deploymodel = (frominput_values: any) => {
    console.log("Frominput Values : ", frominput_values);
};

constructor(props: ToscaDeploymentPageProps) {
    super(props);
    this.state = {
        frominput_values: {},
    };
}

render() {
    const handleDefaultChange = (event: React.ChangeEvent<HTMLInputElement>) => {
        const { name, value } = event.target;
        this.setState(prevState => ({
            frominput_values: {
                ...prevState.frominput_values,
                [name]: value
            }
        }));
    };

    return (
        <>
            <Form>
                {this.state.inputsdata ?
                    Object.keys(this.state.inputsdata).map((valuesmodel, _I) => (
                        <FormFieldGroupExpandable
                            key={valuesmodel} // 添加唯一key
                            required
                            toggleAriaLabel={valuesmodel}
                            header={
                                <FormFieldGroupHeader
                                    titleText={{ text: `${valuesmodel} Inputs`, id: valuesmodel }}
                                />
                            }
                        >
                            {this.state.inputsdata ?
                                this.state.inputsdata[valuesmodel].map((valuesmodel1, _idx) => (
                                    <FormGroup
                                        key={`${valuesmodel}-${_idx}`}
                                        isRequired
                                        label={valuesmodel1.name}
                                        fieldId={`${valuesmodel}-${valuesmodel1.name}`}
                                    >
                                        <TextInput
                                            isRequired
                                            type="text"
                                            placeholder={valuesmodel1.default}
                                            id={`${valuesmodel}-${valuesmodel1.name}`}
                                            name={`${valuesmodel}-${valuesmodel1.name}`}
                                            value={this.state.frominput_values[`${valuesmodel}-${valuesmodel1.name}`] || valuesmodel1.default || ''}
                                            onChange={handleDefaultChange}
                                        />
                                    </FormGroup>
                                )) : "Loading..."
                            }
                        </FormFieldGroupExpandable>
                    )) : "Loading..."
                }
                <ActionGroup>
                    <Button variant="primary" type="submit" onClick={() => { this.deploymodel(this.state.frominput_values) }}>Submit</Button>
                </ActionGroup>
            </Form>
        </>
    );
}

内容的提问来源于stack exchange,提问作者Dhananjay Gahiwade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 01:50:25