簡體   English   中英

Material UI 的自動完成不會使用 react-hook-form 在 React 中顯示所選值

[英]Material UI's Autocomplete does not show the selected value in React using react-hook-form

我在使用 react-hook-form 以及包含nameid的對象的選項使 Material UI 的自動完成顯示所選項目時遇到問題。 當我 select 一個項目時,盒子是空的。

我有一個包含material的自定義MaterialBarFieldArray

<Controller
  control={control}
  name={`materialBars.${index}.materialId`}
  render={(
    { field: { value, onChange } }
  ) => (
    <Autocomplete
      options={materials.map(material => ({id: material.id, name: material.name})} // materials are fetched from the API
      getOptionLabel={(option) => option.name}
      value={materialItems.find((item) => `${item.id}` === value) || null}
      onChange={(_, val) => onChange(val?.id)}
      renderInput={(params) => <TextField {...params} label="Material" />}
    />
  )}
/>

codesandbox中有一個工作示例。

當我 select 列表中的一種材料時,該框被清除,並且顯示占位符文本而不是所選材料(當焦點從框中移開時)。 該項目是在引擎蓋下選擇的,因為在我的應用程序中,當我按下提交時,新選擇的材料被保存到后端。

我不知道問題出在 react-hook-form 部分、材質 UI 還是我試圖連接兩者。 我想如果選項只是一個帶有材料名稱的字符串數組(當表單模式只有 materialId 時)會更容易,但最好跟蹤 id,以便在聯系 API 時使用。

您應該在 FormValue 和 ListData 之間的materialId屬性上設置相同的類型。

例如,如果我使用數字類型,它應該是

https://codesandbox.io/s/autocomplete-forked-mpivv1?file=/src/MaterialBar.tsx

// App.tsx
const { control, reset } = useForm<FormValues>({
    defaultValues: {
      materialBars: [
        // use number instead of string
        { ..., materialId: 1 },
        { ..., materialId: 6 }
      ]
    }
  });

// util.ts
export const materials = [
  {
    id: 1, // keep it as number type
    ...
  },
  ...
];

// util.ts
export type FormValues = {
  materialBars: {
    // change it from string type to number
    materialId: number;
    ...
  }[];
};
// MaterialBar.tsx
<Controller
  ...
  ) => (
    <Autocomplete
      ...
      /* 
         Remove curly  brackets
           - change`${item.id}` to item.id
      */
      value={materialItems.find((item) => item.id === value) || null}
      
    />
  )}
/>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM