设置DefaultValue时,MUI选择不更改值
我有一个来自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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
输入元素必须受到控制或不受控制(指定值Prop或DefaultValue Prop,但不能同时进行)。您应该在使用受控或不受控制的输入元素之间做出决定,并删除其中一种道具。我认为您需要受控的输入,因为您可能以表格的某种状态保持输入值。
在
useform
挂钩中声明defaultValues应该足够,并且这些挂钩将自动绑定到其内部形式的相关输入字段。例如:当这样使用时,
fielda
和fieldb
的默认值将在其相关字段中自动设置为在其内部形式的初始值中,您只需要确保您正在适当地使用相关形式状态绑定这些字段。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:When using like this, those default values for
FieldA
andFieldB
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.