Redux

Redux 사용 방법

 

Redux 를 사용하는 이유 )

: props 드릴링을 방지하기 위하여 사용! Redux 를 사용하면 props 를 사용하지 않고도 State 공유가 가능하다!

 

redux 를 사용하지 않고 props 를 넘기는 경우 props 가 필요한 하위 컴포넌트까지 최초 선언된 컴포넌트 부터 하위의 하위 컴포넌트까지 이어 받아 전달해야하기 때문에 props 의 복잡도가 증가하며 유지보수가 힘들어진다.

 

또한 최하위 컴포넌트에서 props 의 State 를 변경하게 되면 해당 State 를 하위로 전달하기 위해 props 로 받아온 컴포넌트까지 불필요한 재렌더링 문제가 발생한다.

 

function App() {
  const [user, setUser] = useState("Alice");
  console.log("🔄 App 렌더링");

  return <Parent user={user} setUser={setUser} />;
}

function Parent({ user, setUser }) {
  console.log("🔄 Parent 렌더링");
  return <Child user={user} setUser={setUser} />;
}

function Child({ user, setUser }) {
  console.log("🔄 Child 렌더링");
  return <GrandChild user={user} setUser={setUser} />;
}

function GrandChild({ user, setUser }) {
  console.log("🔄 GrandChild 렌더링");
  return (
    <div>
      <h1>Hello, {user}!</h1>
      <button onClick={() => setUser("Bob")}>Change User</button>
    </div>
  );
}

redux 를 사용하지 않은 경우

GrandChild 컴포넌트에서 전달받은 user props 가 변경될 시 모든 컴포넌트에서 렌더링 콘솔이 출력된다.

 

 

 

 

 

1. Redux 설치

더보기

1. Redux 는 React 버전 18.1.0 이상부터 제대로 사용할 수 있으므로 package.json 에서 react 와 react-dom 버전을 확인한다.

버전이 18.1.0 버전 이상인지 확인

 

 

 

2. Redux 설치

npm install @reduxjs/toolkit@1.8.1 react-redux

 터미널을 켜서 프로젝트 디렉토리로 접속한 뒤 위 명령어를 입력하여 redux 를 설치

 

 

 

 

 

2. Redux 세팅 및 Redux State 사용 방법

더보기

1. Store.js 작성

Store.js 작성

 

 

 

2. Provider 와 생성한 store 를 index.js 에서 import 하여 전체 컴포넌트를 Provider 컴포넌트로 감싸준 뒤 store 를 설정

index.js 작성

 

 

 

 3. store.js 에 선언하고 싶은 State 를 생성한 뒤 reducer 에 등록 ( Redux 에 State 선언 )

State 선언

 

 

 

 4. 해당 State 를 필요한 곳에서 불러와서 사용하기

useSelector 를 사용하여 store.js 에서 선언한 모든 State 값을 변수로 담아온 뒤 store.js 에서 선언한 name 키 값으로 데이터를 추출하여 사용한다.

 

정상적으로 State 내부 값이 추출되어 표현되는 모습

 

 

 

5. 여러 State 를 사용하는 경우

State 를 두 개 선언한 뒤 꺼내서 사용
출력된 값

 

 

 

 

 

3. Redux State 변경 방법

더보기

1. 변경 함수를 store.js 에 선언한 뒤 export

changeName 함수를 선언하고 export, 매개변수 a 의 값을 전달 받아 initialState 의 값을 a 매개 변수의 실제 값(a.payload)으로 변경하여 저장 state 변수에는 기존의 값인 '안녕하세요!' 문자열이 담겨있음

 

 

 

2. 변경할 컴포넌트에서 useDispatch 함수를 사용하여 store.js 의 State 데이터의 변경을 요청하여 사용

useDispatch 를 사용하여 변경 함수의 실행을 요청하여 State 의 내부 값을 변경한다. 이때 함수에 매개변수를 전달하여 변경할 수 있다.

 

State 값이 변경되어 잘 출력되는 모습

 

 

 

 

 

3. State 변경 함수를 여러개 선언하여 사용하기

함수를 상황에 맞게 여러개 설정 및 export

 

함수를 사용하는 곳에서 각각 다른 함수를 호출하여 dispatch 를 통해 함수 실행을 요청

 

State 변경 함수들이 잘 작동하는 모습

 

 

 

 

 

Redux 를 사용할때 유의할 점

 

1. State 변경함수는 직접 호출하는 것이 아닌 useDispatch 를 사용해 호출하는 형태로 사용해야 한다.

2. State 를 변경할때 매개변수를 전달하여 사용하는 경우 매개변수를 꼭 payload 함수를 사용해 해당 매개변수의 값을 꺼내와서 사용해야 한다.

