조건문, map 함수는 return에서 빼고 함수 혹은 다른 파일로 빼서 분리해주는 것이 좋다.
fontawesome 등 현업에서 디자이너와 기획자가 svg, jpg, png 등을 제공하기 때문에 거의 사용하지 않는다.
컴포넌트에 넘기는 Props 인자는 최대 2개, 그 이상은 구조에 문제가 있을 수 있음 => 그것을 줄이는 방안에 대해 고민해볼 것
라이브러리를 이용해서 만들 수 있는 기능은 우선 그 기능 없이 순수하게 날것으로 구현을 몇 번 해보고 로직을 이해한 다음 사용하자
아키텍쳐에 관한 부분은 view에 집중하는 React 자체가 이미 state와 props로 고안된 것이기 때문에 별도로 분류하기 보다는 폴더 구조와 컴포넌트 분리를 잘 해주면 된다. ( Atomic Design Pattern 정도 추가 )
Server State를 관리하는 라이브러리
$ npm i react-query # installing with npm
$ yarn add react-query # installing with yarn
// App.jsx
import { QueryClient, QueryClientProvider } from 'react-query';
import Post from './Post';
const queryClient = new QueryClient();
function App() {
return (
<QueryClientProvider client={queryClient}>
<div className='app'>
<Post />
</div>
</QueryClientProvider>
);
}
export default App;
import { useQuery } from 'react-query';
function Post () {
const fetchFunc = () => {
return axios.get('https://something:port/pageName');
};
// case 1. Destructuring X
const responseData = useQuery(queryKey, fetchFunc, [,options]);
// case 2. Destructuring O
const { data, isLoading, isFetching, isError, error } = ueQuery(queryKey, fetchFunc, [,options]);
if(isLoading) {
return <span>Loading</span>;
}
if(isError) {
return <span>{error.message}</span> //Request failed with status code 404
}
return (
// ...
);
}
export default Post;
useQueries
를 이용한다.const results = useQueries([
{
queryKey: ['comments'],
queryFn: () => fetchComments();
},
{
queryKey: ['fruits'],
queryFn: () => fetchFruits();
}
]);
import { useMutation } from 'react-query';
function App() {
const mutation = useMutation(newTodo => {
return axios.post('/todos', newTodo)
})
return (
<div>
{mutation.isLoading ? (
'Adding todo...'
) : (
<>
{mutation.isError ? (
<div>An error occurred: {mutation.error.message}</div>
) : null}
{mutation.isSuccess ? <div>Todo added!</div> : null}
<button
onClick={() => {
mutation.mutate({ id: new Date(), title: 'Do Laundry' })
}}
>
Create Todo
</button>
</>
)}
</div>
)
}