设置DefaultValue时,MUI选择不更改值

发布于 2025-02-10 03:05:42 字数 3241 浏览 3 评论 0原文

我有一个来自MUI反应性的含义。 我还与控制器使用反应钩形式。 在控制器中,我将设置DefaultValue,因为我想使用RESET函数von React-Hook-form。但是,当我设置默认值时,我无法更改值。如果没有默认值,则可以按预期效果。 这是我的代码:

import * as React from "react";
import { useTheme } from "@mui/material/styles";
import OutlinedInput from "@mui/material/OutlinedInput";
import InputLabel from "@mui/material/InputLabel";
import MenuItem from "@mui/material/MenuItem";
import FormControl from "@mui/material/FormControl";
import Select from "@mui/material/Select";
import { useFormContext, Controller } from "react-hook-form";
import Box from '@mui/material/Box';
const ITEM_HEIGHT = 48;
const ITEM_PADDING_TOP = 8;
const MenuProps = {
  PaperProps: {
    style: {
      maxHeight: ITEM_HEIGHT * 4.5 + ITEM_PADDING_TOP,
      width: 250,
    },
  },
};

function getStyles(name, personName, theme) {
  return {
    fontWeight:
      personName.indexOf(name) === -1
        ? theme.typography.fontWeightRegular
        : theme.typography.fontWeightMedium,
  };
}

function MySelect({ formname, name, reset, setSelected, data = [] }) {
  const {
    control,
    formState: { errors },
    setValue,
  } = useFormContext();

  let isError = false;
  let errorMessage = "";
  if (errors && errors.hasOwnProperty(name)) {
    isError = true;
    errorMessage = errors[name].message;
  }

  const handleChange = (event) => {
    const {
      target: { value },
    } = event;
    setSelected(
      // On autofill we get a stringified value.
      typeof value === "string" ? value.split(",") : value
    );
  };


  return (
    <Box sx={{minWidth: 120}}>
      <InputLabel id="demo-multiple-name-label">{name}</InputLabel>
      <Controller
        name={formname}
        style={{ width: 200 }}
        control={control}
        defaultValue=""
        render={({ field: { onChange, value } }) => (
          <Select
            sx={{ width: 200 }}
            labelId="demo-multiple-name-label"
            id="demo-multiple-name"
            multiple={false}
            value={value}
            onChange={onChange}
            input={<OutlinedInput label={name} />}
            MenuProps={MenuProps}
            error={isError}
            helperText={errorMessage}
          >
            {data.map((element, i) => {
              if (element.bsa_maskenkey)
                return (
                  <MenuItem value={element} key={i}>
                    {`${element.bsa_maskenkey} ${element.we_menge}`}
                  </MenuItem>
                );
              else if (element.blager_maskenkey)
                return (
                  <MenuItem value={element} key={i}>
                    {`${element.blager_maskenkey} ${element.blagerpo_maskenkey} | Menge: ${element.summe}`}
                  </MenuItem>
                );
              else
                return (
                  <MenuItem value={element} key={i}>
                    {`${element.objekt} | Menge: ${element.menge}`}
                  </MenuItem>
                );
            })}
          </Select>
        )}
      />
    </Box>
  );
}
export default React.memo(MySelect)


