reactjs - react-admin中有两个字段的自动完成输入?
问题描述
我正在使用 react-admin 创建一个站点,并使用以下代码创建了一个带有 id 和 description 的 AutocompleteInput,这样您就可以同时搜索它们,它会过滤选项。
const choices = [
{ number: 102, description: 'Furniture' },
{ number: 103, description: 'Rugs' },
{ number: 104, description: 'Plants' },
];
const optionRenderer = choice => `${choice.number} ${choice.description}`;
export const ActionsCreate = (props) => (
<Create title=" " {...props}>
<SimpleForm>
<AutocompleteInput source="casenumber" label="Juttu" choices={choices} optionText={optionRenderer} optionValue="number"/>
<TextInput source="billed" label="Tila" />
<TextInput source="handler" label="Tekijä" />
</SimpleForm>
</Create>
);
此代码生成以下内容: 我现在尝试生成相同的内容,但选择不是静态的。选择引用我数据库中的另一个表,“数字”是将我创建的条目与该“选择”表链接的数字。通常人们使用 ReferenceInput 和 AutocompleteInput 但我认为我需要创建一个自定义字段并使用 useDataProvider() 获取表来实现这一点,所以我尝试了以下方法:
const CasesAutocompleteInput = () => {
const dataProvider = useDataProvider();
let choices = [];
const res = dataProvider.getList('cases', {
pagination: { page: 1, perPage: 500 },
sort: { field: 'number', order: 'ASC' },
filter: { },
}).then(response => choices = response.data);
const optionRenderer = choice => `${choice.number} ${choice.description}`;
return(
<AutocompleteInput source="casenumber" label="Juttu" choices={choices} optionText={optionRenderer} optionValue="number"/>
);
};
之后我使用我的组件如下:
export const ActionsCreate = (props) => (
<Create title=" " {...props}>
<SimpleForm>
<CasesAutocompleteInput />
<TextInput source="billed" label="Tila" />
<TextInput source="handler" label="Tekijä" />
</SimpleForm>
</Create>
但是这样做时,组件 AutocompleteInput 在分配数据之前呈现,因此数据不会到达我的组件。有没有办法让它等到 dataProvider.getList 准备好后再发送返回?我尝试了等待/异步,但问题是结果是一个承诺而不是一个对象。我确定我接近解决方案,但已经被困了一段时间。
解决方案
看一下UseEffect
钩子示例:查询 API,在 React-Admin 文档中提供。
我刚刚试过你的例子是这样的:
const ActivityCreate = (props) => {
const dataProvider = useDataProvider();
const [projects, setProjects] = useState();
const [loading, setLoading] = useState(true);
const [error, setError] = useState();
useEffect(() => {
dataProvider
.getList("projects", {
pagination: { page: 1, perPage: 100 },
sort: { field: "id", order: "ASC" },
filter: {},
})
.then(({ data }) => {
setProjects(data);
setLoading(false);
})
.catch((error) => {
setError(error);
setLoading(false);
});
}, []);
if (loading) return <Loading />;
if (error) return <Error />;
if (!projects) return null;
const project_choices = projects.map((project) => ({
id: project.id,
name: project.name,
}));
return (
<Create {...props}>
<SimpleForm>
<SelectInput source="project" choices={project_choices} />
</SimpleForm>
</Create>
);
};
推荐阅读
- javascript - 如何在 jquery 中优化 ajax 响应?
- sql-server - 仅使用 SQL 语法生成创建存储过程脚本
- java - 如何将JMeter(主从)的端口配置到防火墙
- python-3.x - Tensorflow 加载数据集:UnimplementedError:Append(absl::Cord) 未实现 [Op:TakeDataset]
- pytorch - 具有不同图像尺寸的 Torch 模型
- wcf - 如何使用 .net 5 使用 WCF 服务
- sql - 如何优化长时间运行的 cte
- swift - 带有尾随闭包的 Guard - Swift 语法
- javascript - 如何正确应用 sass 加载器来应用样式
- function - 与 R 中的 ifelse 函数作斗争