reactjs - 根据货币选择获取货币汇率
问题描述
当我们在文本框中输入一些值并在下拉字段中输入货币并在fromCurrency
下拉字段中选择适当的货币时toCurrency
,我们如何toCurrency
根据该选择显示汇率?
https://codesandbox.io/s/rough-http-jc35u?file=/src/App.js
import React, { useState, useEffect } from "react";
import "./styles.css";
const axios = require("axios");
function App() {
const [sourceCurrency, setSourceCurrency] = useState("");
const [targetCurrency, setTargetCurrency] = useState("");
const [ratesList, setRatesList] = useState([]);
const [selectFromCurrency, setFromSourceCurrency] = useState("");
const [selectToCurrency, setSelectToCurrency] = useState("");
const getSourceCurrency = (source) => {
setSourceCurrency(source);
};
const getTargetCurrency = (target) => {
setTargetCurrency(target);
};
useEffect(() => {
const fetchData = async () => {
try {
const data = await axios.get("https://api.exchangeratesapi.io/latest");
setRatesList(data);
console.log(data);
} catch (e) {
console.log(e);
}
};
fetchData();
}, []);
const selectSourceCurrency = (sourceCurr) => {
setFromSourceCurrency(sourceCurr);
};
const selectTargetCurrency = (targetCurr) => {
setSelectToCurrency(targetCurr);
};
const convertRate = () => {
const rateCalc = sourceCurrency * targetCurrency;
console.log("print rate: " + rateCalc);
// how can we the rates list here and based on the selection ?
};
return (
<div className="App">
<div className="globalCurrencyConverter">
<h2>Currency Converter</h2>
<div className="container box">
<label>
<input
name="sourceCurrency"
type="text"
placeholder="fromCurrency"
onChange={(event) => getSourceCurrency(event.target.value)}
/>
<select
className="fromCurrency"
defaultValue={"DEFAULT"}
onChange={(event) => selectSourceCurrency(event.target.value)}
>
<option>USD</option>
<option value="DEFAULT">AUD</option>
<option>NZD</option>
<option>INR</option>
<option>UAE Dirham</option>
</select>
</label>
<label>
<input
name="targetCurrency"
type="text"
placeholder="toCurrency"
onChange={(event) => getTargetCurrency(event.target.value)}
/>
<select
className="toCurrency"
onChange={(event) => selectTargetCurrency(event.target.value)}
>
<option>USD</option>
<option>AUD</option>
<option>NZD</option>
<option>INR</option>
<option>UAE Dirham</option>
</select>
</label>
<div className="recordBtn">
<button name="convert" onClick={(event) => convertRate()}>
Convert
</button>
</div>
</div>
</div>
</div>
);
}
export default App;
解决方案
我将假设您可以自己处理带有货币的这些选定字段的数量,而是向您展示如何解决实际的转换问题。因此,我们将保留这些选择选项硬编码,就像它们在您的代码中一样。例如(美元、新西兰元、澳元等)
因此,我们实际上甚至不需要该 useEffect 进行此测试,因为我们只是对货币进行硬编码。就个人而言,我喜欢用尽可能少的重新渲染来解决我的 React 问题。所以我解决这个特定问题的方法是创建对所有 4 个字段的引用。它将允许我们随时访问它们的值。退房useRef()
。
然后,当有人输入所有信息并单击“转换”按钮时,我会调用您的 API 并将所选货币作为基础货币传递给它。像这样
https://api.exchangeratesapi.io/latest?base=USD
一旦 axios 获取它上面的数据,它只是一些基本匹配和为“To Currency”字段分配适当值的问题。因此,这是一个带有Sandbox的工作示例:
import React, { useState, useEffect, useRef } from "react";
import "./styles.css";
const axios = require("axios");
function App() {
const from_select = useRef(),
to_select = useRef(),
from_input = useRef(),
to_input = useRef();
useEffect(() => {
const fetchData = async () => {
try {
const data = await axios.get("https://api.exchangeratesapi.io/latest");
//setRatesList(data);
console.log(data);
} catch (e) {
console.log(e);
}
};
fetchData();
}, []);
const convertRate = () => {
const from_cur = from_select.current.value;
const to_cur = to_select.current.value;
const from_amount = from_input.current.value;
console.log(from_cur);
axios
.get("https://api.exchangeratesapi.io/latest?base=" + from_cur)
.then((result) => {
const rate = result.data.rates[to_cur];
const converted_amount = rate * from_amount;
to_input.current.value = converted_amount;
});
};
return (
<div className="App">
<div className="globalCurrencyConverter">
<h2>Currency Converter</h2>
<div className="container box">
<label>
<input
ref={from_input}
name="sourceCurrency"
type="text"
placeholder="fromCurrency"
/>
<select
ref={from_select}
className="fromCurrency"
defaultValue={"USD"}
>
<option value="USD">USD</option>
<option value="AUD">AUD</option>
<option value="NZD">NZD</option>
</select>
</label>
{" -> "}
<label>
<input
ref={to_input}
name="targetCurrency"
type="text"
placeholder="toCurrency"
/>
<select ref={to_select} className="toCurrency" defaultValue="AUD">
<option value="USD">USD</option>
<option value="AUD">AUD</option>
<option value="NZD">NZD</option>
<option value="RUB">RUB</option>
<option value="EUR">EUR</option>
</select>
</label>
<div className="recordBtn">
<button name="convert" onClick={convertRate}>
Convert
</button>
</div>
</div>
</div>
</div>
);
}
export default App;
推荐阅读
- powershell - 如何使用 PowerShell 自动登录 Chrome。我有一个使用 IE 运行但需要使用 Chrome 的脚本
- java - 错误 [org.hibernate.util.JDBCExceptionReporter] -
我是 docker 新手,运行 docker-compose 文件时出现此错误:错误 [org.hibernate.util.JDBCExceptionReporter] - <Communications link f
- c# - PostgresException:23503:更新或删除表违反外键约束
- bash - 将文本文件的行作为参数传递给脚本输入?
- c# - 在 C# 上尝试通过 powershell 安装打印机时遇到问题
- sql - 对于具有相同 A、B、C 值的行,如何在给定时间范围内仅选择“最早”行(由 D 列指定)?
- c# - 单元测试 Smtpclient 模拟发送方法
- c# - 数据源是 VB.net 中的无效类型
- php - 在 Laravel 中选择未进入控制器 $request 的数据
- amazon-s3 - 可以设置一个 minio 存储桶,以便存储的对象是不可变的和非版本化的吗?