import { atom } from 'recoil';
const counterState = atom({
key: 'counterState',
default: 0
});
import { selector } from 'recoil';
...
const fontSizeLabelState = selector({
key: 'fontSizeLabelState',
get: ({get}) => {
const fontSize = get(fontSizeState);
const unit = 'px';
return `${fontSize}${unit}`;
},
});
위 예제의 셀렉터는 fontSizeState 상태를 가져와 폰트 사이즈를 출력하는 순수 함수처럼 동작한다.
import { useRecoilState, useRecoilValue } from 'recoil';
function FontButton() {
const [fontSize, setFontSize] = useRecoilState(fontSizeState);
const fontSizeLabel = useRecoilValue(fontSizeLabelState);
return (
<>
<div>Current font size: ${fontSizeLabel}</div>
<button onClick={setFontSize(fontSize + 1)} style={{fontSize}}>
Click to Enlarge
</button>
</>
);
}
npx create-react-app ./ --template typescript
npm i recoil axios
App.css
, App.test.tsx
, logo.svg
파일삭제
<App/>
컴포넌트를 감싸준다.import React, { Suspense } from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import { RecoilRoot } from "recoil";
const root = ReactDOM.createRoot(
document.getElementById("root") as HTMLElement
);
root.render(
<React.StrictMode>
<Suspense fallback={<p>Loading..</p>}>
<RecoilRoot>
<App />
</RecoilRoot>
</Suspense>
</React.StrictMode>
);
import { atom, selector, useRecoilValue } from "recoil";
todoIdstate
, todoItemQuery
생성const response = await axios.get(`https://jsonplaceholder.typicode.com/todos/${id}`)
import React from "react";
import { atom, selector, useRecoilValue } from "recoil";
import axios from "axios";
const todoIdState = atom({
key:'todoIdState',
default: 1
})
const todoItemQuery = selector({
key: 'todoItemQuery',
get: async({get}) =>{
const id = get(todoIdState);
const response = await axios.get(`https://jsonplaceholder.typicode.com/todos/${id}`)
return response.data;
}
})
function App() {
const data = useRecoilValue(todoItemQuery)
return <div>{data.title}
{data.userId}</div>;
}
export default App;
import React from "react";
import { RecoilRoot } from "recoil";
function App() {
return <RecoilRoot>Hello Recoil</RecoilRoot>;
}
export default App;
npm i @emotion/styled @emotion/react react-icons uuid
TS로 하다보니 어려움이 계속생긴다.......
todolist를 타입스크립트로 만드는 강의가 있어서 들으면서 해보려했는데,
계속 중간중간 모르는 개념이 나올때마다 멈추게되어서,
내일부터는 공부방식을 바꿔봐야할것같다.
일단은, 급한대로 팀원이 한방식대로 내 코드를 타입스크립트로 바꿔서 데이터를 받아오는 것 까지 했다.
내일은 이 서버에서 받아오는 코드를 이해해보고, 자유자재로 써봐야겠다!
그러려면, 이 프로젝트가아닌 그냥 타입스크립트에대한 공부를 좀 더 해보고 와야겠다!
또한, 오늘 리코일 도입관련 논의가 있었다.
과연!!!! 리코일 상태관리 정말 필요한것인가 ????
왜냐면 지금까지의 생각으로는 2개의 페이지만 존재하는데, 각각의 페이지가 공통된 상태를 공유하지 않는다 판단하여 그럼 상태를 공유하는 것이 있다하더라도 뎁스가 깊지않을것같은데, 그냥 props로 하는게 낫지않을까? 라는 논의를하다,
데이터를 주 단위로 변경을 해주고, 그때마다 각각의 컴포넌트의 렌더를 해줘야하는데, 테이블 데이터, 차트 데이터 다 각각의 컴포넌트로 관리를 할것이라 생각되어 결론적으로는 리코일을 도입하기로 하였다.
새로고침이 되었을때마다 데이터를 유지하지 못하지않나? 라는 생각도 했는데, 이부분은 아직 리코일 과 상태관리를 잘 모르는것같아서, 좀더 고민을 해봐야하는 사안같다.