react 적용시
(위의 코드와 아래의 코드를 참고하여 같이 사용하면 쉽게 만들 수 있음)
next 적용시 아래 블로그에서 시행착오를 겪은 마지막 코드를 이용하고 툴바는 위의 코드를 이용하면 됨
m.blog.naver.com/choirj91/222044740530
react 적용시
(위의 코드와 아래의 코드를 참고하여 같이 사용하면 쉽게 만들 수 있음)
next 적용시 아래 블로그에서 시행착오를 겪은 마지막 코드를 이용하고 툴바는 위의 코드를 이용하면 됨
m.blog.naver.com/choirj91/222044740530
타입 스크립트 버전으로 설치
npx create-next-app 앱이름 --ts
# or
yarn create next-app 앱이름 --typescript
해당 앱폴더로 이동하여
npm dev
#or
yarn dev
tsconfig.json 파일에 아래를 추가
{
[기타내용],
"compilerOptions": {
[기타내용],
"baseUrl": ".",
"paths": {
"@/*": [
"./*"
]
}
},
[기타내용],
}
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
sumini.dev/guide/003-react-typescript-absolute-import/
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>
자바스크립트 / n개의 요소를 가진 배열 생성하기 , 배열에 동일한 데이터 채우기 (0) | 2022.08.06 |
---|---|
자바스크립트 javascript // 쿼리스트링(querystring)을 수정하는 방법 (0) | 2022.01.20 |
ajax 에이작스 get post 요약 (0) | 2020.06.26 |
const 란 // const 값을 변경하려고하면? (0) | 2020.06.15 |
자바스크립트 최근 함수 선언방식 (0) | 2020.06.04 |
참고
https://github.com/codingspecialist/react-redux-example
현재 프로젝트
https://github.com/jaybon1/react/tree/master/bitc_react/react-redux/redux-app
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를 넘기지 않는 다는 것을 보여주기 위한 파일.
--
테스트
--
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의 화면을 변경 하고 싶기 때문이다
(액션명과 함수 레퍼런스를 연결은 나중에)
리듀서에 액션이 많아지면 구분하기 힘들기 때문에 리듀서를 여러개 만들어서 컴바인 해서 합친다
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
react // 리덕스 실습 (0) | 2020.08.14 |
---|---|
리액트 // redux 리덕스 (0) | 2020.08.12 |
리액트 // 스테이트를 훅스로 바꾸기 (0) | 2020.08.05 |
리액트 자동완성 스니펫 (0) | 2020.08.04 |
리액트 // hooks 훅스 / useState / useEffect / useMemo / useRef (0) | 2020.08.03 |
handleChange = (e) => { this.setState({ [e.target.name]: e.target.value }) }
훅스로 바꾸기
Computed property names
리액트 // 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 |