fetchAPI와 historyAPI를 연동해 페이지 리스트를 클릭 할 시 해당 페이지의 데이터를 불러와 편집 화면에 내용이 그려주는 기능을 구현했다.
크게 페이지 목록을 보여주는 섹션과 페이지를 편집하는 섹션으로 나뉜다.
흐름을 정리해보려고 한다.
// pageList 컴포넌트
$pageList.addEventListener('click', e => {
const { target } = e;
const { className } = target;
const $pageBlock = target.closest('.page_block');
const { pageid } = $pageBlock.dataset;
if (className === 'block_name') {
push(`/pages/${pageid}`);
// historyAPI 실행 후, route처리까지 해주는 함수
}
});
// app 컴포넌트
this.route = async () => {
const { pathname } = window.location;
if (pathname === '/') { // 메인 화면
editFrame.setState({
...this.state,
id: 'new',
});
} else if (pathname.indexOf('/pages/') === 0) {
const [, , pageId] = pathname.split('/'); // 기존 페이지들
editFrame.setState({
...editFrame.state,
id: pageId,
});
}
};
//
전 페이지(id)와 현 페이지(id)를 비교해서 그려줄 내용을 정한다
// EditFrame 컴포넌트
this.setState = async nextState => {
if (this.state.id !== nextState.id) { // 전 id와 새로 들어온 id가 다르다면
this.state = nextState; // 새로 들어온 id로 현 상태를 업데이트한다 *이후의 과정들은 현 상태만을 이용할 것이기 때문
if (this.state.id === 'new') { // new인 경우 공백으로 그림
this.state = {
...this.state,
title: '',
content: '',
};
editor.setState(this.state);
} else { // new가 아닌 경우
fetchPage(); // 현재 id로 해당 데이터를 불러온 후 this.state에 업데이트 한다. 그 후 this.setState 다시 호출
// 이 경우 전 후id가 같게 같아지게 되어 현재 state의 내용(받아온 데이터)으로 화면이 그려지게 된다.
}
return; //
}
this.state = nextState; // 수정된 새로운 내용 담아서 바꾸기
editor.setState( // 실제 화면을 그려주는 함수
this.state || {
// 가져온 데이터가 없다면 빈 텍스트
title: '',
content: '',
},
);
};
// **일단 자기 상태를 업데이트 시키고 나서(필요한 데이터들로 채우고 나서 자식을 변화시켜줘야 함)
이 프로젝트의 가장 어려운 logic중 하나인 것 같다.
url이름을 통해 data를 불러와야하는데 페이지 이동의 모든 경우를 생각해서 처리해야하는게 너무 복잡하고 어려웠다.
데이터를 불러오는 과정을 명확하게 인지하려고 애썼다.
구현하고 난 후 글로 과정을 하나하나 써보니까 머리 속이 더 잘 정리되는 것 같다.
프로젝트 일지를 쓰는 것이 단지 기록으로 남기는 목적 뿐이라 생각했는데
깨달은 내용을 정리하면서 더 잘 습득할 수 있게 해주는 효과가 있다는 것을 알았다. 이전에는 프로젝트 일지를 잘 쓰지 않았다. 앞으로의 프로젝트를 하면서도 빼먹지 않고 쓰려고 한다.