javascript - 如何从组件调用 API 数据
问题描述
我有一个应用程序搜索国家并在搜索结果仅包含一个国家或用户选择显示有关该国家的更多信息后显示有关该国家的更多信息。我想调用一个 API 来显示那个国家首都的天气。我想将它添加到我的组件中。我已经有一个针对国家/地区的 API 调用,如何在组件加载后让我的天气 API 调用从组件中运行?
const App = () => {
const [countries, setCountries] = useState([]);
const [searchName, setSearchName] = useState("");
const [capital, setCapital] = useState("");
const [weather, setWeather] = useState([]);
useEffect(() => {
axios
.get(`https://restcountries.eu/rest/v2/name/${searchName}`)
.then(response => {
console.log(`>> Response: ${JSON.stringify(response)}`);
setCountries(response.data);
});
}, [searchName]);
const handleSearch = event => {
setSearchName(event.target.value);
};
const Country = ({ capital, name, population, languages, flag }) => {
const [show, setShow] = useState(false);
return (
<div>
<p>
{name}{" "}
<button props={countries} onClick={() => setShow(!show)}>
{show ? "hide" : "show"}>
</button>
{show && ( // use show flag to conditionally render country info
<SingleCountry
name={name}
capital={capital}
population={population}
languages={languages}
flag={flag}
/>
)}
</p>
</div>
);
};
const SingleCountry = ({ name, capital, population, languages, flag }) =>
{
return (
<div>
<h3>{name}</h3>
<p>capital {capital}</p>
<p>population {population}</p>
<h2>languages</h2>
<ul>
{languages.map(el => (
<li>{el.name}</li>
))}
</ul>
<img src={flag} alt="OOPS" class="flag-image" />
{useEffect(() => {
axios
.get(
`https://api.weatherstack.com/current?
ebff312fa5277278461024b26999308a&${capital}`
)
.then(response => {
const apiResponse = response.data;
console.log(
`Current temparture in ${apiResponse.location.name} is
${apiResponse.current.temperature}℃`
);
})
.catch(error => {
console.log(error);
});
})}
</div>
);
};
const Countries = () => {
if (countries.length === 0) {
return <span class="results__label"> Search something </span>;
}
if (countries.length === 1) {
setCapital(countries.map(c => c.capital));
console.log(capital);
return countries.map(c => (
<SingleCountry
name={c.name}
capital={c.capital}
population={c.population}
languages={c.languages}
flag={c.flag}
/>
));
}
return (
<div>
<span class="results__label"> Search Results: </span>
<div>
{countries.map(c => (
<Country
name={c.name}
capital={c.capital}
population={c.population}
languages={c.languages}
flag={c.flag}
/>
))}
</div>
</div>
);
};
return (
<div>
<div style={{ margin: "8px" }}>
find countries <input onChange={handleSearch} />
</div>
<Countries />
<div />
</div>
);
};
解决方案
使用类组件而不是函数组件并在ComponentDidMount
生命周期方法中调用 api,并使用结果数据设置状态。
推荐阅读
- python - ValueError: bad marshal 不能通过删除 .pyc 文件来解决?
- javascript - Redux 和 ReactJS Hooks:UseEffect 返回一个空状态
- html - 由于绝对位置和 z 索引,链接无法正常工作
- ios - 当 clipToBounds 为 true 时,Swift UINavigationBar 背景图像不覆盖状态栏
- xslt - 换班
或者
使用 XSLT? - javascript - JavaScript 函数输出页面的 DOM 树
- javascript - PDF.js:使用 postMessage 将 base64 传递给 iframe 中的 viewer.html
- r - 如何通过匹配另一个数据集中的列来删除数据集中的行
- postgresql - 如何使用公用表表达式创建临时表
- java - java.net.BindException:无法在 LinkLocal 重新绑定上分配请求的地址(绑定失败)