目前我正在召唤Riot Games api并展示所有冠军。我已经按名称部分添加了一个过滤器,但我想添加一个下拉列表来按冠军类排序。在初始页面加载时,我希望每个冠军渲染(它当前都有),但是从下拉列表中选择一个类只显示拥有该类的冠军。我可以展示每个冠军班
{champion.table.tags}
并添加索引号或数字,这是我希望能够排序的。例如,如果{champion.table.tags[0}
或{champion.table.tags[1}
=“战斗机”。我想在下拉列表中选择“战斗机”时显示每个拥有“战斗机”标签的冠军
我很擅长做出反应,我已经在Rails中构建了同样的功能而没有任何问题,但我正在努力解决React的问题。
我当前的代码显示所有冠军并具有排序功能
import React, { Component } from 'react';
import { Link } from 'react-router';
import _ from 'lodash';
class Champions extends Component {
constructor(props) {
super(props);
this.state = {
champions: []
};
}
componentWillMount() {
fetch('http://localhost:3000/champ.json')
.then(response => response.json())
.then(champions => {
this.setState({ champions })
})
}
filter(e){
this.setState({ filter: e.target.value} )
}
render() {
let champions = this.state.champions;
console.log('champions: ', champions);
if(this.state.filter){
champions = champions.filter( champion =>
champion.table.name.toLowerCase()
.includes(this.state.filter.toLowerCase()))
}
if(this.state.handleChange){
tags = champions.handleChange( champion =>
champion.table.tags
.includes(this.state.handleChange()))
}
return (
<div>
<div>
<input type="text"
placeholder="search for a champ"
onChange={this.filter.bind(this)}
/>
</div>
<div className="Sort">
<select>
{champions.map((champion, i) =>
<option key={i}>{champion.table.tags[0]}
</option>)}
</select>
</div>
<ul className="champ-list">
{champions.map(champion => {
return <li key={champion.table.id} className="col-xs-3">
<div>
<Link to={`/${champion.table.id}`} >
<img src={`http://ddragon.leagueoflegends.com/cdn/7.5.2/img/champion/${champion.table.image.full}`} />
</Link>
</div>
<Link to={`/${champion.table.id}`} >
<h3>{champion.table.key}</h3>
<h4>{champion.table.title}</h4>
<h4>{champion.table.tags}</h4>
</Link>
</li>
})}
</ul>
</div>
);
}
}
export default Champions;
截至目前,下拉列表遍历每个冠军对象,并使用每个冠军的第一个类标记填充。我认为总共有7个课程,我可以手动创建,如果需要,但我怎么能显示所有的冠军,然后只显示基于下拉选择的冠军。
不确定这是否相关,但也让我在React中有点头疼。 JSON返回一个包含134个对象(冠军)的数组。每个对象内部都有几个键值对,以及更多具有键值对的数组。我试图排序的类标记位于这些嵌套数组之一。
非常感谢任何帮助,甚至是正确方向上的一点,
答案 0 :(得分:1)
我自己想出来了。这是更新的代码
import React, { Component } from 'react';
import { Link } from 'react-router';
import _ from 'lodash';
class Champions extends Component {
constructor(props) {
super(props);
this.state = {
champions: [],
};
}
componentWillMount() {
fetch('http://localhost:3000/champ.json')
.then(response => response.json())
.then(champions => {
this.setState({ champions })
// console.log('setState: ', this.state.champions);
})
}
filter(e){
this.setState({filter: e.target.value})
}
filterChamp(e){
this.setState({filterChamp: e.target.value})
}
render() {
let champions = this.state.champions;
// console.log(champions);
// console.log('props: ', this.props);
if(this.state.filter){
champions = champions.filter( champion =>
champion.table.name.toLowerCase()
.includes(this.state.filter.toLowerCase()))
}
if(this.state.filterChamp){
champions = champions.filter( champion =>
champion.table.tags
.includes(this.state.filterChamp))
}
return (
<div>
<select onChange={this.filterChamp.bind(this)} value={this.state.filterChamp}>
<option value="">All Champs</option>
<option value="Assassin">Assassin</option>
<option value="Fighter">Fighter</option>
<option value="Mage">Mage</option>
<option value="Marksman">Marksman</option>
<option value="Support">Support</option>
<option value="Tank">Tank</option>
</select>
<input type="text"
placeholder="search for a champ"
onChange={this.filter.bind(this)}
/>
<ul className="champ-list">
{champions.map(champion => {
return <li key={champion.table.id} className="col-xs-3">
<div>
<Link to={`/champ/${champion.table.name}`} >
<img src={`http://ddragon.leagueoflegends.com/cdn/7.5.2/img/champion/${champion.table.image.full}`} />
</Link>
</div>
<Link to={`/${champion.table.id}`} >
<h3>{champion.table.key}</h3>
<h4>{champion.table.title}</h4>
</Link>
</li>
})}
</ul>
</div>
);
}
}
export default Champions;