当前位置: 首页 > 知识库问答 >
问题:

MUI自动完成和反应钩子窗体未显示所选选项和获取的数据

阳念
2023-03-14

我在react hook表单的表单中有一个MUI自动完成,它在填充表单时可以正常工作,但是当我想显示填充了提取数据的表单时,MUI自动完成仅在两次渲染后显示所选选项。

我认为这是使用效果和重置(从反应钩子形式)的东西,因为自动完成其选项是静态的工作正常,但我也必须从我的API获取选项的那些只有在第二次使用效果运行后才能正常工作。

我无法复制codesandbox,因为它是一个使用真实api的大型项目,但如果需要,我可以提供更多信息。如果有人能帮我,请提前感谢。

选择要在表单中可视化的项目的页面:

const People: React.FC = () => {

  const [show, setShow] = useState(false);
  const [modalData, setModalData] = useState<PeopleProps>({} as PeopleProps);

  async function showCustomer(id: string) {
    await api
      .get(`people/${id}`)
      .then((response) => {
        setModalData(response.data);
        setShow(true);
      })
      .catch((error) => toast.error('Error')
      )
  }

  return (
    <>
      {...} // there's a table here with items that onClick will fire showCustomer() 

      <Modal
        data={modalData}
        visible={show}
      />
    </>
  );
};

模态中的我的表单:

const Modal: React.FC<ModalProps> = ({data, visible}) => {
  const [situations, setSituations] = useState<Options[]>([]);
  const methods = useForm<PeopleProps>({defaultValues: data});
  const {reset} = methods;

  /* FETCH POSSIBLE SITUATIONS FROM API*/
  useEffect(() => {
    api
      .get('situations')
      .then((situation) => setSituations(situation.data.data))
      .catch((error) => toast.error('Error'));
  }, [visible]);
  /* RESET FORM TO POPULATE WITH FETCHED DATA */
  useEffect(() => reset(data), [visible]);

  return (
    <Dialog open={visible}>
      <FormProvider {...methods}>
        <DialogContent>
          <ComboBox
            name="situation_id"
            label="Situação"
            options={situations.map((item) => ({
              id: item.id,
              text: item.description
            }))}
          />
        </DialogContent>
      </FormProvider>
    </Dialog>
  );
};
export default Modal;

组合框组件:

const ComboBox: React.FC<ComboProps> = ({name, options, ...props}) => {
  const {control, getValues} = useFormContext();

  return (
    <Controller
      name={`${name}`}
      control={control}
      render={(props) => (
        <Autocomplete
          {...props}
          options={options}
          getOptionLabel={(option) => option.text}
          getOptionSelected={(option, value) => option.id === value.id}
          defaultValue={options.find(
            (item) => item.id === getValues(`${name}`)
          )}
          renderInput={(params) => (
            <TextField
              variant="outlined"
              {...props}
              {...params}
            />
          )}
          onChange={(event, data) => {
            props.field.onChange(data?.id);
          }}
        />
      )}
    />
  );
};

export default ComboBox;

共有1个答案

程吕恭
2023-03-14

我认为你在这里简化了一些事情:

  • 呈现

我制作了一个小的代码沙盒,试图复制您的用例,看看:

另一个重要的事情:只有当您有深度嵌套的控件时,您才应该使用useFormContext,否则只需将控件传递给您的

React钩子窗体的FormProvider是基于React的上下文API构建的。它解决了数据通过组件树传递的问题,而无需在每个级别手动传递道具。这还会导致组件树在React钩子窗体触发状态更新时触发重新渲染

 类似资料:
  • 我想在react中处理选择的事件,示例如何在普通JS中工作。 因此我为选择创建了react组件:

  • 我正在使用AutoCompleteTextView进行地址建议。 我想做的是当用户输入地址(f. e.“Ma”)时,建议会显示为“Mary, Madley, Ma…”。 然后,当用户选择其中一个建议时,他会立即获得另一个包含整个地址的建议。 例如:他选择了“玛丽”,他得到了像“玛丽123,波士顿”、“玛丽1566,纽约”、“玛丽简569,纽约”这样的建议。 问题是建议填写了适配器,但没有显示。选择

  • 我有这样一个下拉列表: 如何使用JavaScript获得实际的选项文本而不是值?我可以通过以下方法获得值: 但我想要的不是而是。

  • 我有两个<代码> 当用户从第一个选择框中选择一个值时,我希望第二个选择框只显示连接的值。 我的代码: 因此,当用户从第一个选择框M中选择“test1”时,他在第二个选择框上只会看到“test2”、“test3”和“test4”;第一个框中的“test2”将在第二个框中显示“test6”、“test7”和“test8”。 如何使用JavaScript解决此问题?

  • 问题内容: 嗨, 这是从JComboBox作为字符串获取值的正确方法,以及为什么它是正确的方法。谢谢。 要么 问题答案: 如果仅在JComboBox中放置(非空)引用,则两种方法都可以。 但是,第一种解决方案还允许将来进行修改,您可以在组合框中插入s,s,s等作为项目。 为了对值保持鲁棒性(仍然不强制转换),您可以考虑第三个选择:

  • 运行Tomcat6服务器。单击更新选项,我得到以下选项- 中更新资源和类的选项不再显示。不是为了更新JSP,我已经重新启动了服务器。