-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[채이] 4-ExchangeRate #20
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
## Exchange Rate | ||
|
||
Select countries to get the exchange rate for a specific amount | ||
|
||
## Project Specifications | ||
|
||
- Display UI with 2 select lists for countries and 2 inputs for amounts | ||
- Fetch exchange rates from API (https://api.exchangerate-api.com) | ||
- Display the values for both countries | ||
- Update values on amount change | ||
- Swap country rates | ||
|
||
## Functions | ||
|
||
- changeAmountOne, changeCurrencyOne, changeCurrencyTwo : 바뀐 값을 해당 전역 변수에 담는 역할 | ||
- handleSwap : 두 통화 값을 서로 바꾸는 역할 | ||
- setResultValue : 환율을 업데이트하는 역할 | ||
|
||
## Memo | ||
|
||
처음에 코드를 짤 때는 select, input 값이 바뀔 때마다 setResultValue 함수를 호출해서 이 함수 안에서 모든 변수를 다시 받아와 환율을 나타내게 했는데 이렇게 하니 바뀐 값만 새로 가져오는 것이 아니라 바뀌지 않은 값도 매번 가져오게 되니 효율적이지 않다고 생각해서 코드를 고침. | ||
각 값을 담을 전역 변수를 선언해서 값이 바뀌면 전역 변수에 값을 할당하고 setResultValue 함수에 인자를 넘겨줘서 환율을 나타내게 함. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,142 @@ | ||
<!DOCTYPE html> | ||
<html lang="en"> | ||
<head> | ||
<meta charset="UTF-8" /> | ||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> | ||
<meta http-equiv="X-UA-Compatible" content="ie=edge" /> | ||
<title>Exchange Rate Calculator</title> | ||
<link rel="stylesheet" href="style.css" /> | ||
</head> | ||
<body> | ||
<img src="img/money.png" alt="" class="money-img" /> | ||
<h1>Exchange Rate Calculator</h1> | ||
<p>Choose the currency and the amounts to get the exchange rate</p> | ||
|
||
<div class="container"> | ||
<div class="currency"> | ||
<select id="currency-one"> | ||
<option value="AED">AED</option> | ||
<option value="ARS">ARS</option> | ||
<option value="AUD">AUD</option> | ||
<option value="BGN">BGN</option> | ||
<option value="BRL">BRL</option> | ||
<option value="BSD">BSD</option> | ||
<option value="CAD">CAD</option> | ||
<option value="CHF">CHF</option> | ||
<option value="CLP">CLP</option> | ||
<option value="CNY">CNY</option> | ||
<option value="COP">COP</option> | ||
<option value="CZK">CZK</option> | ||
<option value="DKK">DKK</option> | ||
<option value="DOP">DOP</option> | ||
<option value="EGP">EGP</option> | ||
<option value="EUR">EUR</option> | ||
<option value="FJD">FJD</option> | ||
<option value="GBP">GBP</option> | ||
<option value="GTQ">GTQ</option> | ||
<option value="HKD">HKD</option> | ||
<option value="HRK">HRK</option> | ||
<option value="HUF">HUF</option> | ||
<option value="IDR">IDR</option> | ||
<option value="ILS">ILS</option> | ||
<option value="INR">INR</option> | ||
<option value="ISK">ISK</option> | ||
<option value="JPY">JPY</option> | ||
<option value="KRW">KRW</option> | ||
<option value="KZT">KZT</option> | ||
<option value="MXN">MXN</option> | ||
<option value="MYR">MYR</option> | ||
<option value="NOK">NOK</option> | ||
<option value="NZD">NZD</option> | ||
<option value="PAB">PAB</option> | ||
<option value="PEN">PEN</option> | ||
<option value="PHP">PHP</option> | ||
<option value="PKR">PKR</option> | ||
<option value="PLN">PLN</option> | ||
<option value="PYG">PYG</option> | ||
<option value="RON">RON</option> | ||
<option value="RUB">RUB</option> | ||
<option value="SAR">SAR</option> | ||
<option value="SEK">SEK</option> | ||
<option value="SGD">SGD</option> | ||
<option value="THB">THB</option> | ||
<option value="TRY">TRY</option> | ||
<option value="TWD">TWD</option> | ||
<option value="UAH">UAH</option> | ||
<option value="USD" selected>USD</option> | ||
<option value="UYU">UYU</option> | ||
<option value="VND">VND</option> | ||
<option value="ZAR">ZAR</option> | ||
</select> | ||
<input type="number" id="amount-one" placeholder="0" value="1" /> | ||
</div> | ||
|
||
<div class="swap-rate-container"> | ||
<button class="btn" id="swap"> | ||
Swap | ||
</button> | ||
<div class="rate" id="rate"></div> | ||
</div> | ||
|
||
<div class="currency"> | ||
<select id="currency-two"> | ||
<option value="AED">AED</option> | ||
<option value="ARS">ARS</option> | ||
<option value="AUD">AUD</option> | ||
<option value="BGN">BGN</option> | ||
<option value="BRL">BRL</option> | ||
<option value="BSD">BSD</option> | ||
<option value="CAD">CAD</option> | ||
<option value="CHF">CHF</option> | ||
<option value="CLP">CLP</option> | ||
<option value="CNY">CNY</option> | ||
<option value="COP">COP</option> | ||
<option value="CZK">CZK</option> | ||
<option value="DKK">DKK</option> | ||
<option value="DOP">DOP</option> | ||
<option value="EGP">EGP</option> | ||
<option value="EUR" selected>EUR</option> | ||
<option value="FJD">FJD</option> | ||
<option value="GBP">GBP</option> | ||
<option value="GTQ">GTQ</option> | ||
<option value="HKD">HKD</option> | ||
<option value="HRK">HRK</option> | ||
<option value="HUF">HUF</option> | ||
<option value="IDR">IDR</option> | ||
<option value="ILS">ILS</option> | ||
<option value="INR">INR</option> | ||
<option value="ISK">ISK</option> | ||
<option value="JPY">JPY</option> | ||
<option value="KRW">KRW</option> | ||
<option value="KZT">KZT</option> | ||
<option value="MXN">MXN</option> | ||
<option value="MYR">MYR</option> | ||
<option value="NOK">NOK</option> | ||
<option value="NZD">NZD</option> | ||
<option value="PAB">PAB</option> | ||
<option value="PEN">PEN</option> | ||
<option value="PHP">PHP</option> | ||
<option value="PKR">PKR</option> | ||
<option value="PLN">PLN</option> | ||
<option value="PYG">PYG</option> | ||
<option value="RON">RON</option> | ||
<option value="RUB">RUB</option> | ||
<option value="SAR">SAR</option> | ||
<option value="SEK">SEK</option> | ||
<option value="SGD">SGD</option> | ||
<option value="THB">THB</option> | ||
<option value="TRY">TRY</option> | ||
<option value="TWD">TWD</option> | ||
<option value="UAH">UAH</option> | ||
<option value="USD">USD</option> | ||
<option value="UYU">UYU</option> | ||
<option value="VND">VND</option> | ||
<option value="ZAR">ZAR</option> | ||
</select> | ||
<input type="number" id="amount-two" placeholder="0" /> | ||
</div> | ||
</div> | ||
|
||
<script src="script.js"></script> | ||
</body> | ||
</html> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
const $currencyOne = document.querySelector("#currency-one"); | ||
const $currencyTwo = document.querySelector("#currency-two"); | ||
const $amountOne = document.querySelector("#amount-one"); | ||
const $amountTwo = document.querySelector("#amount-two"); | ||
const $swap = document.querySelector("#swap"); | ||
const $rate = document.querySelector("#rate"); | ||
|
||
$amountOne.addEventListener("change", changeAmountOne); | ||
$currencyOne.addEventListener("change", changeCurrencyOne); | ||
$currencyTwo.addEventListener("change", changeCurrencyTwo); | ||
$swap.addEventListener("click", handleSwap); | ||
|
||
let amountOneValue = $amountOne.value; | ||
let currencyOneValue = $currencyOne.options[$currencyOne.selectedIndex].value; | ||
let currencyTwoValue = $currencyTwo.options[$currencyTwo.selectedIndex].value; | ||
|
||
function changeAmountOne() { | ||
amountOneValue = $amountOne.value; | ||
setResultValue(currencyOneValue, currencyTwoValue); | ||
} | ||
function changeCurrencyOne() { | ||
currencyOneValue = $currencyOne.value; | ||
setResultValue(currencyOneValue, currencyTwoValue); | ||
} | ||
function changeCurrencyTwo() { | ||
currencyTwoValue = $currencyTwo.value; | ||
setResultValue(currencyOneValue, currencyTwoValue); | ||
} | ||
function handleSwap() { | ||
const temp = currencyOneValue; | ||
$currencyOne.value = currencyTwoValue; | ||
$currencyTwo.value = currencyOneValue; | ||
currencyOneValue = currencyTwoValue; | ||
currencyTwoValue = temp; | ||
setResultValue(currencyOneValue, currencyTwoValue); | ||
} | ||
function setResultValue(currencyOneValue, currencyTwoValue) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. callback도 있고, async await으로 할 수도 있을 거 같아요 |
||
fetch(`https://api.exchangerate-api.com/v4/latest/${currencyOneValue}`) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 👍 👍 👍 배워감니다 |
||
.then((rest) => rest.json()) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. rest라고 작성 되어 있는데 res에 대한 오타인지 아니면 일부러 rest로 했는지 궁금해요 |
||
.then((data) => { | ||
$rate.textContent = `1 ${currencyOneValue} = ${data.rates[currencyTwoValue]} ${currencyTwoValue}`; | ||
$amountTwo.value = ( | ||
data.rates[currencyTwoValue] * amountOneValue | ||
).toFixed(2); | ||
}); | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
:root { | ||
--primary-color: #5fbaa7; | ||
} | ||
|
||
* { | ||
box-sizing: border-box; | ||
} | ||
|
||
body { | ||
background-color: #f4f4f4; | ||
font-family: Arial, Helvetica, sans-serif; | ||
display: flex; | ||
flex-direction: column; | ||
align-items: center; | ||
justify-content: center; | ||
height: 100vh; | ||
margin: 0; | ||
padding: 20px; | ||
} | ||
|
||
h1 { | ||
color: var(--primary-color); | ||
} | ||
|
||
p { | ||
text-align: center; | ||
} | ||
|
||
.btn { | ||
color: #fff; | ||
background: var(--primary-color); | ||
cursor: pointer; | ||
border-radius: 5px; | ||
font-size: 12px; | ||
padding: 5px 12px; | ||
} | ||
|
||
.money-img { | ||
width: 150px; | ||
} | ||
|
||
.currency { | ||
padding: 40px 0; | ||
display: flex; | ||
align-items: center; | ||
justify-content: space-between; | ||
} | ||
|
||
.currency select { | ||
padding: 10px 20px 10px 10px; | ||
-moz-appearance: none; | ||
-webkit-appearance: none; | ||
appearance: none; | ||
border: 1px solid #dedede; | ||
font-size: 16px; | ||
/* You may not need these following lines. The arrow did not show for me on MacOS/Chrome so I added it. Just remove it if you would like */ | ||
background: transparent; | ||
background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%20000002%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E'); | ||
background-position: right 10px top 50%, 0, 0; | ||
background-size: 12px auto, 100%; | ||
background-repeat: no-repeat; | ||
} | ||
|
||
.currency input { | ||
border: 0; | ||
background: transparent; | ||
font-size: 30px; | ||
text-align: right; | ||
} | ||
|
||
.swap-rate-container { | ||
display: flex; | ||
align-items: center; | ||
justify-content: space-between; | ||
} | ||
|
||
.rate { | ||
color: var(--primary-color); | ||
font-size: 14px; | ||
padding: 0 10px; | ||
} | ||
|
||
select:focus, | ||
input:focus, | ||
button:focus { | ||
outline: 0; | ||
} | ||
|
||
@media (max-width: 600px) { | ||
.currency input { | ||
width: 200px; | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이벤트 리스너를 개인적으로 선언된 함수 아래에 적는게 나을 것 같다고 생각해요!
함수 선언식으로 작성해서 함수들이 호이스팅 되어서 사용 가능한 부분이라서 지금처럼 작성하면 상관 없지만
그래도 함수 선언부 아래에서 호출하는게 나을 것 같다는 개인적인 생각입니다!
https://joshua1988.github.io/web-development/javascript/function-expressions-vs-declarations/