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

React-admin 4.1.0中AutocompleteArrayInput设默认值后搜索失效咨询

问题分析与解决方案

问题原因

这是AutocompleteArrayInput搭配ReferenceArrayInput时,手动设置defaultValue引发的状态冲突,并非你的代码逻辑错误。

在react-admin中,ReferenceArrayInput会自动通过source属性从record中读取对应字段(此处为sector_industry_ids)作为默认值。而你通过useMemo生成的industries依赖record,当搜索操作触发组件重新渲染时,record可能发生细微变化(或组件重渲染触发useMemo重新计算),导致defaultValue被更新,进而重置了组件内部的已选值状态。

解决方案

方案1:移除手动设置的defaultValue(推荐)

既然ReferenceArrayInput会自动从record的sector_industry_ids字段加载默认值,只需确保表单初始化时,record.sector_industry_ids已被正确赋值为你需要的默认值(比如从disclosure_template_sector_industries映射而来),无需手动设置defaultValue:

// 确保record.sector_industry_ids已在表单初始化时被正确赋值
<ReferenceArrayInput
   source="sector_industry_ids"
   reference="sector_industry"
   perPage={100}
>
      <AutocompleteArrayInput
        filterToQuery={(name) => ({ name })}
        validate={[required()]}
      />
</ReferenceArrayInput>

方案2:固定默认值的初始化时机

若确实需要手动指定默认值,为避免defaultValue随组件重渲染反复更新,改用useState在组件挂载时仅初始化一次:

import { useState } from 'react';

// 仅在组件挂载时计算一次默认值,不受后续record变化影响
const [defaultIndustries] = useState(() => 
  record.disclosure_template_sector_industries.map(item => item.sector_industry.id)
);

<ReferenceArrayInput
   source="sector_industry_ids"
   reference="sector_industry"
   perPage={100}
>
      <AutocompleteArrayInput
        filterToQuery={(name) => ({ name })}
        validate={[required()]}
        defaultValue={defaultIndustries}
      />
</ReferenceArrayInput>

为什么useMemo不可行?

useMemo的依赖是record,当搜索操作触发组件重渲染时,record可能因表单状态更新而变化,导致industries被重新计算,defaultValue随之更新,触发组件内部状态重置,最终清空已选值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:24:53