๐Ÿ’ป My Work/๐Ÿ”ฅ React 31

[React/JS] arrow function

arrow function ์— ๋Œ€ํ•œ ๊ธ€์„ ์ฒจ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. Arrow function expressions - JavaScript | MDN An arrow function expression is a compact alternative to a traditional function expression, with some semantic differences and deliberate limitations in usage: developer.mozilla.org ๐Ÿค” ๋ฌธ์ œ ์ƒํ™ฉ ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋‹ˆ ์ œ๋Œ€๋กœ ์ž‘๋™๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. const setIsActive = (open) => (event) => { setCategoryState(open); }; function onClickLeaf() { setI..

[React/JS] ํŽ˜์ด์ง€ URL ๋ณต์‚ฌํ•˜๊ธฐ - ํ…์ŠคํŠธ ๋ณต์‚ฌ Clipboard API

๊ธฐ์กด์— ํ…์ŠคํŠธ ๋ณต์‚ฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด document.execCommand("copy") ์„ ์ด์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ execCommand() ๋Š” ๋” ์ด์ƒ ์“ฐ์ง€ ์•Š์œผ๋ฉฐ ํ›จ์”ฌ ์‰ฝ๊ณ  ๊ฐ•๋ ฅํ•œ Clipboard API ๊ฐ€ ๋‚˜์™”์Šต๋‹ˆ๋‹ค. window.navigator.clipboard.writeText() ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ํ…์ŠคํŠธ๋ฅผ ํด๋ฆฝ๋ณด๋“œ์— ๋ณต์‚ฌํ•ด๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. โœจโœจ ์•„๋ž˜๋Š” ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ํ˜„์žฌ ํŽ˜์ด์ง€ URL์„ ๋ณต์‚ฌํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. function handleUrlShare() { const currUrl = window.location.href; // ํ˜„์žฌ url navigator.clipboard.writeText(currUrl).then(() => { alert("๋งํฌ๋ฅผ ๋ณต์‚ฌํ•˜์˜€์Šต๋‹ˆ๋‹ค."); }); }

[React/JS] Firebase - ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ ๊ตฌํ˜„ํ•˜๊ธฐ

Firebase์—์„œ ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ Google์€ ํ‘์ธ ๊ณต๋™์ฒด๋ฅผ ์œ„ํ•œ ์ธ์ข…์  ํ‰๋“ฑ์„ ์ถ”๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ ์ด ํŽ˜์ด์ง€๋Š” Cloud Translation API๋ฅผ ํ†ตํ•ด ๋ฒˆ์—ญ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Switch to English ์˜๊ฒฌ ๋ณด๋‚ด๊ธฐ Firebase์—์„œ ์‚ฌ์šฉ firebase.google.com ๋ณด์•ˆ์„ ์œ„ํ•ด ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ์€ ์ฃผ๊ธฐ์ ์œผ๋กœ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ˜ ๊ทธ๋Ÿผ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ์„ ๊ตฌํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค! 01. ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ input ๊ตฌํ˜„์„ ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. [React/JS] useState - ์—ฌ๋Ÿฌ ๊ฐœ์˜ input ์ƒํƒœ ๊ด€๋ฆฌํ•˜๊ธฐ ์ €๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ์„ ์˜ˆ์‹œ๋กœ ๊ตฌํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค! ์šฐ์„  ์ตœ์ข… ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ๐Ÿ˜Š import * as React from "react"; export default func..

[React/JS] useState - ์—ฌ๋Ÿฌ ๊ฐœ์˜ input ์ƒํƒœ ๊ด€๋ฆฌํ•˜๊ธฐ

์ €๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ์„ ์˜ˆ์‹œ๋กœ ๊ตฌํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค! ์šฐ์„  ์ตœ์ข… ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ๐Ÿ˜Š import * as React from "react"; export default function PasswordChange() { // input ์ปดํฌ๋„ŒํŠธ์˜ id ์„ ์–ธ // ํ˜„์žฌ ๋น„๋ฐ€๋ฒˆํ˜ธ const CURRENT_PASSWORD = "currentPassword"; // ์ƒˆ ๋น„๋ฐ€๋ฒˆํ˜ธ const NEW_PASSWORD = "newPassword"; // ์ƒˆ ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ const NEW_PASSWORD_CONFIRM = "newPasswordConfirm"; // input ์ปดํฌ๋„ŒํŠธ์— ๋งž๋Š” id๋ณ€์ˆ˜ ๋“ค const [inputs, setInputs] = React.useState({ currentPassword: "", newPas..

[React/JS] Firebase - ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ, ๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ •sendPasswordResetEmail

๋กœ๊ทธ์ธ ํ™”๋ฉด์—์„  ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๊นŒ๋จน์—ˆ์„ ๋•Œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ๋ฅผ ํ†ตํ•ด ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์žฌ์„ค์ • ํ•˜๋„๋ก ๋•๋Š” ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 00. sendPasswordResetEmail( auth, email ) /** ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ(๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ •) */ async function handleFindPassword() { await sendPasswordResetEmail(auth, emailValue) .then((res) => { // ์ด๋ฉ”์ผ ๋ณด๋‚ด๊ธฐ ์„ฑ๊ณต! }) .catch((error) => { // ์ด๋ฉ”์ผ ๋ณด๋‚ด๊ธฐ ์‹คํŒจ... }); } ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋ณธ์ธ์˜ ์ด๋ฉ”์ผ ์ฃผ์†Œ์ธ emailValue์„ ํ•ด๋‹น ํ•จ์ˆ˜์˜ ์ธ์ž์— ๋„ฃ์–ด ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. 01. ๊ฒฐ๊ณผ ํ•ด๋‹น ์ด๋ฉ”์ผ ์ฃผ์†Œ๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์žฌ์„ค์ •ํ•˜๋ผ๋Š” ๋ฉ”์ผ์ด ๋„์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค! ๋ณ€๊ฒฝํ• ..

[React/JS] ์š”์†Œ๊ฐ€ Object์ธ ๋ฐฐ์—ด์˜ ์ค‘๋ณต ์ œ๊ฑฐํ•˜๊ธฐ

ํ•„ํ„ฐ(Filter) 01. ๊ธฐ๋ณธ const data = ["A", "B", "C", "D", "A", "C"]; const result = data.filter((value, index) => { return data.indexOf(value) === index; // ์ฒ˜์Œ์œผ๋กœ ๋‚˜์˜ค๋Š” ๊ฐ’์˜ ์ธ๋ฑ์Šค์™€ ํ˜„์žฌ ์ธ๋ฑ์Šค๊ฐ€ ๊ฐ™์„ ์‹œ, ํฌํ•จ }); ํŠน์ • ๋ฌธ์ž ์œ„์น˜๋ฅผ ์ฐพ๋Š” indexOf ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.โœจ 02. ์š”์†Œ๊ฐ€ Object const data = [ { name: "A", age: "20" }, { name: "B", age: "24" }, { name: "C", age: "20" }, { name: "A", age: "20" }, { name: "D", age: "24" } ]; const result =..

[React/JS] useRef ์—ฌ๋Ÿฌ ๊ฐœ ํ•œ๋ฒˆ์— ์„ ์–ธํ•˜๊ธฐ(useRef ๋ฐฐ์—ด ๋งŒ๋“ค๊ธฐ)

useRef๋ฅผ ํ†ตํ•ด input์„ ์ œ์–ดํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๋Ÿฐ๋ฐ, ์ด๋Ÿฐ input์ด 5๊ฐœ๋ผ๋ฉด? useRef์ด 5๊ฐœ ํ•„์š”ํ•˜๊ฒ ์ฃ ! 5๊ฐœ ์ •๋„๋Š”.. ํ•˜๋‚˜ํ•˜๋‚˜ ์„ ์–ธํ•ด์ค„ ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ... ๋น„ํšจ์œจ์ ์ธ๋ฐ๋‹ค๊ฐ€ ์‹ฌ์ง€์–ด๋Š” input์ด 1000๊ฐœ๋ผ๋ฉด?!? ํ•˜๋‚˜ํ•˜๋‚˜ ์„ ์–ธํ•ด์ค„ ์ˆ˜ ์—†๊ฒ ์ฃ ..!!๐Ÿค”๐Ÿค”๐Ÿค” ํšจ์œจ์ ์œผ๋กœ ๊ตฌํ˜„ํ•ด๋ด…์‹œ๋‹ค!! ๊ฒฐ๋ก ์ ์œผ๋ก  ์•„๋ž˜์™€ ๊ฐ™์ด ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Ref๋ฅผ ๋ฐฐ์—ด๋กœ ๊ด€๋ฆฌํ•˜๊ณ , (item, index) => ( { Ref๋ฐฐ์—ด.current[index] = element; }} onChange={(e) => Ref์ด๋ฒคํŠธํ•จ์ˆ˜(e, index)} /> ) 00. ๋ฌธ์ œ.. import * as React from "react"; export default function App() { /** ํŒŒ์ผ์ด ์ถ”๊ฐ€๋  input์˜ r..

[React/JS] CORS ์—๋Ÿฌ ํ•ด๊ฒฐํ•˜๊ธฐ(์ด๋ฏธ์ง€ URL์„ API ์š”์ฒญ, ์ด๋ฏธ์ง€ URL๋กœ Blob, Blob๋กœ File ์ƒ์„ฑ)

https://velog.io/@zero-black/CORS-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0-Reverse-Proxy-server-%EA%B5%AC%EC%B6%95-with-Nginx CORS ์—๋Ÿฌ ํ•ด๊ฒฐํ•˜๊ธฐ + Reverse Proxy server ๊ตฌ์ถ• with Nginx ์œ„์™€ ๊ฐ™์ด React์—์„œ ์™ธ๋ถ€ api๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ, CORS ์—๋Ÿฌ๊ฐ€ ๋œฌ๋‹ค.CORS๋Š” Cross Origin Resource Sharing๋กœ, ์„œ๋กœ ๋‹ค๋ฅธ ์ถœ์ฒ˜ ๊ฐ„์— ์ž์›์„ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ธŒ๋ผ์šฐ์ ธ๋Š” ๋™์ผ velog.io ์œ„ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค!! โ˜บ๏ธโ˜บ๏ธ https://avoc-o-d.tistory.com/90 [React/JS] Image ..

[React/JS] Image URL๋กœ ํŒŒ์ผ ๊ฐ์ฒด(File object) ์ƒ์„ฑํ•˜๊ธฐ

https://avoc-o-d.tistory.com/91 [React/JS] CORS ์—๋Ÿฌ ํ•ด๊ฒฐํ•˜๊ธฐ(์ด๋ฏธ์ง€ URL์„ API ์š”์ฒญ, ์ด๋ฏธ์ง€ URL๋กœ Blob, Blob๋กœ File ์ƒ์„ฑ) https://velog.io/@zero-black/CORS-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0-Reverse-Proxy-server-%EA%B5%AC%EC%B6%95-with-Nginx CORS ์—๋Ÿฌ ํ•ด๊ฒฐํ•˜๊ธฐ + Reverse Proxy server ๊ตฌ์ถ• with Nginx ์œ„์™€ ๊ฐ™์ด React์—์„œ ์™ธ๋ถ€ api๋กœ ์š”์ฒญ์„ avoc-o-d.tistory.com fetchํ•˜์‹ค ๋•Œ, CORS ์—๋Ÿฌ๊ฐ€ ๋‚  ์‹œ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”! const convertUrlToFile = ..

[React/JS] ์„œ๋ฒ„์— ํŒŒ์ผ ๊ฐ์ฒด(File Object)/์ด๋ฏธ์ง€ ํŒŒ์ผ ํ•œ๋ฒˆ์— ์—ฌ๋Ÿฌ ๊ฐœ ๋ณด๋‚ด๊ธฐ - FormData

https://avoc-o-d.tistory.com/85 [React/JS] ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ, ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๊ตฌํ˜„ํ•˜๊ธฐ (ํŒŒ์ผ ์„ ํƒ ๋ฒ„ํŠผ ์ œ๊ฑฐ, ์ปค์Šคํ…€ํ•˜๊ธฐ) ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 1. FileReader๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹ 2. URL API๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹ ๐ŸŒˆ (์ถ”์ฒœ) ๊ตฌํ˜„ํ•ด๋ด…์‹œ๋‹ค! 00. - ํŒŒ์ผ ์„ ํƒ ๋ฒ„ํŠผ ์ œ๊ฑฐ ์šฐ์„ , input type="file" avoc-o-d.tistory.com ์œ„๋Š” ํŒŒ์ผ ์—…๋กœ๋“œ์— ๊ด€ํ•ด ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ ์“ฐ๊ณ  ์žˆ๋Š” ๊ธ€์€, API ์š”์ฒญ์„ ํ•  ๋•Œ Request body์— ํŒŒ์ผ ๊ฐ์ฒด๋ฅผ ๋ณด๋‚ด์ค˜์•ผ ํ•˜๋Š” ์ƒํ™ฉ์„ ์œ„ํ•ด ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค! json์œผ๋กœ๋Š” ํŒŒ์ผ ๊ฐ์ฒด๋ฅผ ์ฝ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— FormData๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ธฐ๋กœ ํ•ฉ์‹œ๋‹ค!..