使用自动完成材料UI响应表单挂钩

时间:2020-07-20 14:16:10

标签: reactjs material-ui react-hook-form

我有一个countries数组,其中包含idname。当前,我正在使用Material UI Autocomplete元素,并且具有React Hook表单。提交表单时,我想获取国家/地区ID。目前,它正在发布国家名称。有没有一种方法可以发布ID而不是名称,而无需从名称中获取ID。

   <Autocomplete
      className="form-item"
      options={countries}
      getOptionLabel={option => option.name}
      renderInput={params => (
        <TextField
          {...params}
          inputRef={register}
          label="Country"
          name="country"
          placeholder="Select a Country"
          InputLabelProps={{
            shrink: true
          }}
          variant="outlined"
        />
      )}
    />

2 个答案:

答案 0 :(得分:1)

使用react-hook-form的Controller并将整个Autocomplete放入as道具中。这样,提交表单时,您将获得所选选项的整个对象。

注意:在react-hook-form版本6.x onChange is removed中,as道具将具有功能,您可以获得{{1} }作为参数。

Working demo - v6

onChange

注意:如果您使用的是v5x,请参见下面的演示和代码段。

Working demo - v5

    <Controller
        as={({ onChange }) => (
          <Autocomplete
            className="form-item"
            options={countries}
            onChange={(_, data) => onChange(data)}
            getOptionLabel={option => option.label}
            renderInput={params => (
              <TextField
                {...params}
                label="Country"
                placeholder="Select a Country"
                InputLabelProps={{
                  shrink: true
                }}
                variant="outlined"
              />
            )}
          />
        )}
        name="country"
        control={control}
        defaultValue={{ label: "The Shawshank Redemption", id: "1994" }}
      />

修改:基于评论 您可以使用setValue来基于api设置默认值。

代码段:

   <Controller
        as={
          <Autocomplete
            className="form-item"
            options={countries}
            getOptionLabel={option => option.label}
            renderInput={params => (
              <TextField
                {...params}
                label="Country"
                placeholder="Select a Country"
                InputLabelProps={{
                  shrink: true
                }}
                variant="outlined"
              />
            )}
          />
        }
        name="country"
        control={control}
        onChange={([, data]) => data}
        defaultValue={{ label: "The Shawshank Redemption", id: "1994" }}
      />

上面的演示v6已更新。

另请参见official demo of setValue usage here

答案 1 :(得分:-1)

恐怕没有一种“简便”的方法来获取当前设置的ID。

但是,您可以加入Autocomplete#onChange事件并使用value道具来接管自动完成组件的内部值状态。这样就可以在组件中获得可用的值,并利用它来发挥自己的优势。

在下面的示例中,id在表单数据中将以country-id的形式提供。

function CountryAutocomplete() {
  const [value, setValue] = useState(); // `[]` for multiple

  return (
    <React.Fragment>
      <Autocomplete
        className="form-item"
        value={value}
        onChange={(event, value) => setValue(value)}
        options={countries}
        getOptionLabel={option => option.name}
        renderInput={params => (
          <TextField
            {...params}
            inputRef={register}
            label="Country"
            name="country"
            placeholder="Select a Country"
            InputLabelProps={{
              shrink: true
            }}
            variant="outlined"
          />
        )}
      />
      <input value={value?.id} name="country-id" />
    </React.Fragment>
  );
}