타입 스크립트 버전으로 설치

 

next js (ts 버전) 설치

npx create-next-app 앱이름 --ts
# or
yarn create next-app 앱이름 --typescript

 

작동

해당 앱폴더로 이동하여

npm dev

#or

yarn dev

 

상대경로 -> 절대경로로 바꾸기

 

 

tsconfig.json 파일에 아래를 추가

{
  [기타내용],
  "compilerOptions": {
  	[기타내용],
    "baseUrl": ".",
    "paths": {
      "@/*": [
        "./*"
      ]
    }
  },
  [기타내용],
 }

 

mobx 설치

yarn add mobx
또는
npm install --save mobx

 

 

설치 후 작동이 안될 경우

.next / node_modules / package-lock.json 을 지우고 

yarn install
또는
npm install

한 뒤 실행해본다

 

참고 사이트

velog.io/@soncl_97/Next.js-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0

 

📋Next.js 시작하기

next 시작하기

velog.io

 

noogoonaa.tistory.com/65

 

next.js 와 typescript를 끼얹어 보자

최근 프론트엔드 생태계는 React, Vue, Angular 이 삼대장이 주류를 이루고 최근 Typescript 또한 각광 받고 있습니다. 저 또한 프론트엔드쪽 일을 자주하는 개발자로써 자연스럽게 이 삼대장 중 React를

noogoonaa.tistory.com

 

sumini.dev/guide/003-react-typescript-absolute-import/

 

React+Typescript 절대경로 import 설정하기

상대 경로를 사용하면 package 구조가 깊어질 수록 파일 간의 관계를 파악하기 어려워지고, 파일 이동시 귀찮게 경로를 수정해야 합니다. 예시 절대 경로를 사용하면 depth와 상관 없이 일관되고 짧

sumini.dev

 

chanyeong.com/blog/post/35

 

타입스크립트에서 절대경로(alias) 사용하기! - chanyeong

개요 요즘 부스트캠프에서 프로젝트를 진행하고 있는데 서버를 타입스크립트로 구현하고 있다. 그런데 설계 과정에서 폴더 및 파일이 나눠지고 import, export하는 과정에서 상대경로를 사용하다

chanyeong.com

 

velog.io/@sji7532/Next-Next-js%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-SSR-CSR-%EA%B5%AC%ED%98%84

 

[Next] Next js를 사용하여 SSR, CSR 구현

Next.js를 사용하면 React에서도 CSR, SSR을 혼합하여 빠른 성능을 구현할 수 있다.

velog.io

 

mobx.js.org/installation.html

 

Installation · MobX

mobx.js.org

 

'Web > ReactJS' 카테고리의 다른 글

intellij 인텔리제이 eslint typescript prettier  (0) 2021.02.19
react js / next js quill 적용  (0) 2021.02.17
react // 리덕스 실습  (0) 2020.08.14
리액트 // redux 리덕스  (0) 2020.08.12
리액트 // useEffect 연습  (0) 2020.08.05

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>
<body>
    <!-- input_1 자리에 input_{post.id} 들어가면됨 -->
    <input type="text" id="input_1" value="test" />

    <!-- 1 자리에 {post.id} 들어가면됨 -->
    <button class="1 123" onclick="test()">클릭</button>

    <script>

        let test = function(){

            // event.target.className  - event.target은 누른 버튼을 의미
            // 그 버튼에서 className을 가져온다
            console.log("버튼의 클래스는 " + event.target.className.split(" ")[0]);

            //"#input_"+ event.target.className 은 input_1 과 마찬가지다
            let data ={
                input1 : $("#input_"+ event.target.className.split(" ")[0]).val()
            }

            console.log(data.input1);
        }

    </script>
</body>
</html>

 

 

참고

https://github.com/codingspecialist/react-redux-example

 

codingspecialist/react-redux-example

Contribute to codingspecialist/react-redux-example development by creating an account on GitHub.

github.com

 

현재 프로젝트

https://github.com/jaybon1/react/tree/master/bitc_react/react-redux/redux-app

 

jaybon1/react

Contribute to jaybon1/react development by creating an account on GitHub.

github.com

 

esrint

prettier

 

 

--

 

 

프리티어 세팅파일 생성

--

 

 

깃헙에서 붙여넣기

프리티어 세팅

--

 

 

아래 것들을 삭제

--

 

 

--

 

 

구조

--

 

 

