์ด์ ์ ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ToDo-List๋ฅผ ๊ฐ๋จํ๊ฒ ๊ตฌํํ ์ ์ด ์์๋ค. ๊ทธ๋๋ ๋ฉ๋ชจ์ฅ์ ์ถ๊ฐํ๊ณ , ์ญ์ ํ ์ ์๋ ๊ธฐ๋ฅ๊น์ง๋ง ๊ตฌํ์ ํ์๋๋ฐ, ๋ฆฌ๋์ค๋ก ๋ง๋ค์ด๋ณผ๊น? ํ๋ ์๊ฐ์ด ๋ค์๋ค. ๊ฒฐ๋ก ์ ... ์ ๋ง ๊ฐ๋จํ๊ฒ ๊ตฌํํ ์ ์์ ์ค ์์์ง๋ง ์๊ฐ๋ณด๋ค ๋ ๋ณต์กํ๋ค๋ ๊ฒ. ๊ทธ๋์ ํท๊ฐ๋ฆฌ๊ณ ์ด๋ ค์ ๋ ๋ถ๋ถ ์์ฃผ๋ก ๊ธ์ ์์ฑํด๋ณด๋ ค๊ณ ํ๋ค.
<div id="subject"></div>
<div id="toc"></div>
<div id="control"></div>
<div id="content"></div>
์ด๋ ๊ฒ id ๊ฐ
์ ์ฃผ๊ณ ์ด๋ค์ ํจ์ ์์ document.querySelector์ ํตํด ๋ฃ์ด์ค ๊ฒ์ด๋ค.
๐reducer์ store์ ์์ฑํ๊ธฐ ์ํด ๋ง๋ ํจ์์ด๋ค.
function reducer(state,action){
if(state===undefined){
// 1.HTML, 2.CSS ๊ธ๋ชฉ๋ก์ ๋ฃ์ด์ค ๊ฒ.
return{
max_id:2 ,
selcted_id:2,
mode:'welcome',
contents:[
{id:1, title:"HTML", desc:"HTML is ..."},
{id:2, title:"CSS", desc:"CSS is ..."}
]
}
}
id , title, desc
์ content๋ผ๋ ๋ฐฐ์ด์ ๋ด์์ฃผ์๊ณ mode : 'welcome'
์ผ๋ก ์ง์ ํ์ฌ ์ด๋ฅผ ์ด๊ธฐ๊ฐ์ผ๋ก ์ค์ ํ๋ค. ๐TOC ํจ์ ๋ถ๋ถ์ ๊ธ ๋ชฉ๋ก์ด ๋ํ๋๋ ๋ถ๋ถ์ด๋ค.
let state= store.getState();
let i= 0;
let liTags='';
while(i<state.contents.length){
liTags= liTags+ `
<li>
<a onclick='
event.preventDefault();
let action = {type:'SELECT', id:${state.contents[i].id}}
store.dispatch(action);
' href="${state.contents[i].id}">${state.contents[i].title}</a>
</li>
`;
i+=1;
}
document.querySelector('#toc').innerHTML=
`
<nav>
<ol>${liTags}</ol>
</nav>
`;
}
liTags
๋ ๋น ๋ฌธ์์ด๋ก ์ ์ธํ ๋ค, ๋ฐ๋ณต๋ฌธ์ ํตํด ๋ฐ๋ณตํ๋ฉด์ 1.HTML , 2.CSS ์ฒ๋ผ ๊ธ ๋ชฉ๋ก์ด ๋ํ๋ ์ ์๋๋ก ํด์ฃผ์๋ค. ๊ธ ๋ชฉ๋ก์ ๊ฐ๊ฐ ๋งํฌ๋ก ์ฐ๊ฒฐ๋์ด ์์ด์ ๋งํฌ๋ฅผ ํด๋ฆญํ๋ฉด 404๊ฐ ๋ฌ๋ค. ์ด๋ฅผ ๋ฐฉ์งํด์ฃผ๊ธฐ ์ํ์ฌ onClick
์ด๋ฒคํธ์ event.preventDefault( )๊ฐ์ ์ฃผ์๋ค.
๊ธ ๋ชฉ๋ก์ ๋๋ฅด๋ฉด title์ด ๋ค๋ฅด๊ฒ ๋ํ๋์ผ ํ๋ค. ๊ทธ๋์ action
์ type: 'SELECT', id:id:${state.contents[i].id}
๋ฅผ ์ค์ ํ๋ค. ๐ id๊ฐ ๊ธ์ ๋ฒํธ์ด๋ค.
action ๊ฐ์ store.dispatch(action);
๋ก ์ ๋ฌ๋์ด reducer์๊ฒ ๊ฐ์ผํด์ ์ด ๊ตฌ๋ฌธ์ ์์ฑํ๋ค.
๐ control์ ๊ธ์ ์์ฑ, ์ญ์ ํ ์ ์๋ ๊ธฐ๋ฅ์ ๋ด์ ๋ถ๋ถ์ด๋ค.
function control(){
document.querySelector('#control').innerHTML = `
<ul>
<li><a href="/create">create</a></li>
<li><input type="button" value="delete"></li>
</ul>
`;
}
create
์ delete
๋ ๋ฐ๋ก action์ ๋ณ์๋ก ์ ์ธํ์ฌ ๋ด์ง ์๊ณ , ๋ฐ๋ก dispatch์๊ฒ ์ ๋ฌํด์ฃผ๋ ๋ฐฉ์์ผ๋ก ํ๋ค.๐ค ์ create๋ a ํ๊ทธ๋ฅผ ์ฌ์ฉํ๊ณ , delete๋ button์ผ๋ก ํ์๊น?
๐
delete
๋ a href ๋ฅผ ์ฌ์ฉํ๋ฉด, ์๋ํ๋ ํ๋ก๊ทธ๋จ์ ์ํด ์ญ์ ๊ธฐ๋ฅ์ ์คํํ ์ ์๊ธฐ ๋๋ฌธ์ button์ผ๋ก ๊ตฌํํ๋ค.
๐ create, read, welcome ๋ชจ๋
๋ฅผ ๋ด์ ํจ์์ด๋ค.
create ๋ชจ๋
๋ control ํจ์์์ create๋ฅผ ๋๋ ์ ๋ ๊ธ์ ์์ฑํ ์ ์๋ ๋ถ๋ถ์ด ๋ํ๋๋ค. read ๋ชจ๋
๋ TOC ํจ์์์ ๊ธ ๋ชฉ๋ก์ ํด๋ฆญ ํ์ ๋ ์๋ ์ฌ์ง๊ณผ ๊ฐ์ด ํ๋จ์์ ๋ฌธ๊ตฌ๋ฅผ ๋ณด์ฌ์ค๋ค. welcome ๋ชจ๋
๋ delete action์ด ์คํ๋ ๋ ์๋ ์ฌ์ง๊ณผ ๊ฐ์ด ํ๋จ์์ ๋ฌธ๊ตฌ๋ฅผ ๋ณด์ฌ์ค๋ค.function article(){
let state = store.getState();
if(state.mode === 'create'){
document.querySelector('#content').innerHTML = `
<article>
<form>
<p>
<input type="text" name="title" placeholder="title">
</p>
<p>
<textarea name="desc" placeholder="description"></textarea>
</p>
<p>
<input type="submit">
</p>
</form>
</article>
`
} else if(state.mode === 'read'){
let i = 0;
let aTitle, aDesc;
while(i < state.contents.length){
if(state.contents[i].id === state.selcted_id) {
aTitle = state.contents[i].title;
aDesc = state.contents[i].desc;
break;
}
i = i + 1;
}
document.querySelector('#content').innerHTML = `
<article>
<h2>${aTitle}</h2>
${aDesc}
</article>
`
} else if(state.mode === 'welcome'){
document.querySelector('#content').innerHTML = `
<article>
<h2>Welcome</h2>
Hello, Redux!!!
</article>
`
}
}
read๋ชจ๋
์์ if(state.contents[i].id === state.selcted_id)
๋ถ๋ถ์ ๋ด๊ฐ ๊ณ ๋ฅธ ๊ธ ๋ชฉ๋ก์ ๋ฒํธ(state.selcted_id
)์ด state.contents์ ์๋ id
์ ๊ฐ๊ณผ ๋์ผํ์ง ํ์ธํ๋ค๋ ์๋ฏธ์ด๋ค. ๐ ๊ธฐ์กด์ state๋ฅผ ๋ณ๊ฒฝ์์ผ return ํ๋ ๊ฒ์ด ์๋ state ๊ฐ์ ๋ณต์ ํ์ฌ ๊ฐ์ ๋ณ๊ฒฝ์ํจ ๊ฒ์ return ํ๋ ๊ฒ์ด๋ค.
let newState;
// SELECT๋ 1.HTML์ฒ๋ผ ๊ธ ๋ชฉ๋ก ๋ถ๋ถ
if(action.type === 'SELECT'){
newState = Object.assign({}, state,
{selcted_id:action.id, mode:'read'});
}
else if(action.type === 'CREATE'){
let newMaxId = state.max_id + 1;
let newContents = state.contents.concat();
newContents.push({id:newMaxId, title:action.title, desc:action.desc});
newState = Object.assign({}, state, {
max_id:newMaxId,
contents:newContents,
mode:'read'
})
}
else if(action.type === 'DELETE'){
let newContents = [];
let i = 0;
while(i < state.contents.length){
if(state.selcted_id !== state.contents[i].id){
newContents.push(
state.contents[i]
);
}
i = i + 1;
}
newState = Object.assign({},state, {
contents:newContents,
mode:'welcome'
})
} else if(action.type === 'CHANGE_MODE'){
newState = Object.assign({}, state, {
mode:action.mode
});
}
console.log(action, state, newState);
return newState;
mode:action.mode
์ CHANGE_MODE์ผ ๋ mode๊ฐ create
์ด๋ฏ๋ก article์ create
๋ถ๋ถ์ ๊ฐ๋ฅดํจ๋ค.