React
React์ ๋ํด์ ๊ณต๋ถํ ๋ด์ฉ์ ์ ๋ฆฌํ๊ณ ์์ต๋๋ค.
โ let vs var
letํค์๋๋ varํค์๋์ ๋ค๋ฅด๊ฒ ์ค๋ณต์ ์ธ์ ํ์ฉํ์ง ์๋๋ค
โ jsx
react์์๋ js๋์ jsx๋ผ๋ ๊ฒ์ ์ด๋ค.
jsx๋ return๋ฌธ ์์์ ์ฌ์ฉํ๋ค.
jsx์์์ js ํํ์์ ์์ฑํ๋ ค๋ฉด {}๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
์ด๋ {}์์์๋ if๋ฌธ๊ณผ for๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค. (
๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ
์ค๊ดํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ
href, id, className, src๋ฑ ์ฌ๋ฌ html ์์ฑ๋ค์๋ ๊ฐ๋ฅ
function App() {
let data='red'
return (
<div className="App">
<div>{red}</div>
</div>
);
}
style์์ฑ
<div style={ {color:'red', fontSize:'30px' } }>๊ธ์จ</div>
- {์์ฑ๋ช :'์์ฑ๊ฐ'} ์ฆ ๊ฐ์ฒด ํํ๋ก style์ ์ค
- ์์ฑ๋ช ์ '-'(๋์ฌ)๊ธฐํธ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- ์นด๋ฉ ํ๊ธฐ๋ฒ์ผ๋ก ์์ฑ(font-size๊ฐ ์๋ fontSize)
jsx์์๋ if๋ฌธ์ ์ธ ์ ์๋ค.
์ผํญ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋,
์ธ๋ถ์์ ์ฌ์ฉํ๊ฑฐ๋,
and์ฐ์ฐ์(&&)๋ฅผ ์ฌ์ฉํ๊ฑฐ๋,
์ฆ์์คํํจ์(()=>{})๋ฅผ ์ฌ์ฉ
์ผํญ ์ฐ์ฐ์๋ ์ฐ๋ฌ์์ ์ฌ์ฉํ ์ ์๋ค
{
state == 0? <div>๋ด์ฉ0</div> : null
state == 1? <div>๋ด์ฉ1</div> : null
}
์ ์ฝ๋์ ๊ฐ์ด ์ผํญ ์ฐ์ฐ์๋ ์ฐ๋ฌ์์ ์ฌ์ฉํ ์ ์๋ค.
{
state == 0? <div>๋ด์ฉ0</div> : null
}
{
state == 1? <div>๋ด์ฉ1</div> : null
}
๋ค์๊ณผ ๊ฐ์ด ์ค๊ดํธ๋ฅผ ์๋ก ๋ง๋ค์ด์ค์ผ ํ๋ค!
for ๋ฐ๋ณต๋ฌธ ๋์ map() ์ ์ฌ์ฉ
function App (){
return (
<div>
{
['song','min','cheol'].map(function(a,i){
return ( <div key={i}>{a}</div> )
})
}
</div>
)
}
return๋ฌธ์ ์ฝ๋ฐฑํจ์์ ๋ฃ์ด์ฃผ๋ฉด, arry๋ก ๋ฐํํ์ฌ ์ค๋ค.[<div>song</div>, <div>min</div>, <div>cheol</div>]
์ด ๋ฐํ๋๊ณ , html๋ก ๋์ฐ๋ฉด <div>song</div>
, <div>min</div>
, <div>cheol</div>
์ด 3๊ฐ ์์ฑ๋๋ค.
map ์ฝ๋ฐฑํจ์์ ๋งค๊ฐ๋ณ์ (a,i)
- a: array์์ content
- i: ๋ฐ๋ณต๋ฌธ์ด ๋๋๋ง๋ค 0๋ถํฐ 1์ฉ ์ฆ๊ฐํ๋ ์ ์
โ state๋ณ๊ฒฝํจ์๋ ์ฝ๊ฐ ๋ฆ๊ฒ์ฒ๋ฆฌ ๋๋ค
์ ๋ฌธ์ฉ์ด๋ก asyncํ๊ฒ (๋น๋๊ธฐ์ ์ผ๋ก) ์ฒ๋ฆฌ๋๋ค.
โ public ํด๋
๋ฆฌ์กํธ๋ก ๊ฐ๋ฐ์ ๋๋ด๋ฉด build ์์
์ด๋ผ๋๊ฑธ ํจ( ์ง๊ธ๊น์ง ์งฐ๋ ์ฝ๋๋ฅผ ํ ํ์ผ๋ก ์์ถํด์ฃผ๋ ์์
)
src ํด๋์ ์๋ ์ฝ๋์ ํ์ผ์ ๋ค ์์ถ์ด ๋๋๋ฐ public ํด๋์ ์๋ ๊ฒ๋ค์ ๊ทธ๋๋ก ๋ณด์กดํด์ค๋ค.
๋ฐ๋ผ์ ์ด๋ฏธ์ง,txt,json๋ฑ static ํ์ผ์ ๊ฒฝ์ฐ public ํด๋์ ๋ณด๊ดํด๋ ๋๋ค.
publicํด๋ ์ด๋ฏธ์ง ์ฌ์ฉ
<img src="/logo192.png" />
importํ ํ์์์ด ๊ทธ๋ฅ /์ด๋ฏธ์ง๊ฒฝ๋ก ํ๋ฉด๋๋ค.
React์์ ๊ถ์ฅ๋๋ ๋ฐฉ์
<img src={process.env.PUBLIC_URL + '/logo192.png'} />
๋ฐฐํฌํ ๋ mincheolsong.com/์ด์ฉ๊ตฌ/ ๊ณผ ๊ฐ์ ๊ฒฝ๋ก์ ๋ฐฐํฌํ๋ฉด /logo192.png ํ์ผ์ ์ฐพ์ ์ ์๋ค๊ณ ๋์ฌ์๋ ์๋ค.
๋ฐ๋ผ์ /์ด์ฉ๊ตฌ/๋ฅผ ๋ปํ๋ process.env.PUBLIC_URL์ ์ถ๊ฐํด์ฃผ๋ชฌ ๋๋ค.
โ js๋ณ์๋ฅผ img src์ ๋ฃ๋ ๋ฐฉ๋ฒ
<img src={'https://codingapple1.github.io/shop/shoes' + (i + 1) + '.jpg'} width="80%" />
{}๋ก ๊ฐ์ธ์ค์ผ ํ๋ค.
โ react-router-dom
ํ์ด์ง๋ฅผ ๋๋ ์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๋ฆฌ์กํธ์์๋ ๋ค๋ฅธ ํ์ด์ง๋ฅผ ์์ฒญํ๋ฉด ๋ค๋ฅธ html์ ํธ์ถํ๋ ๊ฒ์ด ์๋, ํ๋์ html์์์ ๋ด๋ถ์ ์๋ <div>
๋ฅผ ๊ฐ์์น์ ๋ณด์ฌ์ค๋ค.
์ ํ
index.js ์์ <App/>
์ <BrowserRouter> </BrowserRouter>
๋ก ๊ฐ์ธ์ฃผ๋ฉด ๋๋ค.
import { BrowserRouter } from "react-router-dom";
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<BrowserRouter>
<App />
</BrowserRouter>
</React.StrictMode>
);
<Routes />
์ <Route>
import {Routes, Route} from 'react-router-dom'
function App(){
return(
(์๋ต)
<Routes>
<Route path='/' elements={<div>ํ์ด์ง</div>}/>
<Route path='/detail' elemtns={<div>์์ธํ์ด์ง</div>}/>
</Routes>
)
}
<Routes>
ํ๊ทธ๋ก <Route>
ํ๊ทธ๋ค์ ๊ฐ์ธ์ค๋ค.<Route>
ํ๊ทธ์์ ์ ์๊ฒฝ๋ก์ธ path
์, ์ ์ํ๋ฉด ๋ณด์ฌ์ค ํ์ด์ง๋ฅผ elements
์ ์ ์ํ๋ค.
!404 ํ์ด์ง
<Route / >
ํ๊ทธ ์ ์ผ ๋ฐ์ path='*'
์ธ <Route />
๋ฅผ ์ถ๊ฐํ๋ฉด ๋๋ค.
<Route path='*' elements={<div>404ํ์ด์ง</div>}>
์ค์ ํ์ง ์์ path๋ก ์ ์ ์, ์ค์ ํ 404ํ์ด์ง๊ฐ ๋จ๊ฒ๋๋ค.
<Link />
vs useNavigate()
<Link />
<Route>
์์ ์ค์ ํ ๊ฒฝ๋ก๋ก ์ด๋ํ๋ ๋งํฌ๋ฅผ ๋ง๋ค์ด์ค๋ค.
<Link to="/">ํ</Link>
<Link to="/detail">์์ธํ์ด์ง</Link>
useNavigate()
<Link />
์ ๋ง์ฐฌ๊ฐ์ง๋ก ํ์ด์ง ์ด๋๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค
import {Routes, Route, Link, useNavigate} from 'react-router-dom'
function App(){
let navigate = useNavigate()
return (
(์๋ต)
<button onClick={()=>{ navigate('/detail') }}>์ด๋๋ฒํผ</button>
)
}
- navigate(-1) : ๋ค๋ก 1๋ฒ ๊ฐ๊ธฐ
- navigate(2) : ์์ผ๋ก 2๋ฒ ๊ฐ๊ธฐ
์๋ธ๊ฒฝ๋ก : nested routes
<Route>
์์ <Route>
๋ฅผ ๋ฃ์ ์ ์๋๋ฐ, ์ด๊ฑธ nested routes๋ผ๊ณ ํ๋ค.
์ด๋ ๊ฒํ๋ฉด ์๋ธ๊ฒฝ๋ก๋ฅผ ๋ง๋ค ์ ์๋ค.
<Route path="/about" element={ <About/> } >
<Route path="member" element={ <div>๋ฉค๋ฒ๋ค</div> } />
<Route path="location" element={ <div>ํ์ฌ์์น</div> } />
</Route>
๊ทธ๋ฆฌ๊ณ <About />
์์ ํ์ ํ๊ทธ๋ค์ ์ด๋ ๋ณด์ฌ์ค์ง ์ค์
import {Route, Routes, Outlet} from 'react-router-dom'
function About(){
return (
<div>
<h4>aboutํ์ด์ง์</h4>
<Outlet></Outlet>
</div>
)
}
<Outlet> </Outlet>
์ ์ฌ์ฉํด์ ํ์ <Route>
๋ค์ด ๋ณด์ฌ์ง๋ ์์น๋ฅผ ์ง์ ํด์ค์ผ ํ๋ค.
- /about/member๋ก ์ ์์
<About>
&<div>๋ฉค๋ฒ๋ค</div>
์ ๋ณด์ฌ์ค - /about/location์ผ๋ก ์ ์์
<About>
&<div>ํ์ฌ์์น</div>
์ ๋ณด์ฌ์ค
useParams()
<Route path="/detail/:id" element={<Detail shoes={shoes}/>}/>
import {useParams} from 'react-router-dom'
function Detail(props) {
let {id} = useParams();
let detail_shoes=props.shoes.find((e)=>e.id==id);
}
path์์ ์ค์ ํ /detail/:id ์ :id๋ฅผ, Detail์ปดํฌ๋ํธ์์ useParams์ ์ฌ์ฉํ์ฌ ์ป์ด์ฌ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ js์ find๋ฅผ ์ฌ์ฉํ์ฌ shoes๊ฐ์ฒด์ id๊ฐ๊ณผ, /detail์ ํตํด ๋๊ฒจ์ค :id๊ฐ์ด ์ผ์นํ๋ ๊ฐ์ฒด๋ฅผ ์ฐพ์ ์ ์๋ค.
arrow function์์ return๊ณผ {}๋ ๋์์ ์๋ต๊ฐ๋ฅ
โ styled-components
import styled from 'styled-components';
let YelloBtn = styled.div`
padding : 10px;
background : yellow;
color : black;
`
styled-components๋ cssํ์ผ์ด jsํ์ผ๋ค์ ์ค์ผ์ํค๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
์ผ๋ฐ css๋ ์ปดํฌ๋ํธ๋ช .module.css ์ ๊ฐ์ด ์๋ช ํ์ฌ ์ค์ผ๋ฐฉ์ง๊ฐ ๊ฐ๋ฅํ๋ค.
props๋ฌธ๋ฒ์ ์ฌ์ฉํ์ฌ ์ฌํ์ฉ์ด ๊ฐ๋ฅํ๋ค
import styled from 'styled-components';
let Btn = styled.div`
background : ${ props => props.bg };
color : ${ props => props.bg=='blue' ? 'white' : 'black'};
padding : 10px;
`
function Detail(){
return(
<div>
<Btn bg="orange">์ค๋ ์ง์ ๋ฒํผ</Btn>
<Btn bg="blue">ํ๋์ ๋ฒํผ</Btn>
</div>
)
}
<Btn>
์ props๋ก ์์์ ์ ๋ฌํ์ฌ ๋ง๋ค์ด๋์ styled-components๋ฅผ ์ฌํ์ฉ ํ ์ ์๋ค.
๊ฐ๋จํ js ๋ฌธ๋ฒ๋ ์์ฑํ์ฌ ๋ฐฐ๊ฒฝ์ด ํ๋์์ด๋ฉด ๊ธ์๋ฅผ ํฐ์์ผ๋ก, ์๋๋ผ๋ฉด ๊ธ์๋ฅผ ๊ฒ์์์ผ๋ก ๋ฐ๊ฟ ์๋ ์๋ค.
โ Lifecycle
์ปดํฌ๋ํธ๋
- ์์ฑ์ด ๋ ์๋ ์๊ณ (mount)
- ์ฌ๋ ๋๋ง์ด ๋ ์๋ ์๊ณ (update)
- ์ญ์ ๊ฐ ๋ ์๋ ์๋ค.(unmount)
์ด๋ฌํ Lifecycle์ useEffect
๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ ์ฅ์ฐฉ์, ์
๋ฐ์ดํธ์, ์ ๊ฑฐ์ ์ฝ๋๋ฅผ ์คํํ ์ ์๋ค. (=Lifecycle hook)
useEffect
- js๋ ์์์ ๋ถํฐ ์๋๋ก ์คํ๋๋๋ฐ useEffect ์์ ์ ์ ์ฝ๋๋ ๋๋๋ง์ด ๋ค ๋๊ณ ๋์ ์คํ์ด ๋๋ค!
- for๋ฐ๋ณต๋ฌธ์ useEffect ๋ฐ์ ์ ์ด๋์ผ๋ฉด ๋ฐ์ return๋๋ html์ for ๋ฐ๋ณต๋ฌธ์ด ๋ค ์คํ๋๊ณ ๋์ ๋๋๋ง ๋๋ค.
- ์ด๋ฌํ for๋ฐ๋ณต๋ฌธ์ useEffect์์ ๋ฃ์ด๋๊ฒ ๋๋ฉด, ๋๋๋ง์ด ๋ค๋๋๊ณ ๋ ํ ์คํ์ด๋๋ค. => ์ข ๋ ํจ์จ์ !
html์ ๋จผ์ ๋ณด์ฌ์ฃผ๊ณ ์ด๋ ค์ด ์์ ์ ํ๊ธฐ ๋๋ฌธ์! - ๋ฐ๋ผ์ ์๊ฐ์ด ์ค๋๊ฑธ๋ฆฌ๋ ์์ ( ๋ฐ๋ณต์ฐ์ฐ, ์๋ฒ์์ ๋ฐ์ดํฐ๊ฐ์ ธ์ค๋ ์์ , ํ์ด๋จธ)๊ฐ์ ๊ฒฝ์ฐ์๋ useEffect์์ ๋ฃ์ด์ฃผ๋ ๊ฒ์ด ์ข์ ๊ด์ต์ด๋ค!
clean up function
useEffect ๋์ํ๊ธฐ ์ ์ ํน์ ์ฝ๋๋ฅผ ์คํํ๊ณ ์ถ์ผ๋ฉด
return ()=>{}์์ ๋ฃ์ผ๋ฉด ๋๋ค.
useEffect(()=>{
๊ทธ ๋ค์์ ์คํ๋จ
return ()=>{
์ฌ๊ธฐ์๋๊ฒ ๋จผ์ ์คํ๋จ
}
})
clean up function์๋ ํ์ด๋จธ์ ๊ฑฐ, socket ์ฐ๊ฒฐ์์ฒญ์ ๊ฑฐ, ajax์์ฒญ ์ค๋จ ์ด๋ฐ ์ฝ๋๋ฅผ ๋ง์ด ์์ฑํ๋ค.
์ปดํฌ๋ํธ unmount์์๋ clean up function์ด 1ํ ์คํ๋๋ค.
useEffect(()=>{
์คํํ ์ฝ๋
})
์ปดํฌ๋ํธ mount, update ๋ง๋ค ์ฝ๋๊ฐ ์คํ๋๋ค.
useEffect(()=>{
์คํํ ์ฝ๋
},[])
mount์์๋ง ์คํ๋๋ค.
useEffect(()=>{
return()=>{
์คํํ ์ฝ๋
}
})
useEffect ์์ ์ฝ๋ ์คํ ์ ์ ํญ์ ์คํ
useEffect(()=>{
return ()=>{
์คํํ ์ฝ๋
}
},[])
unmount์ 1ํ ์คํ
useEffect(()=>{
console.log('effect');
console.log(name);
return ()=>{
console.log('cleanup');
console.log(name);
}
},[])
- ์ธ๋ง์ดํธ ๋ ๋๋ง cleanup ํจ์๋ฅผ ์คํํ๊ณ ์ถ์ผ๋ฉด ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก ๋น ๋ฐฐ์ด์ ๋ฃ๋๋ค
- ํน์ ๊ฐ์ด ์ ๋ฐ์ดํธ ๋๊ธฐ ์ง์ ์ cleanup ํจ์๋ฅผ ์คํํ๊ณ ์ถ์ผ๋ฉด ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ ๋ฐฐ์ด์ ๊ฒ์ฌํ๊ณ ์ถ์ ๊ฐ์ ๋ฃ์ด์ค๋ค.
โ AJAX
์๋ฒ์ GET, POST ์์ฒญ์ ํ ๋ ์๋ก๊ณ ์นจ ์์ด ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๊ฒ ๋์์ฃผ๋ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฅ์ AJAX๋ผ๊ณ ํ๋ค.
axios๋ฅผ ์ฌ์ฉํ์ฌ AJAX๋ก GET/POST ์์ฒญ์ ํ ์ ์๋ค.
<Button onClick={()=>{
axios.get('https://codingapple1.github.io/shop/data2.json')
.then((res)=>{
if(shoes.length<6){
let tmp=[...shoes,...res.data];
setShoes(tmp);
}
})
.catch(()=>{
console.log('์คํจ')
})
}}>๋๋ณด๊ธฐ</Button>
๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ res.data ์์ ๋ค์ด์๋ค.
โ automatic batch
๋ฆฌ์กํธ 18๋ฒ์ ์ด์๋ถํฐ๋ automatic batch๋ผ๋ ๊ธฐ๋ฅ์ด ์๊ฒผ๋๋ฐ,
state ๋ณ๊ฒฝํจ์๋ค์ด ์ฐ๋ฌ์์ ์ฌ๋ฌ๊ฐ ์ฒ๋ฆฌ๋ ๋ state ๋ณ๊ฒฝํจ์๋ฅผ ๋ค ์ฒ๋ฆฌํ๊ณ ๋ง์ง๋ง์ ํ ๋ฒ๋ง ์ฌ๋ ๋๋ง์ด ๋๋ ํ์์ ๋งํ๋ค.
์ด๋ฅผ ํผํ๊ธฐ ์ํด์ setTimeoutํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
function TabContent({ํญ}){
let [fade, setFade] = useState('')
useEffect(()=>{
setTImeout(()=>{ setFade('end') }, 100)
return ()=>{
setFade('')
}
}, [ํญ])
return (
<div className={'start ' + fade}>
{ [<div>๋ด์ฉ0</div>, <div>๋ด์ฉ1</div>, <div>๋ด์ฉ2</div>][ํญ] }
</div>
)
}
โ Redux
Redux๋ props ์์ด state๋ฅผ ๊ณต์ ํ ์ ์๊ฒ ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
Redux ์ ํ
1.store.js ํ์ผ ๋ง๋ค๊ธฐ
import { configureStore } from '@reduxjs/toolkit'
export default configureStore({
reducer: { }
})
store.js ํ์ผ์ด state๋ฅผ ๋ณด๊ดํ๋ ํ์ผ์ด ๋๋ค.
2.index.js ํ์ผ์ ๊ฐ์ ์ค์ ํ๊ธฐ
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>
);
Provider์ store์ importํ ํ <Provider store={importํด์จ๊ฑฐ}>
๋ก <App />
์ ๊ฐ์ธ๋ฉด ๋๋ค.
Redux store์ state ๋ณด๊ด
1.createSlice({})useState
์ ์ญํ ์ ํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค. state ํ๋๋ฅผ slice๋ผ๊ณ ๋ถ๋ฆ!
import {configureStore, createSlice} from '@reduxjs/toolkit'
createSlice({
name : 'state์ด๋ฆ',
initialState : '๊ฐ'
})
export default configureStore({
reducer: { }
})
2.createSlice๋ก ๋ง๋ slice๋ฅผ configureStore์ ๋ฑ๋ก
import {configureStore, createSlice} from '@reduxjs/toolkit'
let user = createSlice({
name : 'user',
initialState : 'kim'
})
export default configureStore({
reducer: {
์๋ช
: user.reducer,
}
})
createSlice๋ก ๋ง๋ slice๋ฅผ ๋ณ์์ ์ ์ฅํ๊ณ , configureSlice์ ๋ฑ๋กํ๋ฉด ๋๋ค.
์ด๋ slice๋ณ์ ๋ค์ .reducer
๋ฅผ ๊ผญ ๋ถ์ฌ์ค์ผ ํ๋ค.
Redux store์ ์ ์ฅํ state ๊ฐ์ ธ๋ค ์ฐ๋ ๋ฐฉ๋ฒ
useSelector
๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
import { useSelector } from 'react-redux';
function Cart() {
let user = useSelector((state)=>{return state.์๋ช
})
.
.
.
}
์ด์ user ๋ณ์์ ์ ์ฅ๋ ๊ฐ์ ์ฌ์ฉํ ์ ์๋ค!!
์ปดํฌ๋ํธ๊ฐ ๊ณต์ ๊ฐ ํ์์์ผ๋ฉด ๊ทธ๋ฅ useState() ์ฌ์ฉํด๋ ๋๋ค
Redux store์ state ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ
1.store.js ์์ state๋ฅผ ์์ ํด์ฃผ๋ ํจ์๋ฅผ ๋ง๋ ๋ค
let user=createSlice({
name : 'user',
initialState : 'kim',
reducers : {
changeName(state){
return 'john' + state
}
}
})
slice์์ reducers :{} ๋ฅผ ๋ง๋ค๊ณ ๊ฑฐ๊ธฐ์์ ์์ ํจ์๋ฅผ ๋ง๋ค๋ฉด ๋๋ค.
2.์์ ํจ์๋ฅผ exportํ๋ค.
export let {changeName} = user.actions
- ์์ ํจ์ ์ฌ์ฉ์ ์ํ๋ ๊ณณ์์ importํ์ฌ ์ฌ์ฉํ๋ค
import {userDispatch, useSelector} from "react-redux"
import {changeName} from './../store.js'
let dispatch = useDispatch();
(์๋ต)
<button onClick={()=>{
dispatch(changeName())
}}>๋ฒํผ</button>
1)state๋ณ๊ฒฝ ํจ์๋ฅผ import
2)useDispatch๋ฅผ ์ด์ฉํ์ฌ dispatch ๋ณ์๋ฅผ ๋ง๋ฌ
3)dispatch(state๋ณ๊ฒฝํจ์()) ์ด๋ ๊ฒ ๊ฐ์ธ์ ์คํ
object/arrayํ state๋ณ๊ฒฝ
array/object ์๋ฃ์ ๊ฒฝ์ฐ state ๋ณ๊ฒฝ์ state๋ฅผ ์ง์ ์์ ํด๋ฒ๋ ค๋ ์ ๋จ
let user=createSlice({
name:'user',
initialState : {name : 'kim', age : 20},
reducers : {
changeName(state){
state.name='park'
}
}
})
state๋ณ๊ฒฝ ํจ์์ ํ๋ผ๋ฏธํฐ
let user = createSlice({
name:'user',
initialState : {name : 'kim', age : 20}}),
reducers : {
increase(state,a){
state.age += a.payload
}
}
increase(10) : +10 ์คํ
increase(100) : +100 ์คํ