【发布时间】:2019-08-23 23:55:23
【问题描述】:
我正在尝试创建一个基于 JSON 响应动态映射字段的表单。
我目前有一个正在设置状态的虚拟对象,但最后阶段将接收来自外部 API 调用的数据。数据集可能会随着时间的推移而变化,根据业务需要添加或删除键/值。取而代之的是,我需要创建一个智能组件,它采用一组初始数据并为对象中的每个键/值对映射一个“只读”字段。
第二个问题是实际的表单布局。我在下面有一个初始脚手架,我只对列和行进行了硬编码。如何实现从数据响应中创建两列行的逻辑?
非常感谢您对此的任何想法/帮助!
代码:
import React, { Component } from 'react';
import { render } from 'react-dom';
import { Form, Button, Input, Row, Col } from 'antd';
import "antd/dist/antd.css";
import './style.css';
class OpportunityDetails extends Component {
constructor() {
super();
this.state = {
disabled: true,
formLayout: 'horizontal',
opportunityDetails: [
{
CustomerName: "",
Field2: "Some data",
Field3: "Some data",
Field4: "Some data",
Field5: "Some data",
Field6: "Some data",
Field7: "Some data",
Field8: "Some data",
Field9: "Some data",
Field10: "Some data",
Field11: "Some data",
Field12: "Some data",
Field13: "Some data",
Field14: "Some data",
Field15: "Some data"
}
]
};
this.toggleSwitch = this.toggleSwitch.bind(this)
}
toggleSwitch() {
this.setState(previousState => ({
disabled: !previousState.disabled,
enabled: previousState.disabled
}))
}
modifyRoute(){
alert("Sending you to the modify floor");
}
uploadRoute(){
alert("Sending you to the upload sector!")
}
render() {
const { disabled } = this.state;
const { enabled } = this.state;
return (
<div className={}>
/// Button Group
<Row type="flex" justify="space-around">
<Col span={4}>
<Button disabled={disabled} onClick={this.modifyRoute}>Modify Docs</Button>
</Col>
<Col span={4}>
<Button disabled={disabled} onClick={this.uploadRoute}>Upload Docs</Button>
</Col>
<Col span={4}>
<Button disabled={enabled} onClick={this.toggleSwitch}>
Unlock Quote
</Button>
</Col>
</Row>
/// Form section with columns and rows for all key/value pairs
<Row type="flex" justify="space-around">
<Col span={10}>
<Form.Item label={key}>
<Input placeholder={value} />
</Form.Item>
</Col>
<Col span={10}>
<Form.Item label={key}>
<Input placeholder="{value} />
</Form.Item>
</Col>
</Row>
<Row type="flex" justify="space-around">
<Col span={10}>
<Form.Item label={key}>
<Input placeholder={value} />
</Form.Item>
</Col>
<Col span={10}>
<Form.Item label={key}>
<Input placeholder={value} />
</Form.Item>
</Col>
</Row>
<Row type="flex" justify="space-around">
<Col span={10}>
<Form.Item label={key}>
<Input placeholder={value} />
</Form.Item>
</Col>
<Col span={10}>
<Form.Item label={key}>
<Input placeholder={value} />
</Form.Item>
</Col>
</Row>
<Row type="flex" justify="space-around">
<Col span={10}>
<Form.Item label={key}>
<Input placeholder={value} />
</Form.Item>
</Col>
<Col span={10}>
<Form.Item label={key}>
<Input placeholder={value} />
</Form.Item>
</Col>
</Row>
</div>
);
}
}
render(<OpportunityDetails />, document.getElementById('root'));
【问题讨论】:
-
迭代函数有问题吗?
-
我不太清楚如何设置迭代函数来创建 Antd 元素
-
对象和数组的迭代与 Antd 或 React 无关,它是基本的 JavaScript 函数。我建议您花更多时间学习 JavaScript,然后 React,您将能够将所有内容应用到每个 UI 库、Antd、Bootstrap Material ...
-
我知道如何迭代一个对象,但 Antd 显示标题和文本的方式让我很反感。我可以从
opportunityDetails.map(key => (<Row type="flex" justify="space-around"> <Col span={10}> <Form.Item label={key=opportunityDetails.key}> <Input placeholder={opportunityDetail.value} /> </Form.Item> </Col>之类的返回部分设置映射,但由于您如何定义 Title 和实际<Form.item>组件中的文本,这与 Antd 的关系并不好 -
这就是问题所在,map 在数组之上,但是在你的数组中你有一个对象,你不能在对象上映射,你应该使用,例如对于每个键,值对
标签: reactjs forms parent-child dynamically-generated antd