npm install @reduxjs/toolkit react-redux
입력하여 설치store.js
파일을 생성한다.store.js
파일에 다음 코드 입력import { configureStore } from '@reduxjs/toolkit';
export default configureStore({
reducer: {
}
})
index.js
에서 다음과 같이 Provider로 감싼다....
import { Provider } from "react-redux";
import store from './store.js';
...
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<React.StrictMode>
<Provider store={store}>
<BrowserRouter>
<App />
</BrowserRouter>
</Provider>
</React.StrictMode>
);
Redux를 쓰는 이유
createSlice({
name: 'state이름 ~~',
initialState: '값'
})
store.js
최종import { configureStore, createSlice } from "@reduxjs/toolkit";
// useState랑 비슷한 용도
let user = createSlice({
name: "user",
initialState: "kim",
});
let stocks = createSlice({
name: 'stocks',
initialState: [10, 11, 12]
})
export default configureStore({
reducer: {
user: user.reducer,
stocks: stocks.reducer
},
});
Cart.js
에서 써보도록 하겠다....
import { useSelector } from "react-redux";
...
function Cart() {
let state = useSelector((state) => {return state});
let temp_user = useSelector((state) => {return state.user});
let temp_stocks = useSelector((state) => state.stocks);
console.log(state);
console.log(state.user);
console.log(state.stocks);
console.log(temp_user);
console.log(temp_stocks);
return (
<div>
<Table>
<thead>
<tr>
<th>#</th>
<th>{temp_user}</th>
<th>수량</th>
<th>변경하기</th>
...
Cart.js
import { Table } from "react-bootstrap";
import { useSelector } from "react-redux";
function Cart() {
// let state = useSelector((state) => {return state});
// let temp_user = useSelector((state) => {return state.user});
let cartItems = useSelector((state) => state.cartItems);
console.log(cartItems);
return (
<div>
<Table>
<thead>
<tr>
<th>#</th>
<th>상품명</th>
<th>수량</th>
<th>변경하기</th>
</tr>
</thead>
<tbody>
<Item></Item>
</tbody>
</Table>
</div>
);
}
function Item(props) {
let cartItems = useSelector((state) => state.cartItems);
return (
<>
{cartItems.map(function(element, index) {
return (
<tr>
<td>{index + 1}</td>
<td>{element.name}</td>
<td>{element.count}</td>
<td>안녕</td>
</tr>
);
})}
</>
);
}
export default Cart;
store.js
import { configureStore, createSlice } from "@reduxjs/toolkit";
// useState랑 비슷한 용도
let user = createSlice({
name: "user",
initialState: "kim",
});
let temp = [
{ id: 0, name: "White and Black", count: 2 },
{ id: 2, name: "Grey Yordan", count: 1 },
];
let cartItems = createSlice({
name: "cartItems",
initialState: temp,
});
export default configureStore({
reducer: {
user: user.reducer,
cartItems: cartItems.reducer,
},
});
let user = createSlice({
name: "user",
initialState: "kim",
reducers: {
// state를 수정하는 함수(setState와 유사)
changeName(state) {
return `john ${state}`;
},
function2(state) {
return;
}
}
});
...
export let { changeName, function2 } = user.actions;
...
user.actions는 user의 reducers이다.
import { useDispatch, useSelector } from "react-redux";
import { changeName } from "../store";
...
function Item() {
let cartItems = useSelector((state) => state.cartItems);
let dispatch = useDispatch();
...
<button onClick={() => {
dispatch(changeName());
}}>+</button>
</tr>
);
})}
</>
);
}
...
useDispatch는 store.js에 요청을 보내주는 함수이다.
let user = createSlice({
name: "user",
initialState: {name: "kim", age: 20},
reducers: {
changeName(state) {
return {name: "park", age: 20}
// 다음과 같이 작성해도 됨.
// state.name = "park";
}
}
})
state.name = "park"으로 써도 immer.js의 도움을 받아 state를 변경할 수 있다.
array로 가능하다.
let user = createSlice({
name: "user",
initialState: {name: "kim", age: 20},
reducers: {
changeName(state) {
// return {name: "park", age: 20}
state.name = "park";
},
changeAge(state) {
state.age += 1;
}
}
})
let user = createSlice({
name: "user",
initialState: {name: "kim", age: 20},
reducers: {
changeName(state) {
// return {name: "park", age: 20}
state.name = "park";
},
changeAge(state, x) {
state.age += x.payload;
}
}
})
store.js
import user from './store/userSlice.js'
src/store/userSlice.js
import { createSlice } from '@reduxjs/toolkit';
let user = createSlice({
name: "user",
initialState: {name: "kim", age: 20},
reducers: {
changeName(state) {
// return {name: "park", age: 20}
state.name = "park";
},
changeAge(state, action) {
state.age += action.payload;
}
}
})
export let { changeName, changeAge } = user.actions;
export default user;
위와 같이 옮겼으면, 경로 수정을 잊으면 안된다.
주의!!
export let { increaseCount } = cartItems.actions;
위와 같이 1개의 변경 함수를 export 한다고 하더라도 {}로 감싸줘야 한다.
function component() {
if (true) {
return <div>I'm true</div>;
}
return <div>I'm false</div>;
}
function component2() {
let temp = true;
return (
<div>
{temp === false ? <div></div> : <div></div>}
</div>
)
}
다음과 같이 중첩도 가능하다. 하지만 가독성이 좋지 않아 지양하는 것이 좋다.
function component2() {
let temp = false;
let temp2 = true;
return (
<div>
{temp === true ? (
<div>temp = true</div>
) : temp2 === true ? (
<div>temp2 = true</div>
) : (
<div>temp = false, temp2 = false</div>
)}
</div>
);
}
function component3() {
let temp = true;
let temp2 = false;
return (
<div>
{temp === true && <div>temp = true</div>}
{temp2 === true && <div>false가 연산에 끼어 있으면 null이 반환된다.</div>}
</div>
)
}
function component4() {
let user = 'seller';
switch (user) {
case 'seller':
return <h4>판매자 로그인</h4>
case 'customer':
return <h4>구매자 로그인</h4>
default:
return <h4>그냥 로그인</h4>
}
}
const tabUI = {
info: <div>상품정보</div>,
shipping: <div>배송관련</div>,
refund: <div>환불약관</div>
}
function component5() {
let [state, setState] = useState('info');
return (
<div>
{tabUI[state]}
</div>
)
}