store를 만든다
1. 리듀서를 호출할 액션명을 적는다
2. state를 안쓰는 컴포넌트가 있을 수 있기 때문에 해당 컴포넌트용 state를 만들어준다
3. 리듀서 - state와 action을 받아서 액션명으로 함수를 실행한다.
리듀서는 내부적으로 setState가 내장되어 있어서 값만 넘기면 된다

--

 

 

리덕스를 설치한다

--

 

 

1. store로 만들어둔 리듀서 / Provider / createStore 를 가져온다
2. store.js파일로 진짜 스토어를 만든다
3. App컴포넌트를 Provider로 감싸고 store를 넘겨준다

--

 

 

--

 

 

리덕스를 통해서 함수를 받을 컴포넌트

--

 

 

1. 리덕스에서 connect 함수를 가져온다
2. 넘길 액션을 만든다 / 액션을 실행하면 onAdd 가 실행되고, dispatch가 내부적으로 리덕스 안에 있는 INCREMENT 로직을 실행한다
3. connect의 첫번째에는 state, 두번째에는 action / 이것을 담은 AddNumber 컴포넌트를 생성한다

--

 

 

리덕스를 이용하려면 connect를 export하는 Container를 사용한다
(리덕스를 이용하지 않으려면 AddNumber를 사용)

App.js에서 props를 넘기지 않는 다는 것을 보여주기 위한 파일.

--

 

 

리덕스를 통해서 state를 받을 컴포넌트

--

 

 

1. 리덕스에서 connect 함수를 가져온다
2. 넘길 스테이트를 만든다
3. connect의 첫번째에는 state, 두번째에는 action / 이것을 담은 DisplayNumber 컴포넌트를 생성한다

--

 

 

리덕스를 이용하려면 connect를 export하는 Container를 사용한다
(리덕스를 이용하지 않으려면 DisplayNumber를 사용)

App.js에서 props를 넘기지 않는 다는 것을 보여주기 위한 파일.

--

 

 

테스트

--

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Web > ReactJS' 카테고리의 다른 글

react js / next js quill 적용  (0) 2021.02.17
next js 시작하기  (0) 2021.02.15
리액트 // redux 리덕스  (0) 2020.08.12
리액트 // useEffect 연습  (0) 2020.08.05
리액트 // 스테이트를 훅스로 바꾸기  (0) 2020.08.05

 

자바는 타 클래스의 함수를 사용하기 위해서는 객체(레퍼런스)를 넘겨야 한다

자바스크립트(리액트)에서는 함수를 넘길 수 있다 (1급객체)

그런데 객체를 여러 단계로 넘기면 복잡해진다

객체지향에서 제일 어려운 것이 오브젝트를 넘기는 것이다

그러한 점을 해결하기위해 스프링에서는 IOC를 사용한다

스프링은 IOC공간에서 클래스타입으로 객체를 찾아낸다 -> 객체 안의 함수 모두를 가져올 수 있다

자바스크립트에서는 store에서 String값으로 함수를 찾아낸다(Action명) -> 

 

다른 화면에서 건드릴 것들을 예상해서 액션명을 미리 만들어둔다
아래는 store 공간에 만든 액션명들이다

[이벤트]를 등록하는데 다른화면에서 건드릴 것들 

최상위화면(A)에서 store를 만들고 자식들에게 props로 넘긴다

store(스프링의 IOC역할)
액션명 : A.change - (change()함수의 레퍼런스 + 해당화면의 state를 가진다)
액션명 : A.insert - (insert()함수의 레퍼런스 + 해당화면의 state를 가진다)

(액션명과 state 값을 가진 것을 리듀스 라고 한다)

 

다른 클래스가 store를 구독하면 접근을 할 수 있게 된다 (액션명을 호출하면 해당 함수가 실행된다)

레퍼런스를 실행하면 state값이 바뀐다

 

// A.js 화면 이벤트가 3개 있다
// onChange, onInsert, onDelete

// A의 자식 중에 B -> C -> D
// D가 A의 onChange를 건들이고 싶을 경우 기본은 props로 단계를 타고 함수를 전해줘야한다
// store는 모든 함수 레퍼런스를 저장하고 찾을 때 액션명으로 찾게 한다

// 1번 - 액션 이름 하나 생성
const ACHANGE = "a/CHANGE"; // 액션이름이 충돌 나지 않게 하기 위해서 a/를 붙여준다
const AINSERT = "a/INSERT";
const ADELETE = "a/DELETE";

