map函数不断重复输出
Map function keeps repeating the output
我正在制作一个从国家 Api 获取数据的小型 React 应用程序。我想在 React 中使用 Select 标签。这样我就可以在页面上过滤国家/地区的区域。因此,如果有人选择欧洲,它 returns 欧洲国家,或者非洲,然后是非洲国家,依此类推。我看过这个 post 来使用 . However, the issue I have is that the list keeps repeating itself.
下面是我目前的代码:
import React, { Component } from 'react';
import { CountryList } from './Components/Card-List/CountryList';
import { SearchBox } from './Components/Search-box/Search-Box';
import { NavBarCard }from './Components/NavBar/NavBarCard';
import './Countries.styles.css';
class Countries extends Component {
constructor() {
super();
this.state = {
countries:[],
searchField:"",
regionField:"",
darkMode: false
}
this.setDarkMode = this.setDarkMode.bind(this);
// this.handleRegion = this.handleRegion.bind(this);
};
componentDidMount() {
fetch("https://restcountries.eu/rest/v2/all")
.then(response => response.json())
.then(all => this.setState({ countries: all,
regions: all}))
}
setDarkMode(e){
this.setState((prevState) => ({ darkMode: !prevState.darkMode }));
}
handleRegion = (e) => {
this.setState({regionField: e.target.value})
}
render() {
const { countries, searchField, regionField, darkMode } = this.state;
const filterCountries = countries.filter((country) => country.name.toLowerCase().includes(searchField.toLowerCase()) &&
country.region.toLowerCase().includes(regionField.toLowerCase()));
return(
<div className={darkMode ? "dark-mode" : "light-mode" }>
<NavBarCard handlechange={this.setDarkMode} moonMode={darkMode ? "moon fas fa-moon" : "moon far fa-moon"} darkMode={darkMode ? "dark-mode" : "light-mode"}/>
<div className="Input">
< SearchBox type="search" placeholder="Search a Country" handlechange={e=> this.setState({
searchField: e.target.value })}
/>
{/* < SearchBox type="regions" placeholder="Filter by Regions" handlechange={e=> this.setState({
regionField: e.target.value })}
/> */}
<select onChange={this.handleRegion}>
{countries.map(region => (
<option key={region.alpha2Code}>
{region.region}
</option>
))}
</select>
</div>
<CountryList countries={filterCountries} />
</div>
)
}
}
export default Countries
不确定我错过了什么。任何帮助将不胜感激。
很明显,您的问题不在代码本身,而是您处理数据的方式。您正在映射国家/地区数组,因此对于每个国家/地区,其中都有一个区域字段。您在 select 标签中得到的是所有国家,但不是显示他们的名字,而是显示他们所属的区域。
您正在将国家/地区传递给此 <CountryList countries={filterCountries} />
。
我希望你没有循环渲染这个组件中的国家。
这个:
<select onChange={this.handleRegion}>
{countries.map(region => (
<option key={region.alpha2Code}>
{region.region}
</option>
))}
</select>
是正确的,但你需要添加值属性<select onChange {this.handleRegion} value={regionField}>
同时在 handleRegion
方法的构造函数中取消注释与 this
关键字的绑定。
已编辑
let regions = [];
fetch("https://restcountries.eu/rest/v2/all")
.then(response => response.json())
.then(all => {
// Get unique regions here using Set
let uniqueRegions = new Set();
all.forEach(item => {
uniqueRegions.add(item.region);
});
for (item of uniqueRegions) {
regions.push(item);
};
this.setState({
countries: all,
regions: regions
})
});
我正在制作一个从国家 Api 获取数据的小型 React 应用程序。我想在 React 中使用 Select 标签。这样我就可以在页面上过滤国家/地区的区域。因此,如果有人选择欧洲,它 returns 欧洲国家,或者非洲,然后是非洲国家,依此类推。我看过这个 post 来使用
下面是我目前的代码:
import React, { Component } from 'react';
import { CountryList } from './Components/Card-List/CountryList';
import { SearchBox } from './Components/Search-box/Search-Box';
import { NavBarCard }from './Components/NavBar/NavBarCard';
import './Countries.styles.css';
class Countries extends Component {
constructor() {
super();
this.state = {
countries:[],
searchField:"",
regionField:"",
darkMode: false
}
this.setDarkMode = this.setDarkMode.bind(this);
// this.handleRegion = this.handleRegion.bind(this);
};
componentDidMount() {
fetch("https://restcountries.eu/rest/v2/all")
.then(response => response.json())
.then(all => this.setState({ countries: all,
regions: all}))
}
setDarkMode(e){
this.setState((prevState) => ({ darkMode: !prevState.darkMode }));
}
handleRegion = (e) => {
this.setState({regionField: e.target.value})
}
render() {
const { countries, searchField, regionField, darkMode } = this.state;
const filterCountries = countries.filter((country) => country.name.toLowerCase().includes(searchField.toLowerCase()) &&
country.region.toLowerCase().includes(regionField.toLowerCase()));
return(
<div className={darkMode ? "dark-mode" : "light-mode" }>
<NavBarCard handlechange={this.setDarkMode} moonMode={darkMode ? "moon fas fa-moon" : "moon far fa-moon"} darkMode={darkMode ? "dark-mode" : "light-mode"}/>
<div className="Input">
< SearchBox type="search" placeholder="Search a Country" handlechange={e=> this.setState({
searchField: e.target.value })}
/>
{/* < SearchBox type="regions" placeholder="Filter by Regions" handlechange={e=> this.setState({
regionField: e.target.value })}
/> */}
<select onChange={this.handleRegion}>
{countries.map(region => (
<option key={region.alpha2Code}>
{region.region}
</option>
))}
</select>
</div>
<CountryList countries={filterCountries} />
</div>
)
}
}
export default Countries
不确定我错过了什么。任何帮助将不胜感激。
很明显,您的问题不在代码本身,而是您处理数据的方式。您正在映射国家/地区数组,因此对于每个国家/地区,其中都有一个区域字段。您在 select 标签中得到的是所有国家,但不是显示他们的名字,而是显示他们所属的区域。
您正在将国家/地区传递给此 <CountryList countries={filterCountries} />
。
我希望你没有循环渲染这个组件中的国家。
这个:
<select onChange={this.handleRegion}>
{countries.map(region => (
<option key={region.alpha2Code}>
{region.region}
</option>
))}
</select>
是正确的,但你需要添加值属性<select onChange {this.handleRegion} value={regionField}>
同时在 handleRegion
方法的构造函数中取消注释与 this
关键字的绑定。
已编辑
let regions = [];
fetch("https://restcountries.eu/rest/v2/all")
.then(response => response.json())
.then(all => {
// Get unique regions here using Set
let uniqueRegions = new Set();
all.forEach(item => {
uniqueRegions.add(item.region);
});
for (item of uniqueRegions) {
regions.push(item);
};
this.setState({
countries: all,
regions: regions
})
});