React First Item in TextField Select 没有得到 Selected
React First Item in a TextField Select does not get Selected
我有 json 有效载荷作为键值对传递。我需要在充当下拉列表的 TextField select 中填充数据。如果下拉列表中有两个或更多项目,我可以 select 下拉列表中的第一个或第二个选项。但是,当下拉列表中只有一个项目时,即使我单击它也不会 selected。
这是我在下面的代码,我在使用功能组件时设置状态:
const [departments, setDepartments] = useState([]);
const [selected, setSelected] = useState();
下面是检查文本字段中的项目是否被单击的代码:
const handleChange = event => {
setSelected(event.currentTarget.id);
};
这也是我下面的代码,我使用从 API 接收到的数据设置了 TextField:
<TextField
fullWidth
label="Select Department"
margin="dense"
name="departments"
onChange={handleChange}
required
select
// eslint-disable-next-line react/jsx-sort-props
SelectProps={{ native: true }}
value={selected}
variant="outlined"
>
{departments.map(option => (
<option
key={option.id}
value={option.id}
>
{option.department}
</option>
))}
</TextField>
请帮我解决这个问题。所以我可以设置下拉列表中的第一个项目,即使它是下拉列表中的唯一项目。
你的代码有一些错误,就像你使用 event.currentTarget.id 但你应该使用 event.target.value。
但是,当下拉列表中只有一个项目时,单击它时不会调用 handleChange,因为 handleChange 是 onChange 事件。如果您只有一项,则无法更改项目,因为只有一项,因此不会触发 onChange 事件。相反,您可以添加另一个项目,例如 "Please select" 然后您可以 select 您的单个项目。请检查此示例:
import React, {useEffect, useState} from "react";
import TextField from "@material-ui/core/TextField";
function TextFieldDDL() {
const [selected, setSelected] = useState();
const departments=[
{id: -1, department: 'Please Select...'},
{id: 1, department: 'CSE'},
// {id: 2, department: 'BBA'},
// {id: 3, department: 'EEE'}
];
function handleChange(e){
console.log(e.target.value, 'e');
setSelected(e.target.value);
}
return (
<React.Fragment>
<TextField
fullWidth
label="Select Department"
margin="dense"
name="departments"
onChange={handleChange}
required
select
// eslint-disable-next-line react/jsx-sort-props
SelectProps={{native: true}}
value={selected}
variant="outlined"
>
{departments.map(option => (
<option
key={option.id}
value={option.id}
>
{option.department}
</option>
))}
</TextField>
</React.Fragment>
);
}
export default TextFieldDDL;
更新: 将项目添加到列表中
const departments = [{id: -1, department: 'Please Select...'}, ...response.data];
setDepartments(departments);
我有 json 有效载荷作为键值对传递。我需要在充当下拉列表的 TextField select 中填充数据。如果下拉列表中有两个或更多项目,我可以 select 下拉列表中的第一个或第二个选项。但是,当下拉列表中只有一个项目时,即使我单击它也不会 selected。
这是我在下面的代码,我在使用功能组件时设置状态:
const [departments, setDepartments] = useState([]);
const [selected, setSelected] = useState();
下面是检查文本字段中的项目是否被单击的代码:
const handleChange = event => {
setSelected(event.currentTarget.id);
};
这也是我下面的代码,我使用从 API 接收到的数据设置了 TextField:
<TextField
fullWidth
label="Select Department"
margin="dense"
name="departments"
onChange={handleChange}
required
select
// eslint-disable-next-line react/jsx-sort-props
SelectProps={{ native: true }}
value={selected}
variant="outlined"
>
{departments.map(option => (
<option
key={option.id}
value={option.id}
>
{option.department}
</option>
))}
</TextField>
请帮我解决这个问题。所以我可以设置下拉列表中的第一个项目,即使它是下拉列表中的唯一项目。
你的代码有一些错误,就像你使用 event.currentTarget.id 但你应该使用 event.target.value。
但是,当下拉列表中只有一个项目时,单击它时不会调用 handleChange,因为 handleChange 是 onChange 事件。如果您只有一项,则无法更改项目,因为只有一项,因此不会触发 onChange 事件。相反,您可以添加另一个项目,例如 "Please select" 然后您可以 select 您的单个项目。请检查此示例:
import React, {useEffect, useState} from "react";
import TextField from "@material-ui/core/TextField";
function TextFieldDDL() {
const [selected, setSelected] = useState();
const departments=[
{id: -1, department: 'Please Select...'},
{id: 1, department: 'CSE'},
// {id: 2, department: 'BBA'},
// {id: 3, department: 'EEE'}
];
function handleChange(e){
console.log(e.target.value, 'e');
setSelected(e.target.value);
}
return (
<React.Fragment>
<TextField
fullWidth
label="Select Department"
margin="dense"
name="departments"
onChange={handleChange}
required
select
// eslint-disable-next-line react/jsx-sort-props
SelectProps={{native: true}}
value={selected}
variant="outlined"
>
{departments.map(option => (
<option
key={option.id}
value={option.id}
>
{option.department}
</option>
))}
</TextField>
</React.Fragment>
);
}
export default TextFieldDDL;
更新: 将项目添加到列表中
const departments = [{id: -1, department: 'Please Select...'}, ...response.data];
setDepartments(departments);