3. js 파일을 분리하여 State 를 여러 파일에 분리하여 사용할 수 있다.

 

 

 

 

 

728x90
728x90

'FE > React' 카테고리의 다른 글

[React] React Component  (0) 2024.07.19
[React] useState  (0) 2024.07.19

 

 

React Component 란?

React 컴포넌트는 페이지에 렌더링할 React 엘리먼트를 반환하는 작고 재사용 가능한 코드 조각입니다. 가장 간단한 React 컴포넌트는 React 엘리먼트를 반환하는 일반 JavaScript 함수

( 함수 뿐만 아니라 class 로도 컴포넌트를 작성할 수 있다 )

 

Component 규약

1. 컴포넌트 함수의 첫 글자는 대문자로 시작한다.

컴포넌트 변수명은 대문자로 시작

 

2. 컴포넌트의 리턴 값은 최상단의 하나의 태그만을 갖는다

병렬의 태그를 리턴할 수 없다

 

 

컴포넌트를 사용하면 HTML 요소들을 더욱 편리하게 관리할 수 있으며 useState 와 useEffet 를 사용하여 동적인 화면을 구성할 수 있다.

728x90

'FE > React' 카테고리의 다른 글

[React] Redux  (0) 2025.02.01
[React] useState  (0) 2024.07.19

 

 

useState 란?

리엑트의 useState 는 함수형 컴포넌트에서 상태를 관리하기 위한 Hook 중 하나

 

 

1. useState 를 import

import { useState } from 'react';
// useState 를 사용하기 위해선 react 에서 제공하는 useState 를 import!!

 

2. State 변수를 선언 및 사용

import { useState } from 'react';

function Example() {
	// like 는 사용 변수, setLike 는 State 변경 함수
	let [like, setLike] = useState(0);

	return (
            <div>
                <p onClick = { () => {
                        setLike(like + 1); // useState 변경 함수 사용하여 값을 변경
                }}>좋아요👍🏻 {like}</p> // useState 변수 사용
            </div>
    	);
}

 

useState 변수를 사용해 저장된 State 값을 꺼내서 사용하고, 변경 함수를 사용하여 State 에 저장된 값을 변경한다.

useState 는 component 를 띄우거나 띄우지 않거나 등 상태를 변경하는데 사용된다.

728x90

'FE > React' 카테고리의 다른 글

[React] Redux  (0) 2025.02.01
[React] React Component  (0) 2024.07.19

 

 

 

 

 

datepicker(), draggable()

- jQuery UI 사이트 -

 

jQuery UI

jQuery UI is a curated set of user interface interactions, effects, widgets, and themes built on top of the jQuery JavaScript Library. Whether you're building highly interactive web applications or you just need to add a date picker to a form control, jQue

jqueryui.com

 

jquery-1.12.1-ui.js
0.50MB

 

jquery 의 ui 기능을 추가로 script 로 선언해야 사용할 수 있는 메소드

아래 코드에 보면 추가로 선언해놓은 것을 볼 수 있으며, jquery 보다 아래에 코드로 선언해야 오류가 발생하지 않는다.

<!DOCTYPE html>
<html lang="ko">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
    <script src="jquery-1.12.1-ui.js"></script>
    <script>
      $(() => {
        $("#date").datepicker();
        $("#drag").draggable();
      });
    </script>
    <style>
      #drag {
        width: 200px;
        height: 100px;
        background: red;
        border-style: solid;
      }
    </style>
  </head>
  <body>
    <div id="drag"><h3>Drag</h3></div>
    <input type="date" /><br />
    <input type="text" readonly placeholder="날짜 선택" id="date" />
  </body>
</html>
코드 실행
728x90

'FE > JavaScript' 카테고리의 다른 글

[JavaScript] 답글 달기 기능 만들기  (0) 2024.03.27
[JavaScript] jquery - slideDown, slideUp 메소드  (0) 2024.03.27
[JavaScript] append, html  (0) 2024.03.27
[JavaScript] animate  (0) 2024.03.27
[JavaScript] 클래스 추가, css 추가  (0) 2024.03.27

 

 

 

 

 

답글 달기 기능 구현

z-index 를 사용하여 display:none 으로 보이지 않게 태그를 겹쳐놓은 뒤 덮어씌워서 사용

