javascript - 如何在 MenuItem 中设置用户级别?
问题描述
我需要在默认值中设置一个值,无论基于用户级别下拉值中先前选择的值意味着什么,我的任务是我需要在默认选择中设置该值,因为在我时间一个值成真,所以如果用户选择任何上一个下拉列表中的一个名称,例如在用户名下拉列表 dev_sams 中选择所以我需要将 maker 设置为直接在用户级别默认值标签将根据用户名更改,因此需要设置动态我添加了一些示例值和标签是如何产生的更好的理解参见 CodeSand Box 链接
import React, { useMemo } from "react";
import {
Grid,
Card,
CardContent,
Button,
Box,
TextField,
MenuItem,
makeStyles
} from "@material-ui/core";
import { useFormik } from "formik";
const useStyles = makeStyles((theme) => ({
formGrid: {
padding: theme.spacing(2)
},
tableContainer: {
maxHeight: 440
}
}));
const userList = [
{
username: "aabcd@email.com",
maker: true,
checker1: false,
checker2: false,
checker3: false,
checker4: false,
checker5: false
},
{
username: "aabc@email.com",
maker: true,
checker1: false,
checker2: false,
checker3: false,
checker4: false,
checker5: false
},
{
username: "aabcssd@email.com",
maker: false,
checker1: true,
checker2: false,
checker3: false,
checker4: false,
checker5: false
},
{
username: "dev_sams",
maker: true,
checker1: false,
checker2: false,
checker3: false,
checker4: false,
checker5: false
},
];
export default function Downloads() {
const classes = useStyles();
const downloadsForm = useFormik({
initialValues: {
Username: "",
Userlevel: ""
},
// validationSchema: downloadFormSchema,
onSubmit: (values) => {
alert(JSON.stringify(values, null, 2));
}
});
const options = useMemo(() => {
if (userList) {
let levelList = [];
for (let [key, value] of Object.entries(userList)) {
if (value === true) {
levelList.push({ value: key, label: key });
}
}
return levelList;
}
}, [userList]);
React.useEffect(() => {
if (userList) {
downloadsForm.setFieldValue("baseStr", options[0]);
}
}, [options, userList]);
return (
<Grid>
<Grid item xs={12}>
<Card color="primary" variant="outlined">
<form onSubmit={downloadsForm.handleSubmit}>
<CardContent>
<Grid xs={12} item container>
<Grid item xs={6} className={classes.formGrid}>
<TextField
id="outlined-select-currency"
select
label="User"
fullWidth
onChange={downloadsForm.handleChange}
value={downloadsForm.values.Username}
name="Username"
error={downloadsForm.errors.Username}
helperText={downloadsForm.errors.Username}
variant="outlined"
size="small"
>
{userList?.map((opt) => (
<MenuItem key={opt.username} value={opt.username}>
{opt.username}
</MenuItem>
))}
</TextField>
</Grid>
{downloadsForm.values.Username && (
<Grid item xs={6} className={classes.formGrid}>
<TextField
id="outlined-select-currency"
select
label="Level"
fullWidth
onChange={downloadsForm.handleChange}
value={downloadsForm.values.Userlevel}
name="Userlevel"
variant="outlined"
size="small"
>
<MenuItem value={options}>{options}</MenuItem>
</TextField>
</Grid>
)}
</Grid>
<Grid xs={12} item className={classes.formGrid}>
<Box
display="flex"
alignItems="flex-end"
flexDirection="column"
>
<Button variant="contained" color="primary" type="submit">
Submit
</Button>
</Box>
</Grid>
</CardContent>
</form>
</Card>
</Grid>
</Grid>
);
}
解决方案
当我们选择用户名时,我们需要以下内容,
- 获取所选用户的用户级别选项
- 使用第一个选项预填充用户级别
我们需要有一种自定义方法,应该在选定值更改时为我们执行上述步骤。创建一个新方法handleUserNameChange
,如下所示
const handleUserNameChange = (e) => {
const selectedUser = e.target.value;
// find the user
const user = userList.find((user) => user.username === selectedUser);
// iterate over the user object and generate the option list
// containing the property which has the value true
const newOptions = Object.keys(user).reduce((optionList, key) => {
if (user[key] === true) {
optionList.push({ value: key, label: key });
}
return optionList;
}, []);
// have a state to hold the options which changes based on the selected user
setOptions(newOptions);
// Manually update the formik state for username
downloadsForm.setFieldValue("Username", selectedUser);
// Manually update the formik state for userlevel by setting the
// first option as default
downloadsForm.setFieldValue("Userlevel", newOptions[0]?.value || "");
};
Username
现在在文本字段的 onChange 中使用此方法。
onChange={handleUserNameChange}
由于选项每次都会根据所选用户而更改,因此我们可以使用一种状态来保存这些选项。
工作沙箱
推荐阅读
- java - 我可以从文件中保存超过数组大小的数字吗?
- asp.net-core - 按用户偏好动态设置文化不起作用
- r - 调整 Shiny RMarkdown 报告中的大图大小
- javascript - Firefox 68.7.0esr 无法打开 html 文件
- c# - C# WPF Datagrid 在集合更改后不更新
- r - 使用 rvest 提取 url - 返回 {{article.Link}} 而不是链接?
- python - 聚合几个 pandas 数据框
- .net-core - 使用 Swashbuckle 在 Swagger 中显示 object[] 的对象类型
- javascript - 赛普拉斯在规范文件中找不到测试
- c# - 如何使用 UDP ping 远程服务器