```

i have a select compontent from the mui react libary.
I also use react-hook-form with controller.
In the controller i will set defaultValue becouse i want to use the reset function von react-hook-form. But when i set default value i cant change the value. When there is no default value everthing works as expected.
Here my Code:

import * as React from "react";
import { useTheme } from "@mui/material/styles";
import OutlinedInput from "@mui/material/OutlinedInput";
import InputLabel from "@mui/material/InputLabel";
import MenuItem from "@mui/material/MenuItem";
import FormControl from "@mui/material/FormControl";
import Select from "@mui/material/Select";
import { useFormContext, Controller } from "react-hook-form";
import Box from '@mui/material/Box';
const ITEM_HEIGHT = 48;
const ITEM_PADDING_TOP = 8;
const MenuProps = {
  PaperProps: {
    style: {
      maxHeight: ITEM_HEIGHT * 4.5 + ITEM_PADDING_TOP,
      width: 250,
    },
  },
};

function getStyles(name, personName, theme) {
  return {
    fontWeight:
      personName.indexOf(name) === -1
        ? theme.typography.fontWeightRegular
        : theme.typography.fontWeightMedium,
  };
}

function MySelect({ formname, name, reset, setSelected, data = [] }) {
  const {
    control,
    formState: { errors },
    setValue,
  } = useFormContext();

  let isError = false;
  let errorMessage = "";
  if (errors && errors.hasOwnProperty(name)) {
    isError = true;
    errorMessage = errors[name].message;
  }

  const handleChange = (event) => {
    const {
      target: { value },
    } = event;
    setSelected(
      // On autofill we get a stringified value.
      typeof value === "string" ? value.split(",") : value
    );
  };


  return (
    <Box sx={{minWidth: 120}}>
      <InputLabel id="demo-multiple-name-label">{name}</InputLabel>
      <Controller
        name={formname}
        style={{ width: 200 }}
        control={control}
        defaultValue=""
        render={({ field: { onChange, value } }) => (
          <Select
            sx={{ width: 200 }}
            labelId="demo-multiple-name-label"
            id="demo-multiple-name"
            multiple={false}
            value={value}
            onChange={onChange}
            input={<OutlinedInput label={name} />}
            MenuProps={MenuProps}
            error={isError}
            helperText={errorMessage}
          >
            {data.map((element, i) => {
              if (element.bsa_maskenkey)
                return (
                  <MenuItem value={element} key={i}>
                    {`${element.bsa_maskenkey} ${element.we_menge}`}
                  </MenuItem>
                );
              else if (element.blager_maskenkey)
                return (
                  <MenuItem value={element} key={i}>
                    {`${element.blager_maskenkey} ${element.blagerpo_maskenkey} | Menge: ${element.summe}`}
                  </MenuItem>
                );
              else
                return (
                  <MenuItem value={element} key={i}>
                    {`${element.objekt} | Menge: ${element.menge}`}
                  </MenuItem>
                );
            })}
          </Select>
        )}
      />
    </Box>
  );
}
export default React.memo(MySelect)


```

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

苏大泽ㄣ 2025-02-17 03:05:42

输入元素必须受到控制或不受控制(指定值Prop或DefaultValue Prop,但不能同时进行)。您应该在使用受控或不受控制的输入元素之间做出决定,并删除其中一种道具。我认为您需要受控的输入,因为您可能以表格的某种状态保持输入值。
useform挂钩中声明defaultValues应该足够,并且这些挂钩将自动绑定到其内部形式的相关输入字段。例如:

useForm({
  mode: 'onSubmit',
  reValidateMode: 'onChange',
  defaultValues: { FieldA: "foo", FieldB: "xai" },
  shouldFocusError: true,
  shouldUnregister: false,
  shouldUseNativeValidation: false
})

当这样使用时,fieldafieldb的默认值将在其相关字段中自动设置为在其内部形式的初始值中,您只需要确保您正在适当地使用相关形式状态绑定这些字段。

Input elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). You should decide between using a controlled or uncontrolled input element and remove one of these props. I assume you need controlled inputs since you probably maintain input value in some type of state of your form.
It should be just enough to declare defaultValues in useForm hook, and those will be automatically bind to their related input fields inside form. For example:

useForm({
  mode: 'onSubmit',
  reValidateMode: 'onChange',
  defaultValues: { FieldA: "foo", FieldB: "xai" },
  shouldFocusError: true,
  shouldUnregister: false,
  shouldUseNativeValidation: false
})

When using like this, those default values for FieldA and FieldB will be automatically set as initial values in their related fields inside form, you just need to be sure that you are properly binding those fields with related form state.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文