// 앞에 파일명을 붙이고 뒤에 함수명을 붙여서 중복을 막는다
const DDELETE = "D/DELETE";

// 2번 - 액션을 함수로 호출할 수 있게 해야 함
const aChange = () => ({
  type: ACHANGE,
});

// const aChange = () => ({ // 여러줄이라도 소괄호로 묶어주면 한줄로 인식한다
//     type: ACHANGE
// });

const aInsert = () => ({
  type: AINSERT,
});

const aDelete = () => ({
  type: ADELETE,
});

const initialState = {
  number: 0,
};

// 3번 - 리듀서 만들기( 리듀서가 알고 있어야 하는 값 state, action)
// 프로젝트에 store는 하나로 관리한다
function aREducer(state = initialState, action) {
  switch (action.type) {
    case aChange:
      return {
        number: state.number + 10,
      };
    case aInsert:
      return {
        number: state.number + 1,
      };
    case aDelete:
      return {
        number: state.number - 10,
      };
  }
}

// 함수들을 익스포트
export { aInsert };
export { aChange };
export { aDelete };

// 리듀서를 익스포트
export default aREducer;

 

STORE 예시

리듀서(state, 액션이름){  }

요청하고 싶은 곳(D)에서 state와 aDelete를 store에 날리면 리듀서가 해당 레퍼런스를 이용해서 함수를 실행한다

state를 같이 날리는 이유는 D의 화면을 변경 하고 싶기 때문이다

 

(액션명과 함수 레퍼런스를 연결은 나중에)

 

리듀서에 액션이 많아지면 구분하기 힘들기 때문에 리듀서를 여러개 만들어서 컴바인 해서 합친다

 

 

 

 

 

 

 

 

 

'Web > ReactJS' 카테고리의 다른 글

next js 시작하기  (0) 2021.02.15
react // 리덕스 실습  (0) 2020.08.14
리액트 // useEffect 연습  (0) 2020.08.05
리액트 // 스테이트를 훅스로 바꾸기  (0) 2020.08.05
리액트 자동완성 스니펫  (0) 2020.08.04

 

소켓통신 : stateful (연결지속)
HTTP : stateless (상태 지속 안됨)
HTTP + 세션 : stateful 
HTTP + 웹소켓 : stateful 
JWT : stateless

-----------

 

더보기
Detail.js

하트

좋아요 1

댓글수 2

기본댓글1 내용

기본댓글2 내용



훅스 useState 



App.js에 Detail.js



state
1 comment 배열 2개
2 likeCount



하트를 클릭하면 좋아요 카운트를 올리고 useEffect를 이용해서 색깔이 변하고

좋아요 수가 2로 변함



나중에 댓글을 쓰면 부모의 state 값을 바꿔야한다

 

 

import React, { useState, useRef, useEffect } from "react";
import emptyimg from "./img/empty_heart.png";
import fillimg from "./img/fill_heart.png";

const Detail = () => {
  const [like, setLike] = useState(0);
  const [count, setCount] = useState(2);
  const [nowImg, setNowImg] = useState(emptyimg);
  const img = useRef();

  useEffect(() => {
    console.log("use");
    img.current.src = nowImg;
  }, [like]);

  const fill = () => {
    setLike(like + 1);
    setNowImg(fillimg);
  };

  return (
    <div>
      <div>
        <img onClick={fill} ref={img} />
      </div>
      <div>좋아요{like}</div>
      <div>댓글수{count}</div>
      <div>댓글1</div>
      <div>댓글2</div>
    </div>
  );
};

export default Detail;

 

 

 

 

참고사항

https://20200302wc.tistory.com/474

 

리액트 숙제

https://github.com/jg20228/ReactHooksHomework import React, { useState, useEffect, useRef } from "react"; import logo2 from "./img/logo2.png"; import logo1 from "./img/logo.jpg"; const Detail2 = ()..

20200302wc.tistory.com

 

'Web > ReactJS' 카테고리의 다른 글

리액트 // redux 리덕스  (0) 2020.08.12
리액트 // useEffect 연습  (0) 2020.08.05
리액트 자동완성 스니펫  (0) 2020.08.04
리액트 // hooks 훅스 / useState / useEffect / useMemo / useRef  (0) 2020.08.03
리액트 // 생명주기  (0) 2020.07.29

+ Recent posts