반응형
Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- bit
- DP
- BinaryTree
- map
- node.js
- array
- priority_queue
- queue
- event
- 비트연산
- component
- state
- count
- JSX
- leetcode
- route
- React
- MySQL
- nodeJS
- treenode
- Context
- axios
- Navigation
- UE5
- Callback
- c++
- routes
- css
- server
- Props
Archives
- Today
- Total
우사미 코딩
[React] context(2) 본문
반응형
예전에 App.js에 CRUD function만들었던걸 모두 context에 옮길거임

- books.js (context)
import { createContext, useCallback, useState } from 'react';
import axios from 'axios';
const BooksContext = createContext();
function Provider({ children }) {
const [books, setBooks] = useState([]);
const fetchBooks = useCallback(async () => {
const response = await axios.get('http://localhost:3001/books');
setBooks(response.data);
}, []);
const editBookById = async (id, newTitle) => {
const response = await axios.put(`http://localhost:3001/books/${id}`, {
title: newTitle,
});
const updatedBooks = books.map((book) => {
if (book.id === id) {
return { ...book, ...response.data };
}
return book;
});
setBooks(updatedBooks);
};
const deleteBookById = async (id) => {
await axios.delete(`http://localhost:3001/books/${id}`);
const updatedBooks = books.filter((book) => {
return book.id !== id;
});
setBooks(updatedBooks);
};
const createBook = async (title) => {
const response = await axios.post('http://localhost:3001/books', {
title,
});
const updatedBooks = [...books, response.data];
setBooks(updatedBooks);
};
const valueToShare = {
books,
deleteBookById,
editBookById,
createBook,
fetchBooks
// stableFetchBooks
};
return (
<BooksContext.Provider value={valueToShare}>
{children}
</BooksContext.Provider>
);
}
export { Provider };
export default BooksContext;
근데 context쓸 때 마다
import useContext하고, import BooksContext하고..
const {books } = useContext(BooksContext); 어쩌구 하면 자꾸 같은 작업 반복인데?
싶을때 hook 사용한다
- use-books-context.js (hook, document root에 hook이라는 폴더 만들고 새로 생성한 파일)
import { useContext } from "react";
import BooksContext from "../context/books";
function useBooksContext(){
return useContext(BooksContext);
}
export default useBooksContext;
- App.js
import { useEffect, useContext } from 'react';
import BookCreate from './components/BookCreate';
import BookList from './components/BookList';
import BooksContext from './context/books';
function App() {
const { fetchBooks } = useContext(BooksContext);
useEffect(() => {
fetchBooks();
}, [fetchBooks]);
return (
<div className="app">
<h1>Reading List</h1>
<BookList />
<BookCreate />
</div>
);
}
export default App;
App이 아주 깰꼼하졌따
사실 위 코드에는 useCallback도 사용했는데
useCallback은 첫번째 인자로 기본값을 넣고 두번째 인자로 empty array를 넣으면 딱 한 번만 실행하고 실행하지 않겠다는 뜻이다 (useEffect와 비슷하다)
useCallback은 앞으로 잘 사용할지 모르겠어서 따로 포스팅 안함
반응형
'React' 카테고리의 다른 글
| [React] extraReducer (0) | 2023.07.05 |
|---|---|
| [React] reducer (0) | 2023.07.02 |
| [React] context (0) | 2023.06.27 |
| [React] useEffect (0) | 2023.06.26 |
| [React] json-server 적용하기 (REST client, api.http) (0) | 2023.06.26 |
Comments