๋ชฉ๋กreact (30)
๐ค ์์งlog ๐ค
์ฐ๋ฆฌ๊ฐ ๋ง์ฐ์ค๋ก ์ด๋ ํ ํ๊ทธ(div, ul, li, a ๋ฑ)๋ฅผ ํด๋ฆญํ์ ๊ฒฝ์ฐ ๋ง์ ๋ถ๋ค์ด ํด๋น ํ๊ทธ๋ง ํด๋ฆญ์ด ๋์๋ค๊ณ ์๊ฐํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ํ์ง๋ง ํด๋น ํ๊ทธ๋ง์ด ํด๋ฆญ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๋ ๊ฒ์ด ์๋๋ผ ํ๊ทธ๋ฅผ ๊ฐ์ธ๊ณ ์๋ ๋ถ๋ชจ ํ๊ทธ๋ค๋ ํด๋ฆญ ์ด๋ฒคํธ๋ฅผ ์ธ์ํ๊ณ ๋ฐ์ํ๊ฒ ๋๋ค. ์ด๊ฒ์ ๋ฒ๋ธ์ (Bubble Up) ๋๋ ๋ฒ๋ธ๋ง(Bubbling)์ด๋ผ๊ณ ํ๋ค. ์ด๋ฌํ ๋ฒ๋ธ๋ง ๋๋ ๋ฒ๋ธ์ ์ ๋ง๋ ๊ฒ์ด stopPropagation์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค. ์์์์๋ก ํด๋น ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ์ง ์๊ณ ์์ ๋ง ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๋๋ก ์ฌ์ฉํ๋ ๊ฒ์ด stopPropagation ์ด๋ค. ( Result ํด๋ฆญ โ ) ์ด ์ฝ๋๋ฅผ ๋ณด๋ฉด ๋จ์ง .last-el ๋ง ํด๋ฆญํ์ ๋ฟ์ธ๋ฐ ๋ถ๋ชจ ์๋ฆฌ๋จผํธ์๊ฒ๋ ์ด๋ฒคํธ๊ฐ ์ ํ ๋จ์ ์ ์ ์๋ค. ์ด๋ ์ฌ์ฉํ๋ ๊ฒ์ด e...
beforeunload ์ด๋ฒคํธ๋ ์ฌ์ฉ์๊ฐ ์ผ๋ฐ์ ์ผ๋ก ํ์ด์ง๋ฅผ ๋ซ๊ฑฐ๋ ์๋ก๊ณ ์นจํ ๋, ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ซ์ ๋, ์ฃผ์ ํ์์ค์ ๋ค๋ฅธ URL์ ์ ๋ ฅํ๊ฑฐ๋ ๋งํฌ๋ฅผ ํด๋ฆญํ ๋ ๋ฐ์ํ๋ฉฐ, ํ์ด์ง๋ฅผ ๋ซ๊ธฐ ์ ์ ์ด๋ ํ ์กฐ์น๋ฅผ ์ทจํ ์ ์๊ฒ ์ ๊ณตํฉ๋๋ค. ์ฃผ๋ก ์ฌ์ฉ์์๊ฒ ๋ณ๊ฒฝ์ฌํญ์ ์ ์ฅํ ๊ฒ์ธ์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๊ฑฐ๋, ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ ์ค์ธ ๋ฆฌ์์ค๋ฅผ ์ ๋ฆฌํ๋ ๋ฑ์ ์์ ์ ์ํํ ๋ ํ์ฉ๋ฉ๋๋ค. ๐ React ์์ ์ฌ์ฉํ๊ธฐ useEffect(() => { const handleBeforeUnload = (event) => { event.preventDefault(); event.returnValue = ''; // ๋์ด์ ์ง์๋์ง ์๋ ์์ฑ ์ด๋ผ๊ณ ํ๋ค. ์์ฑํ์ง ์์๋ ๋ฌด๋ฐฉ }; window.addEventListener('b..
๐ React : ๋ฆฌ์กํธ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ๋๋ก์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค๊ธฐ์ํด ์ฌ์ฉํ๋ ์น ํ๋ ์ ์ํฌ ์ด๋ค. ๐๏ธ React์ ์๋ฆฌ, ํน์ง, ์ฅ๋จ์ : ๋ฆฌ์กํธ๋ ๋ฐ์ดํฐ์ ํ๋ฆ์ด ํ๋ฐฉํฅ์ผ๋ก๋ง ํ๋ฅด๋ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ ๊ฐ์ง๊ณ ์๋ค. UI๋ฅผ ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ก ์ชผ๊ฐ์ ๋ง๋ ๋ค. ์ ์ฒด ์ฝ๋๋ฅผ ํ์ ํ๊ธฐ ์ฌ์ฐ๋ฉฐ ์ ์ง๋ณด์ ๋ฐ ๊ด๋ฆฌ๊ฐ ์ฉ์ดํ๊ณ , ์ฌ์ฌ์ฉ์ฑ์ด ๋๋ค. ๋ฆฌ์กํธ๋ฅผ ์ด์ฉํ๋ฉด ๋์ ์ธ UI๋ฅผ ์ฝ๊ฒ ๋ง๋ค์ ์๋ค. ๐๏ธ Javascript + XML ์๋ฐ์คํฌ๋ฆฝํธ์ HTML ํ๊ทธ๋ฅผ ๋ผ์น์ ๋ฌธ๋ฒ HTML ํ๊ทธ ์์์ ์ค๊ดํธ {}๋ฅผ ์ฌ์ฉํด์ JS๋ฅผ ์ธ ์ ์๋ค. const apple = "์ฌ๊ณผ" const title = {apple} ๋์ค๋ถ? ๐๏ธ Component ํ๋ฉด์ ์ด๋ฃจ๋ '์์'๋ก ์ฌ๋ฌ ๊ณณ์์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ..
์นด์นด์ค์์ ์ ๊ณตํ๋ ์ฐํธ๋ฒํธ ์๋น์ค ๋ฅผ ๋ฆฌ์กํธํ๊ฒฝ์์ ์กฐ๊ธ ๋ ๊ฐํธํ๊ฒ ์ด์ฉํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ด์ ์ฌ์ฉํด๋ดค๋ค ใ ! npm i react-daum-postcode ์๋ฒ ๋ ํด์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ๊ณผ ํ์ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๊ณ , ๋๋ ํ์ ๋ฐฉ์์ผ๋ก ๊ตฌํํด๋ณด์๋ค. โ ์ ์ฒด ์ฝ๋ import React, { useState } from "react"; import styled from "styled-components"; import { useDaumPostcodePopup } from "react-daum-postcode"; import { postcodeScriptUrl } from "react-daum-postcode/lib/loadPostcode"; const PostCode = () => {..
import { useCallback, useRef, useState } from "react"; import Webcam from "react-webcam"; import styled from "styled-components"; const CustomWebcam = () => { const webcamRef = useRef(null); const [imgSrc, setImgSrc] = useState(null); const [mirrored, setMirrored] = useState(true); const capture = useCallback(() => { if (webcamRef.current) { const imageSrc = webcamRef.current.getScreenshot(); se..
๊ธฐ์กด์ NodeJS๋ก ๋ง๋ค์ด๋ ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ get ํด์์ ํ๋ก ํธ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ง์ ๋ฌดํ์คํฌ๋กค์ ๊ตฌํํด๋ณด์๋ค. ์์ ์ ํด๋ดค๋๊ฑด๋ฐ ๋ค์ ํ๋ ค๋ ํท๊ฐ๋ฆฌ๊ธฐ ์์ ...๐ต๐ซ ; ๊ทธ๋๋ ์ด์ฐ์ด์ฐ ๊ตฌํ์ ํด๋ณด์๋ค .. ์คํฌ๋กค์ด ์์ง์ด๋ฉด ๋ฐ์ดํฐ๋ฅผ ๊ณ์ ํด์ ๋ถ๋ฌ์จ๋ค. ( + ์คํฌ๋กค์ด ๋ฐ๋ฅ์ ๋ฟ์ผ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ์ฝ๋๋ ๊ตฌํ์์ ) // useGetFruits.ts import axios from "axios"; import { useInfiniteQuery } from "react-query"; const fetchFruits = async () => { const { data } = await axios.get(`http://localhost:8080/fruits`); return data..
๐ฃ QueryClient react-query๋ฅผ ํ๋ก์ ํธ์ ์ ํ ํ ๋, ๊ฐ์ฅ ๋จผ์ ํ๋ ๊ฒ์ ์ฑ์ ์ต์์์์ QueryClientProvider๋ก ์ฐ๋ฆฌ์ ์ฑ์ ๊ฐ์ธ์ฃผ๋ ์ผ์ด๋ค. import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; ... const queryClient = new QueryClient(); // ์๋ก์ด QueryClient์ธ์คํด์ค๋ฅผ ์์ฑ function Root() { return ( ); // QueryClientProvider๋ฅผ ํตํด ์ฑ ์ ์ฒด์์ ์์ฑํ QueryClient์ ์ ๊ทผ ๊ฐ๋ฅ } ์ฐ๋ฆฌ๋ ๋จผ์ ์๋ก์ด QueryClient์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ , QueryClientProvider๋ฅผ ํตํด ์ฑ ์ ์ฒด์์ ์..
React๋ก ๋ง๋ ํ๋ก ํธ์์, axios๋ฅผ ํตํด nodeJS๋ก ๋ง๋ api๋ฅผ ์์ฒญํ์ฌ crud ๋ฅผ ๊ตฌํํด๋ณด๋ ค๊ณ ํ๋ค. openAPI๋ฅผ ํตํด ์ฐ์ตํด๋ณด๋ ค๊ณ ํ๋๋ฐ ์ด๊ฒ์ ๊ฒ ๋คํด๋ณด๊ธฐ์๋ ํ๊ณ๊ฐ ์์ด์ ,, api๋ฅผ ๋ง๋ค์ด๋ณด๊ธฐ๋ก ํ์๊ณ TDD ๊ฐ์๋ฅผ ๋ค์ผ๋ฉฐ nodeJS๋ก ๊ตฌํํด๋ณด์๋ค !_! reactQuery ์ฐ์ตํ๋ ค๊ณ ๋ง๋ค๊ธฐ ์์ํ๊ฑฐ์๊ณ , ํด๋ณด๋ฉด์๋ ๋๋๊ฑฐ์ง๋ง ๊ณ์ํด์ ์ฌ์ฉํด๋ณด๊ณ ๊ณ์ ๊ณต๋ถํด์ผ๊ฒ ๋ค๊ณ ๋๋๋ถ๋ถ์ด ๋ง์๋ค. ํด๋ดค๋๊ฒ๋ค๋ ์ฌ์ฉ์ํ๋ค๋ณด๋ ์์ด๋ฒ๋ฆฌ๊ณ ์ค์ํ๋ ๋ถ๋ถ์ด ๋ง์๋น ๐ซ ๊ทธ๋๋ ํ๊ณ ๋๋ ๋ฟ-๋ฏ '-'b ๐ค๐ค ์๋ฌด๋ ์๊ถ๊ธํดํ๊ฒ ์ง๋ง ๋จ๊ฒจ๋ณด๋ ์ฝ๋โค๏ธ : ๋๋ณด๊ธฐ https://github.com/Amy-Eunji/nodejs https://github.com/Amy-Eunji/react-crud
React-Query๋? ๐๐ป React Query๋ React Application์์ ์๋ฒ ์ํ๋ฅผ ๋ถ๋ฌ์ค๊ณ , ์บ์ฑํ๋ฉฐ, ์ง์์ ์ผ๋ก ๋๊ธฐํํ๊ณ ์ ๋ฐ์ดํธํ๋ ์์ ์ ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. React-Query์ ์ฅ์ โ๏ธ React ์ดํ๋ฆฌ์ผ์ด์ ๋ด์์ ๋ฐ์ดํฐ ํจ์นญ, ์บ์ฑ, ๋๊ธฐ์ , ๊ทธ๋ฆฌ๊ณ ์๋ฒ์ ์ํ์ ์ ๋ฐ์ดํธ๋ฅผ ์ข ๋ ์ฉ์ดํ๊ธฐ ์ํด ๋ง๋ค์ด์ค๋ค. โ๏ธ ๊ธฐ์กด์๋ ์ง์ ๋ง๋ค์ด์ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ๋ค์ ๋ณ๋์ ์ต์ ์ผ๋ก ์ง์ํ์ฌ ๋ณต์กํ๊ณ ์ดํดํ ์ ์๋ ์๋ง์ ์ฝ๋๋ฅผ ๋์ React-Query ๋ก์ง์ ํตํด ์งง์ ์ฝ๋๋ก ๋์ฒดํ ์ ์๊ฒ ๋์๋ค. โ๏ธ ํ๋ก์ ํธ ๊ตฌ์กฐ๊ฐ ๊ธฐ์กด๋ณด๋ค ๋จ์ํด์ ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ง ๋ณด์ํ๊ธฐ ์ฝ๊ณ , ์๋ก์ด ๊ธฐ๋ฅ์ ์ฝ๊ฒ ๊ตฌ์ถํ ์ ์๋ค. ๊ทธ ์ธ์๋ ๋ง์ ์ฅ์ ์ด ์๋ค. → useQuery, useM..
// Main.tsx import { useEffect, useState } from "react"; import styled from "styled-components"; import { useQuery } from "react-query"; import Pagination from "../templates/Pagination"; const Main = () => { // const [post, setPost] = useState([]); const [totalPosts, setTotalPosts] = useState(10); // ํ์ด์ง ๋น ๊ฒ์๋ฌผ ์ const [page, setPage] = useState(1); // ํ์ฌ ํ์ด์ง ๋ฒํธ const offset = (page - 1) * totalP..