#javascript #reactjs #material-ui
Вопрос:
Мне нужно установить значение по умолчанию независимо от того, какое значение будет иметь значение на основе предыдущего выбора в раскрывающемся списке уровня пользователя, так что моя задача состоит в том, чтобы установить это значение по умолчанию, выбранное, потому что в то время, когда одно значение сбывается, поэтому, если пользователь выберет какое-либо одно имя в предыдущем раскрывающемся списке, например, в раскрывающемся списке Имя пользователя, выберите dev_sams, поэтому мне нужно установить создателя для направления в значение по умолчанию на уровне пользователя, метка изменится в соответствии с именем пользователя, поэтому необходимо установить динамический Я добавил пример того, как значение и метка приходят для лучшего понимания см. Ссылку на Код и поле
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 amp;amp; (
<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>
);
}
Комментарии:
1. Ожидаемое поведение не ясно из вашего объяснения . Что должно произойти с текстовым полем уровня, когда я выбираю значение в раскрывающемся списке пользователя ? Должен ли он быть автоматически заполнен «истиной» или «ложью» ???
2. вы можете видеть, что я обновил код с некоторыми данными о том, как поступают данные
3. так что true и false со своим значением, поэтому в зависимости от выбранного выпадающего списка пользователя мы выберем true для уровня
Ответ №1:
Когда мы выбираем имя пользователя, нам нужно выполнить следующие действия,
- получите параметры пользовательского уровня для выбранного пользователя
- предварительно заполните уровень пользователя первым вариантом
нам нужен пользовательский метод, который должен выполнять описанные выше действия за нас при изменении выбранного значения. создайте новый метод, называемый 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={handleUserNameChange}
Поскольку параметры каждый раз меняются в зависимости от выбранного пользователя, у нас может быть одно состояние для хранения этих параметров .
Рабочая песочница