<!DOCTYPE html>
<html lang="ko">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      #modal_wrap {
        display: none;
        position: fixed;
        z-index: 0;
        margin: auto;
        top: 0;
        left: 0;
        right: 0;
        width: 100%;
        height: 100%;
        background: rgba(0, 0, 0, 0.4);
      }
      #first {
        display: none;
        position: fixed;
        z-index: 1;
        margin: auto;
        top: 30px;
        left: 0;
        right: 0;
        width: 300px;
        height: 350px;
        background: rgba(233, 38, 38, 0.4);
      }
    </style>
    <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
    <script>
      const reply = () => {
        $("#first").slideDown("slow");
        $("#modal_wrap").show();
      };
      const slide_hide = () => {
        $("#first").slideUp("fast");
        $("#modal_wrap").hide();
      };
    </script>
  </head>
  <body>
    <div id="modal_wrap">
      <div id="first">
        <div style="width: 250px; margin: auto; padding-top: 20px">
          <b>답글 작성 페이지</b>
          <b>작성자 : 홍길동</b>
          <b>제목 : </b><input type="text" /><br />
          <b>내용 : </b><br /><textarea cols="30" rows="5"></textarea>
          <hr />
          <button type="button">답글</button>
          <button type="button" onclick="slide_hide()">취소</button>
        </div>
      </div>
    </div>
    <h1>내용 작성 합니다</h1>
    <p>배부르다</p>
    <button onclick="reply()">답글 달기</button>
  </body>
</html>
코드 실행
728x90

 

 

 

 

 

slideDown, slideUp

jQuery 의 내장 메소드인 slideDown, slideUp

<!DOCTYPE html>
<html lang="ko">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      #slide {
        padding: 5px;
        text-align: center;
        background: aqua;
      }
      #first {
        display: none;
        background: yellow;
        height: 100px;
      }
    </style>
    <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
    <script>
      window.onload = () => {
        $("#slide").mouseover(() => {
          $("#first").slideDown("slow");
        });
        $("#slide").mouseout(() => {
          $("#first").slideUp("slow");
        });
      };
    </script>
  </head>
  <body>
    <div id="slide">[오늘의 공지]</div>
    <div id="first">
      오늘의 공지사항<br />
      입니다<br />
      안녕
    </div>
  </body>
</html>
코드 실행
728x90

'FE > JavaScript' 카테고리의 다른 글

[JavaScript] jquery_ui - datepicker, draggable  (0) 2024.03.27
[JavaScript] 답글 달기 기능 만들기  (0) 2024.03.27
[JavaScript] append, html  (0) 2024.03.27
[JavaScript] animate  (0) 2024.03.27
[JavaScript] 클래스 추가, css 추가  (0) 2024.03.27

 

 

 

 

 

append, html

append : 선택된 요소의 끝부분에 내용을 추가

html : 선택된 요소의 내용을 교체

<!DOCTYPE html>
<html lang="ko">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
    <script>
      let member = [];
      let cnt = 0;
      window.onload = () => {
        let msg = "";
        for (let i = 0; i < 100; i++) {
          member[i] = i;
          if (i < 10) {
            msg += i + "<br>";
            cnt++;
          }
        }
        console.log(member);

        $("#content").html(msg);
      };
      const view = () => {
        let msg = "<hr>";
        for (let i = cnt + 1; i <= cnt + 10; i++) {
          msg += member[i] + "<br>";
        }
        cnt += 10;
        $("#content").append(msg);
      };
      const appendVal = () => {
        // document.getElementById("txt").insertBefore
        $("#txt").append("내용 추가");
      };
      const htmlVal = () => {
        $("#txt").html("내용 교체");
      };
      function inputVal() {
        var t = $("#val01").val();
        $("#val01").val("");
        $("#val02").val(t);
      }
    </script>
  </head>
  <body>
    <div id="txt"></div>
    <hr />
    <input type="text" id="val01" /><br />
    <input type="text" id="val02" /><br />

    <button onclick="inputVal()">input 변경</button>
    <button onclick="appendVal()">appendVal</button>
    <button onclick="htmlVal()">htmlVal</button>

    <hr />

    <div id="content"></div>
    <button onclick="view()">더보기</button>
  </body>
</html>
코드 실행
728x90

 

 

 

 

 

animate

animate : css 코드를 변화시킬때 수치를 천천히 변화시킨다 ( 부드러운 변화 효과 )

<!DOCTYPE html>
<html lang="ko">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
    <script>
      window.onload = () => {
        $(".move").click(() => {
          $("img").css({ left: "300px", height: "300px", width: "350px" });
          // css 는 바로 변환
        });

        $(".init").click(() => {
          $("img").animate({ left: "0px", height: "100px", width: "130px" });
          // animate 는 수치가 천천히 변화 ( 부드러운 효과 )
        });
      };
    </script>
  </head>
  <body>
    <button class="move">확대</button>
    <button class="init">축소</button>
    <hr />
    <img
      src="resources/images/car01.png"
      width="130px"
      height="100px"
      style="position: relative"
    />
  </body>
</html>
코드 실행

확대는 css 를 변경하여 바로 크기가 커지지만, 축소는 animate 를 사용하여 천천히 부드러운 효과를 가지며 축소

728x90

+ Recent posts