React

[React] Coin Tracker - κ°’ μ–‘μˆ˜, 음수 색상 λ‹€λ₯΄κ²Œ λ‚˜νƒ€λ‚΄κΈ°

vividmin 2022. 5. 26. 01:14
320x100

 

κ΅¬ν˜„ν•˜κ²Œ 된 이유?

λ…Έλ§ˆλ“œμ½”λ” μ±Œλ¦°μ§€λ₯Ό λ„μ „ν•˜λ˜ 쀑에 μ£Όμ‹μ΄λ‚˜ 코인 μ•±μ—μ„œ 보이듯이 가격이 μ˜¬λΌκ°€λ©΄ λΉ¨κ°„μƒ‰μœΌλ‘œ λ‚΄λ €κ°€λ©΄ νŒŒλž€μƒ‰μœΌλ‘œ ν‘œμ‹œλ₯Ό 해보고 μ‹Άμ–΄μ‘Œλ‹€.
μ–΄λ–€ 방법을 μ“°λ©΄ 쒋을지 ꡬ글링을 해보닀가 μ μ ˆν•œ 방법이 μ—†μ–΄μ„œ κ³ λ―Όν•˜λ˜ 쀑 slack μ±„νŒ…λ°©μ— λ‚˜μ™€ λΉ„μŠ·ν•œ 고민을 ν•˜λ˜ μ‚¬λžŒμ΄ μ§ˆλ¬ΈκΈ€μ„ 올렸고, μ–΄λ–€ 뢄이 Math.sign을 ν™œμš©ν•˜λ©΄ 될 것 κ°™λ‹€λŠ” μ˜κ²¬μ„ μ£Όμ…”μ„œ λ°”λ‘œ μ μš©ν•΄λ³΄μ•˜λ‹€.
ν•˜μ§€λ§Œ μ–Έμ œλ‚˜ κ·Έλ ‡λ“― ν•œ λ²ˆμ— μ„±κ³΅ν•˜μ§„ λͺ»ν–ˆκ³ πŸ˜₯ μ–΄λ–€ μ‹€νŒ¨λ₯Ό ν–ˆμ—ˆλŠ”μ§€, κ²°κ΅­ μ–΄λ–»κ²Œ κ΅¬ν˜„ν–ˆλŠ”μ§€ 기둝해보렀고 ν•œλ‹€.

 

Math.sign( ) ❓
 μ£Όμ–΄μ§„ 수의 λΆ€ν˜Έ(+/-)λ₯Ό λ°˜ν™˜ν•΄μ£ΌλŠ” ν•¨μˆ˜. 단 μ œκ³΅ν•œ μˆ˜κ°€ 0이라면 +0/-0을 λ°˜ν™˜ν•œλ‹€.
  • 값이 μ–‘μˆ˜ : 1을 λ°˜ν™˜
  • 값이 음수 : -1을 λ°˜ν™˜
  • 값이 μ–‘μ˜ 0 : 0을 λ°˜ν™˜
  • 값이 음의 0 : -0을 λ°˜ν™˜
  • μ΄μ™Έμ˜ 경우 NaN을 λ°˜ν™˜

μ˜ˆμ‹œ μ½”λ“œ

