javascript - 在 React-Admin 中使用第三方 API 数据填充字段
问题描述
我们正在使用 ReactAdmin 创建一些表单。其中一种形式可以为用户添加多个地址。为了构建这个表单,我们使用 SimpleFormIterator(在 SimpleForm 中)。我需要做的是使用来自第三方 API 的数据更新地址输入字段。我需要对 API 进行 2 次调用,第一次调用根据用户输入获取地址,然后获取用户从 AutocompleteInput 中选择的地址。
第一个调用工作查找并填充 AutocompleteInput,第二个 API 调用获取数据并更新字段,但 ReactAdmin 不注册新值并且地址的 SAVE 不包含新值。你知道为什么会这样吗?以下是我已经执行的步骤:
- 添加了自动完成输入,可以让我了解用户输入的内容
- 检索了多个地址并填充了 AutocompleteInput 建议
- 设法从用户选择的建议中获取数据
获取数据后,我可以使用value属性填充地址字段。我的问题是,由 ReactAdmin 的 SimpleForm 管理的整体数据没有被填充,也没有被发送到服务器。有没有人试过这个?
您可以在下面看到我的代码片段。
const UserCreate = (props) => {
const [userAddresses, setUserAddresses] = useState({});
const onUserAddressesChange = (data) => {
setUserAddresses(data);
};
return (<Create {...props}>
<SimpleForm
submitOnEnter={false}
redirect={redirect}>
<AddressFields
name='userAddresses'
value={userAddresses}
onAddressChange={onUserAddressesChange} />
</SimpleForm>
</Create>);
}
const AddressFields = (props) => {
const { onAddressChange } = props;
const [address, setAddress] = useState({
city: '',
addressLine1: '',
addressLine2: '',
addressLine3: '',
});
const onAddressIdChange = (addressId) => {
dataProvider.getAddress(addressId)
.then((result) => {
const retrievedAddress = result.data[0];
const newAddress = {
city: retrievedAddress.Field2,
addressLine1: retrievedAddress.Field3,
addressLine2: retrievedAddress.Field4,
addressLine3: retrievedAddress.Field5
};
setAddress( newAddress );
onAddressChange( newAddress );
});
};
return (
<div>
<ArrayInput source="userAddresses">
<SimpleFormIterator>
<AddressLookupInput
onAddressIdChange={onAddressIdChange}>
</AddressLookupInput>
<AddressInputs address={address} />
</SimpleFormIterator>
</ArrayInput>
</div>
);
};
class AddressLookupInput extends Component {
constructor(props) {
super(props);
this.onFilterToQuery = this.onFilterToQuery.bind(this);
}
onFilterToQuery(searchText) {
return { searchText };
}
render() {
const { onAddressIdChange } = this.props;
return (
<ReferenceInput
onChange={onAddressIdChange}
source='addressesSource'
reference='addressReference'
label="Address lookup"
filterToQuery={this.onFilterToQuery}>
<AutocompleteInput
optionValue="id"
optionText="addressText"
></AutocompleteInput>
</ReferenceInput>
);
}
}
const AddressInputs = ({ address, ...props }) => {
return (
<Fragment>
<TextInput
label="Address Line1"
source="addressLine1"
value={address.addressLine1} />
<TextInput
label="Address Line2"
value={address.addressLine2}
source="addressLine2" />
<TextInput
label="Address Line3"
value={address.addressLine3}
source="addressLine3" />
<TextInput
label="City"
value={address.city}
source="city" />
</Fragment>
);
};
解决方案
推荐阅读
- azure-synapse - 使用专用 SQL 服务器 VM 的 Azure Synapse AI
- python - 使用python自动提取aws密钥
- html - Bootstrap 翻转卡正面和背面不是彼此的顶部
- database - 过滤掉重复数组并返回mongodb聚合中的唯一数组
- c++ - 使用英特尔 C 编译器避免来自系统包含文件的警告
- java - 如何回到代码的开头而不结束它?
- python - 有没有办法检查我的代码的哪一部分使文件句柄处于打开状态
- sql - Rails - 如何将 find_by_sql (数组)的输出转换为 ActiveRecord 关系?
- javascript - 填充 JSON 数据 formArray Angular 11
- c# - System.Security.Cryptography.Pkcs 命名空间是 .NET 5.0 内置的吗?