【发布时间】:2020-09-10 18:09:17
【问题描述】:
我想过滤数据并在搜索栏中实现。在 Hook/index.js 组件中,我在 useEffects 中获取和过滤数据。然后我在 App.js 中传递道具。之后我有一个 Searchbar 组件,我在其中收听输入,并且它必须在这里工作。我得到未定义。
Hook/index.js 组件
import React, { useState, useEffect } from "react";
import "./hook.scss";
export default () => {
const [data, setData] = useState([]);
const [error, setError] = useState(null);
const [search, setSearch] = useState("");
const fetchData = () => {
fetch("https://restcountries.eu/rest/v2/all")
.then((res) => res.json())
.then((result) => setData(result))
.catch((err) => console.log("error"));
};
useEffect(() => {
const searchResult =
data && data.filter((item) => item.name.toLowerCase().includes(search));
setSearch(searchResult);
}, []);
useEffect(() => {
fetchData();
}, []);
return [data, error];
};
App.js
import React, { useState }from "react";
import Header from "./components/Header";
import SearchBar from "./components/SearchBar";
import Flag from "./components/Flag";
import useCountries from "./Hooks";
import CountryList from "./components/CountryList";
import "./App.scss";
export default function App() {
const [data, error] = useCountries();
return (
<div className="App">
<SearchBar /> // {/*this throws an error <SearchBar data={data}/> */}
<Header />
{data &&
data.map((country) => (
<div className="CountryList" key={country.name}>
<Flag flag={country.flag} />
<CountryList
population={country.population}
name={country.name}
region={country.region}
/>
{country.languages.map((language, languageIndex) => (
<CountryList key={languageIndex} language={language.name} />
))}
</div>
))}
<useCountries />
</div>
);
return [data, error]
}
搜索栏组件
import React, {useState} from "react";
import "./SearchBar.scss";
export default function SearchBar({data}) {
const [search, setSearch] = useState("");
function handleChange(e) {
setSearch(e.target.value);
}
return (
<div className="SearchBar">
<input
className="input"
type="text"
placeholder="search country ..."
value={data}
onChange={handleChange}
/>
{data && data.filter((item) => item.name.toLowerCase().includes(search))}
</div>
);
};
【问题讨论】:
-
{/*this throws an error
*/} 你得到的错误是什么 -
嘿@sgrmhdk 这里是错误:对象作为 React 子项无效(找到:对象与键 {name、topLevelDomain、alpha2Code、alpha3Code、callingCodes、capital、altSpellings、region、subregion、population , latlng, demoym, area, gini, timezones, 边界, nativeName, numericCode, 货币, 语言, 翻译, flag, regionBlocs, cioc})。如果您打算渲染一组子项,请改用数组。
-
能不能把console.log(data)放到App.js里。只是为了确定是否填充了数据并查看对象的结构
-
嘿 @sgrmhdk 如果我删除 data={data} 和 console.log(data) 给我控制台中的对象数组。
标签: javascript reactjs