为 select 字段使用 props 数据
Using props data for a select field
我正在 index.tsx
中获取数据,稍后我将其传递给 FormOne
,如下所示,然后我可以使用 props.data
[= 在 FormOne 中使用数据19=]
const [data, setData] = useState([]);
...
return (
...
<FormOne data={data} />
);
我想用 props.data
中的用户列表替换 FormOne
中的“选择用户”。这个想法是 select 用户查询,例如“他有什么地址?”,这导致用户的电子邮件地址打印在表格的正下方,也不知道该怎么做。我怎样才能做到这一点?
import {
Box,
Button,
FormControl,
Grid,
InputLabel,
MenuItem,
Select,
SelectChangeEvent,
TextField,
Typography,
} from '@mui/material';
import { useState } from 'react';
const FormOne = (props: any) => {
const [user, setUser] = useState('');
const [query, setQuery] = useState('');
const handleChange = (event: SelectChangeEvent) => {
setUser(event.target.value);
setQuery(event.target.value);
};
return (
<Box component="form" noValidate autoComplete="off">
<Typography component="h1" variant="h4" align="center">
GUI #1
</Typography>
<Grid container spacing={2}>
<Grid item xs={12}>
<FormControl variant="outlined" fullWidth>
<InputLabel id="demo-simple-select-label">Pick a user</InputLabel>
<Select
labelId="demo-simple-select-label"
id="demo-simple-select"
value={user}
onChange={handleChange}
>
<MenuItem value={10}>User 1</MenuItem>
<MenuItem value={20}>User 2</MenuItem>
<MenuItem value={30}>User 3</MenuItem>
</Select>
</FormControl>
</Grid>
<Grid item xs={12}>
<FormControl variant="outlined" fullWidth>
<InputLabel id="demo-simple-select-label">Query</InputLabel>
<Select
labelId="demo-simple-select-label"
id="demo-simple-select"
value={query}
onChange={handleChange}
>
<MenuItem value={10}>What email does he use?</MenuItem>
<MenuItem value={20}>What address does he have?</MenuItem>
</Select>
</FormControl>
</Grid>
<Grid item xs={12}>
<Button variant="contained">Submit</Button>
</Grid>
</Grid>
</Box>
);
};
export default FormOne;
CodeSandbox
在我看来,您想动态呈现 MenuItem 组件,以便归档您应该替换您的硬编码
<MenuItem value={10}>User 1</MenuItem>
<MenuItem value={20}>User 2</MenuItem>
<MenuItem value={30}>User 3</MenuItem>
像这样:
{props.data.map((item, index) => {
return <MenuItem key={index} value={item}>{item}</MenuItem>
})}
您可以在此处阅读有关列表和键呈现的更多信息:
https://reactjs.org/docs/lists-and-keys.html
为了打印用户,因为您在 select 更改时更改用户,在正确呈现 MenuItems 之后,您应该在用户对象中包含该信息,并且您应该能够像这样呈现它。
{ user && <p>{user}</p> }
如果您仍然需要帮助,您需要添加数据对象的外观,以便我帮助您。
import {
Box,
Button,
FormControl,
Grid,
InputLabel,
MenuItem,
Select,
SelectChangeEvent,
Typography,
} from '@mui/material';
import { useState, useEffect } from 'react';
interface User {
id: number;
name: string;
username: string;
email: string;
address: {
street: string;
suite: string;
city: string;
zipcode: string;
geo: {
lat: string;
lng: string;
};
};
phone: string;
website: string;
company: {
name: string;
catchPhrase: string;
bs: string;
};
}
const FormOne = (props: any) => {
const [selectedUser, setSelectedUser] = useState<User | null>(null);
const [selectedQuery, setSelectedQuery] = useState<number>(1);
// both handle change functions must be seperate
const handleQueryChange = (event: SelectChangeEvent) => {
setSelectedQuery(Number(event.target.value));
};
const handleUserChange = (event: SelectChangeEvent) => {
// since select menu item accepts string number or string[] values we put id as the value but in state we can filter the user out like this
const user = props.data.find(
(user: User) => user.id === Number(event.target.value)
);
setSelectedUser(user);
};
return (
<Box component="form" noValidate autoComplete="off">
<Typography component="h1" variant="h4" align="center">
GUI #1
</Typography>
<Grid container spacing={2}>
<Grid item xs={12}>
<FormControl variant="outlined" fullWidth>
<InputLabel id="user-label">Pick a user</InputLabel>
<Select
labelId="user-label"
id="user"
value={selectedUser?.id?.toString()}
onChange={handleUserChange}
>
{/* you can map users using javascript map function */}
{props.data.map((user: User) => {
return (
<MenuItem key={user.id} value={user.id.toString()}>
{user.email}
</MenuItem>
);
})}
</Select>
</FormControl>
</Grid>
<Grid item xs={12}>
<FormControl variant="outlined" fullWidth>
<InputLabel id="query-label">Query</InputLabel>
<Select
labelId="query-label"
id="query"
value={selectedQuery.toString()}
onChange={handleQueryChange}
>
<MenuItem value={1}>What email does he use?</MenuItem>
<MenuItem value={2}>What address does he have?</MenuItem>
</Select>
</FormControl>
</Grid>
<Grid item xs={12}>
<Button variant="contained">Submit</Button>
</Grid>
<Grid item xs={12}>
{selectedUser && selectedQuery === 1 && (
<p>user email : {`${selectedUser?.email}`}</p>
)}
{selectedUser && selectedQuery === 2 && (
<p>
user address : {selectedUser?.address?.street}
{selectedUser?.address?.city}
</p>
)}
</Grid>
</Grid>
</Box>
);
};
export default FormOne;
所以基本上,您需要映射道具才能得到 menuItems
渲染。
而且,为了显示用户数据,您必须像我在代码中所做的那样显示它。
我正在 index.tsx
中获取数据,稍后我将其传递给 FormOne
,如下所示,然后我可以使用 props.data
[= 在 FormOne 中使用数据19=]
const [data, setData] = useState([]);
...
return (
...
<FormOne data={data} />
);
我想用 props.data
中的用户列表替换 FormOne
中的“选择用户”。这个想法是 select 用户查询,例如“他有什么地址?”,这导致用户的电子邮件地址打印在表格的正下方,也不知道该怎么做。我怎样才能做到这一点?
import {
Box,
Button,
FormControl,
Grid,
InputLabel,
MenuItem,
Select,
SelectChangeEvent,
TextField,
Typography,
} from '@mui/material';
import { useState } from 'react';
const FormOne = (props: any) => {
const [user, setUser] = useState('');
const [query, setQuery] = useState('');
const handleChange = (event: SelectChangeEvent) => {
setUser(event.target.value);
setQuery(event.target.value);
};
return (
<Box component="form" noValidate autoComplete="off">
<Typography component="h1" variant="h4" align="center">
GUI #1
</Typography>
<Grid container spacing={2}>
<Grid item xs={12}>
<FormControl variant="outlined" fullWidth>
<InputLabel id="demo-simple-select-label">Pick a user</InputLabel>
<Select
labelId="demo-simple-select-label"
id="demo-simple-select"
value={user}
onChange={handleChange}
>
<MenuItem value={10}>User 1</MenuItem>
<MenuItem value={20}>User 2</MenuItem>
<MenuItem value={30}>User 3</MenuItem>
</Select>
</FormControl>
</Grid>
<Grid item xs={12}>
<FormControl variant="outlined" fullWidth>
<InputLabel id="demo-simple-select-label">Query</InputLabel>
<Select
labelId="demo-simple-select-label"
id="demo-simple-select"
value={query}
onChange={handleChange}
>
<MenuItem value={10}>What email does he use?</MenuItem>
<MenuItem value={20}>What address does he have?</MenuItem>
</Select>
</FormControl>
</Grid>
<Grid item xs={12}>
<Button variant="contained">Submit</Button>
</Grid>
</Grid>
</Box>
);
};
export default FormOne;
CodeSandbox
在我看来,您想动态呈现 MenuItem 组件,以便归档您应该替换您的硬编码
<MenuItem value={10}>User 1</MenuItem>
<MenuItem value={20}>User 2</MenuItem>
<MenuItem value={30}>User 3</MenuItem>
像这样:
{props.data.map((item, index) => {
return <MenuItem key={index} value={item}>{item}</MenuItem>
})}
您可以在此处阅读有关列表和键呈现的更多信息: https://reactjs.org/docs/lists-and-keys.html
为了打印用户,因为您在 select 更改时更改用户,在正确呈现 MenuItems 之后,您应该在用户对象中包含该信息,并且您应该能够像这样呈现它。
{ user && <p>{user}</p> }
如果您仍然需要帮助,您需要添加数据对象的外观,以便我帮助您。
import {
Box,
Button,
FormControl,
Grid,
InputLabel,
MenuItem,
Select,
SelectChangeEvent,
Typography,
} from '@mui/material';
import { useState, useEffect } from 'react';
interface User {
id: number;
name: string;
username: string;
email: string;
address: {
street: string;
suite: string;
city: string;
zipcode: string;
geo: {
lat: string;
lng: string;
};
};
phone: string;
website: string;
company: {
name: string;
catchPhrase: string;
bs: string;
};
}
const FormOne = (props: any) => {
const [selectedUser, setSelectedUser] = useState<User | null>(null);
const [selectedQuery, setSelectedQuery] = useState<number>(1);
// both handle change functions must be seperate
const handleQueryChange = (event: SelectChangeEvent) => {
setSelectedQuery(Number(event.target.value));
};
const handleUserChange = (event: SelectChangeEvent) => {
// since select menu item accepts string number or string[] values we put id as the value but in state we can filter the user out like this
const user = props.data.find(
(user: User) => user.id === Number(event.target.value)
);
setSelectedUser(user);
};
return (
<Box component="form" noValidate autoComplete="off">
<Typography component="h1" variant="h4" align="center">
GUI #1
</Typography>
<Grid container spacing={2}>
<Grid item xs={12}>
<FormControl variant="outlined" fullWidth>
<InputLabel id="user-label">Pick a user</InputLabel>
<Select
labelId="user-label"
id="user"
value={selectedUser?.id?.toString()}
onChange={handleUserChange}
>
{/* you can map users using javascript map function */}
{props.data.map((user: User) => {
return (
<MenuItem key={user.id} value={user.id.toString()}>
{user.email}
</MenuItem>
);
})}
</Select>
</FormControl>
</Grid>
<Grid item xs={12}>
<FormControl variant="outlined" fullWidth>
<InputLabel id="query-label">Query</InputLabel>
<Select
labelId="query-label"
id="query"
value={selectedQuery.toString()}
onChange={handleQueryChange}
>
<MenuItem value={1}>What email does he use?</MenuItem>
<MenuItem value={2}>What address does he have?</MenuItem>
</Select>
</FormControl>
</Grid>
<Grid item xs={12}>
<Button variant="contained">Submit</Button>
</Grid>
<Grid item xs={12}>
{selectedUser && selectedQuery === 1 && (
<p>user email : {`${selectedUser?.email}`}</p>
)}
{selectedUser && selectedQuery === 2 && (
<p>
user address : {selectedUser?.address?.street}
{selectedUser?.address?.city}
</p>
)}
</Grid>
</Grid>
</Box>
);
};
export default FormOne;
所以基本上,您需要映射道具才能得到 menuItems
渲染。
而且,为了显示用户数据,您必须像我在代码中所做的那样显示它。