英文:
How to filter data after data is fetched in React?
问题
// 如果语句没有起作用
import { useState, useEffect } from 'react';
const Fetch = () => {
const [data, setData] = useState();
const [currency, setCurrency] = useState('crypto');
const [isLoaded, setIsLoaded] = useState(false);
useEffect(() => {
fetch('https://api.coingecko.com/api/v3/exchange_rates')
.then((res) => { return res.json() })
.then((res) => { setData(res.rates); setIsLoaded(true); console.log(res); })
}, [])
if (!isLoaded) {
return <h2>等待数据...</h2>
} else {
return (
<div>
<label htmlFor="currency">选择货币: </label>
<select id='currency' onChange={(e) => setCurrency(e.target.value)}>
<option value="all">所有</option>
<option value="crypto">加密货币</option>
<option value="fiat">法定货币</option>
<option value="commodity">大宗商品</option>
</select>
{Object.values(data).map((item, i) => {
return (
<div key={i}>
<h3>{item.name}({item.unit}) :<span style={{ color: "red" }}>{item.value}</span></h3>
<p>类型: {item.type} </p>
<hr />
</div>
)
})}
</div>
)
}
}
export default Fetch;
英文:
I'm new in React. I'm try to filter data after this data will received.
I have select tag with options and I want to change data array after select will changed.
For example if selected option will have value 'crypto' show array only with type 'crypto'
Thanks for answer
import { useState, useEffect } from 'react'
const Fetch = () => {
const [data, setData] = useState();
const [currency, setCurrency] = useState('crypto');
const [isLoaded, setIsLoaded] = useState(false);
useEffect(() => {
fetch('https://api.coingecko.com/api/v3/exchange_rates')
.then((res) => { return res.json() })
.then((res) => { setData(res.rates); setIsLoaded(true); console.log(res); })
}, [])
if (!isLoaded) {
return <h2>Waiting for data...</h2>
} else {
return (
<div>
<label htmlFor="currency">Choose currency: </label>
<select id='currency' onChange={setCurrency}>
<option value="all">All</option>
<option value="crypto">Crypto</option>
<option value="fiat">Fiat</option>
<option value="commodity">Commodity</option>
</select>
{Object.values(data).map((item, i) => {
return (
<div key={i}>
<h3>{item.name}({item.unit}) : <span style={{ color: "red" }}>{item.value}</span></h3>
<p>type: {item.type} </p>
<hr />
</div>
)
})}
</div>
)
}
}
export default Fetch;
If statement not working
答案1
得分: 0
要在JavaScript中过滤数据,您可以使用filter
函数:
Object.values(data)
.filter(item => item?.type === currency)
.map(...)
传递一个您选择的函数,该函数对数组中的每个值返回true
或false
。
如果您想要更多细节,可以在文档中找到。
英文:
To filter data in JavaScript, you may use the filter
function:
Object.values(data)
.filter(item => item?.type === currency)
.map(...)
Pass a function of your choice that returns either true
or false
for each value in the array.
If you want more details, you can find them in the docs.
答案2
得分: 0
首先,你需要修复你的 onChange
处理程序,它应该返回一个 React ChangeEvent。目前你把状态设置为了事件本身,而不是选定的值。为此,你还需要添加一个 value
属性,将选择元素变为一个 受控输入。
<select
id="currency"
onChange={() => setCurrency(e.target.value)}
value={currency}
>
...
</select>
对于筛选,你可以使用 filter
。
{
Object.values(data)
.filter((item) => item.type === currency)
.map((item, i) => {
return (
<div key={i}>
<h3>
{item.name}({item.unit}) :{" "}
<span style={{ color: "red" }}>{item.value}</span>
</h3>
<p>type: {item.type} </p>
<hr />
</div>
);
});
}
英文:
First you need to fix your onChange
handler this returns a React ChangeEvent. Currently you're setting the state to the event instead of the selected value. For this you'll also need to add a value
prop to make the select element a controlled input.
<select
id="currency"
onChange={() => setCurrency(e.target.value)}
value={currency}
>
...
</select>
For the filtering you can use filter
.
{
Object.values(data)
.filter((item) => item.type === currency)
.map((item, i) => {
return (
<div key={i}>
<h3>
{item.name}({item.unit}) :{" "}
<span style={{ color: "red" }}>{item.value}</span>
</h3>
<p>type: {item.type} </p>
<hr />
</div>
);
});
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论