console.log(Math.sign(3));	// 1
console.log(Math.sign(-5));	// -1
console.log(Math.sign(0));	// 0
console.log(Math.sign('-3')	// -1

πŸ‘‰πŸ» μœ„μ˜ μ˜ˆμ‹œμ²˜λŸΌ Math.sign(x) μ•ˆμ˜ xκ°€ μˆ«μžκ°€ μ•„λ‹ˆμ–΄λ„ μžλ™μœΌλ‘œ λ³€ν™˜λ˜μ–΄ λΆ€ν˜Έλ₯Ό νŒλ‹¨ν•΄μ€€λ‹€.

좜처 : mdnνŽ˜μ΄μ§€

 

μ‹€νŒ¨ κ³Όμ • πŸ˜–

μ²˜μŒμ—λŠ” λ‹΅λ³€μ—μ„œ λ³Έ λ°©λ²•μ²˜λŸΌ api둜 λ°›μ•„ 온 색상을 ꡬ뢄해야 ν•˜λŠ” 가격 값을 Math.sign으둜 감싸고 μ•žμ— !! μ—°μ‚°μžλ₯Ό ν†΅ν•΄μ„œ true, falseλ₯Ό λ‚˜λˆ„μ–΄ styled-component에 전달해주렀고 ν–ˆλ‹€.

!!(Math.sign(νŒλ‹¨ κ°’));

그런데 막상 ν•΄λ³΄λ‹ˆκΉŒ κ°’λ“€μ˜ 색이 μ „λΆ€ μ–‘μˆ˜μΌ λ•Œμ˜ 색상인 λΉ¨κ°„μƒ‰μœΌλ‘œλ§Œ λ‚˜μ™”λ‹€.😰


λ­”κ°€ μ΄μƒν•΄μ„œ 값을 μ½˜μ†”μ— μ°μ–΄λ³΄λ‹ˆ μƒμŠΉ 가격은 +1둜 νŒλ‹¨λ˜μ–΄ true둜 잘 λ‚˜μ˜€λŠ”λ°, ν•˜λ½ 가격은 -1둜 νŒλ‹¨λ˜μ§€λ§Œ -1 λ˜ν•œ trueμ΄λ―€λ‘œ true / false ꡬ뢄이 λ˜μ§€ μ•Šμ•˜λ‹€.
κ·ΈλŸ¬λ‹ˆ λ‹Ήμ—°ν•˜κ²Œλ„ μƒμŠΉ, ν•˜λ½ λͺ¨λ‘ λΉ¨κ°„μƒ‰μœΌλ‘œλ§Œ λ‚˜μ™”λ˜ 것이닀. 이 방법 말고 λ‹€λ₯Έ 방법을 써야 ν–ˆλ‹€.

두 λ²ˆμ§Έλ‘œλŠ” 음수일 κ²½μš°μ—λŠ” +1을 λ”ν•΄μ„œ 0을 λ§Œλ“  ν›„ false둜 λ°˜ν™˜ν•˜λ©΄ λ˜μ§€ μ•Šμ„κΉŒλΌκ³  μƒκ°ν•΄λ΄€λŠ”λ°, 일단 값이 음수인 경우λ₯Ό νŒλ‹¨ν•˜λŠ” 과정에닀가 λ‹€μ‹œ +1을 μΆ”κ°€ν•˜λŠ” 과정을 λ§Œλ“œλŠ” 것은 μ½”λ“œκ°€ λ„ˆλ¬΄ κΈΈμ–΄μ Έμ„œ νš¨μœ¨μ μ΄μ§€ λͺ»ν•˜λ‹€λŠ” νŒλ‹¨μ΄ λ“€μ—ˆλ‹€.

 

μ΅œμ’… 적용 방법 πŸ‘€

κ°’μ˜ 음수 μ–‘μˆ˜ μ—¬λΆ€λŠ” κ·ΈλŒ€λ‘œ Math.sign( )으둜 νŒλ³„ν•˜κ²Œ ν•˜κ³ , λŒ€μ‹  checkBooleanν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄ 각 숫자 값을 isPositiveλΌλŠ” 속성이 true or falseλ₯Ό λ°˜ν™˜ν•˜λ„λ‘ λ§Œλ“€μ—ˆλ‹€.
- 값이 1이면 κ·ΈλŒ€λ‘œ true
- 값이 1 μ΄μ™Έμ˜ κ°’ (-1, 0)이면 false

λ§ˆμ§€λ§‰μœΌλ‘œ styled-componentλ₯Ό ν†΅ν•΄μ„œ props의 값을 isPositive에 따라 λ‹€λ₯Έ μƒ‰μœΌλ‘œ λ‚˜νƒ€λ‚Ό 수 μžˆλ„λ‘ μ„€μ •ν•΄μ£Όμ—ˆλ‹€.

// styled component 적용
const PriceValue = styled.span<IItemProps>`
  color: ${(props) =>
    props.isPositive ? props.theme.upwardColor : props.theme.downwardColor};
`;

// checkBoolean ν•¨μˆ˜
function checkBoolean(value: number) {
  if (Math.sign(value) === 1) {
    return true;
  } 
  else {
    return false;
  }
}

// κ°’ νŒλ‹¨ν•˜κΈ°
<PriceValue
  isPositive={checkBoolean(BaseUrl.percent_change_30m)}
>
	{`${BaseUrl.percent_change_30m} %`}
</PriceValue>

이제 μ •μƒμ μœΌλ‘œ μ μš©λœλ‹€!!πŸ™Š
μ•„λ§ˆ 더 λ‚˜μ€ 방법이 μžˆμ„ μˆ˜λ„ μžˆμ§€λ§Œ, μ§€κΈˆ μ•Œκ³  μžˆλŠ” μ§€μ‹μœΌλ‘œλŠ” 이 방법이 μ΅œμ„ μΈ λ“―ν•˜λ‹€.
λ‚˜μ€‘μ— 더 λ‚˜μ€ 방법을 μ•Œκ²Œ λœλ‹€λ©΄ λ”°λ‘œ ν¬μŠ€νŒ…ν•΄μ•Όκ² λ‹€.

λ°˜μ‘ν˜•