带有选项的 Reactjs 动态 optgroup
Reactjs dynamic optgroup with options
我试图映射一个数组并创建一个 select 与 optgroups 然后它的选择。但是下面的代码只会输出 optgroup;
<select name="clients">
{this.props.clients &&
this.props.clients.length > 0 &&
this.props.clients.map((e, key) => {
return (
<optgroup key={key} label={e.name}>
{e.projects.map((project, projectKey) => {
<option key={projectKey} value={project.id}>
{project.name}
</option>;
})}
</optgroup>
);
})}
</select>
关于如何获得选项输出的任何想法?
您的内部 map()
函数没有返回任何对象。在 <option>
元素之前添加 return
。
<select name="clients">
{this.props.clients && this.props.clients.length > 0 && this.props.clients.map((e, key) => {
return <optgroup key={key} label={e.name}>
{e.projects.map((project,projectKey) => {
return <option key={projectKey} value={project.id}>{project.name}</option>
})}
</optgroup>;
})}
</select>
好的,看看吧。我的 React 项目中有以下两个文件。例如,第一个已经包含一些虚拟状态数据,调用我的端点并填充我的状态,并创建我的 Dropdown 组件的实例。
在我的抓取中,我也有一些动态创建类别组的逻辑,用于我的 optgroup 定义。也是一项检查,以确保我没有两次包含任何职业,即 profession_id #2.
state = {
users: [{user_id: 0, user_name:"John", profession_id: 1, profession:"Developer"},
{user_id: 1, user_name:"Bob", profession_id: 2, profession:"Janitor"},
{user_id: 2, user_name:"Tony", profession_id: 2, profession:"Janitor"},
{user_id: 3, user_name:"Steve", profession_id: 3, profession:"Electrician"}
],
categories: [{prof_id: 1, prof_name:"Developer"},
{prof_id: 2, prof_name:"Janitor"},
{prof_id: 3, prof_name:"Electrician"}
]
}
componentDidMount(){
this.fetchUsers();
}
fetchUsers = () => {
fetch('http://localhost:9999/users')
.then(response => response.json())
.then(json => {
json.forEach(user => {
this.setState({ users: [...this.state.users, user] });
if (!this.state.categories.some(
category => category.prof_id == user.profession_id)) {
let optionGroupData = {
prof_id: user.profession_id,
prof_name: user.profession_name
}
this.setState({
categories: [...this.state.categories, optionGroupData]
});
}
});
})
.catch(error => console.error(error));
}
render(){
return(
<Dropdown options={this.state.users} optionGroups={this.state.categories}/>
)
}
Dropdown.js
这是下拉组件的无状态定义。所有数据都通过 Dropdown 属性从第一个文件传递。
我在里面创建了我的 select 标签,在其中我首先遍历我的类别数组以呈现 optgroup。对于第一个循环,它呈现 optgroup,然后遍历我的用户。如果用户的职业 ID 与 optgroup id 匹配,我会使用我想在下拉列表中显示的数据来呈现该选项。
render(){
return(
<select>
this.props.optionGroups.map(optionGroup => {
return (
<optgroup key={optionGroup.prof_id} label={optionGroup.prof_name}>
{this.props.options.map(option => {
if(option.profession_id == optionGroup.prof_id){
return(
<option key={option.profession_id} value={option.id}>
{option.user_name}
</option>
)
}
})}
</optgroup>
)
}
</select>
)
}
我试图映射一个数组并创建一个 select 与 optgroups 然后它的选择。但是下面的代码只会输出 optgroup;
<select name="clients">
{this.props.clients &&
this.props.clients.length > 0 &&
this.props.clients.map((e, key) => {
return (
<optgroup key={key} label={e.name}>
{e.projects.map((project, projectKey) => {
<option key={projectKey} value={project.id}>
{project.name}
</option>;
})}
</optgroup>
);
})}
</select>
关于如何获得选项输出的任何想法?
您的内部 map()
函数没有返回任何对象。在 <option>
元素之前添加 return
。
<select name="clients">
{this.props.clients && this.props.clients.length > 0 && this.props.clients.map((e, key) => {
return <optgroup key={key} label={e.name}>
{e.projects.map((project,projectKey) => {
return <option key={projectKey} value={project.id}>{project.name}</option>
})}
</optgroup>;
})}
</select>
好的,看看吧。我的 React 项目中有以下两个文件。例如,第一个已经包含一些虚拟状态数据,调用我的端点并填充我的状态,并创建我的 Dropdown 组件的实例。
在我的抓取中,我也有一些动态创建类别组的逻辑,用于我的 optgroup 定义。也是一项检查,以确保我没有两次包含任何职业,即 profession_id #2.
state = {
users: [{user_id: 0, user_name:"John", profession_id: 1, profession:"Developer"},
{user_id: 1, user_name:"Bob", profession_id: 2, profession:"Janitor"},
{user_id: 2, user_name:"Tony", profession_id: 2, profession:"Janitor"},
{user_id: 3, user_name:"Steve", profession_id: 3, profession:"Electrician"}
],
categories: [{prof_id: 1, prof_name:"Developer"},
{prof_id: 2, prof_name:"Janitor"},
{prof_id: 3, prof_name:"Electrician"}
]
}
componentDidMount(){
this.fetchUsers();
}
fetchUsers = () => {
fetch('http://localhost:9999/users')
.then(response => response.json())
.then(json => {
json.forEach(user => {
this.setState({ users: [...this.state.users, user] });
if (!this.state.categories.some(
category => category.prof_id == user.profession_id)) {
let optionGroupData = {
prof_id: user.profession_id,
prof_name: user.profession_name
}
this.setState({
categories: [...this.state.categories, optionGroupData]
});
}
});
})
.catch(error => console.error(error));
}
render(){
return(
<Dropdown options={this.state.users} optionGroups={this.state.categories}/>
)
}
Dropdown.js 这是下拉组件的无状态定义。所有数据都通过 Dropdown 属性从第一个文件传递。
我在里面创建了我的 select 标签,在其中我首先遍历我的类别数组以呈现 optgroup。对于第一个循环,它呈现 optgroup,然后遍历我的用户。如果用户的职业 ID 与 optgroup id 匹配,我会使用我想在下拉列表中显示的数据来呈现该选项。
render(){
return(
<select>
this.props.optionGroups.map(optionGroup => {
return (
<optgroup key={optionGroup.prof_id} label={optionGroup.prof_name}>
{this.props.options.map(option => {
if(option.profession_id == optionGroup.prof_id){
return(
<option key={option.profession_id} value={option.id}>
{option.user_name}
</option>
)
}
})}
</optgroup>
)
}
</select>
)
}