Issue
- BO 미리보기 페이지와 운영 중인 페이지를 보여주는 컴포넌트가 각각 다르고, 거의 대부분이 중복된 코드로 되어있습니다.
- api 데이터가 정상적으로 받아졌는지 확인 후, 컴포넌트에 데이터를 삽입하는 로직이 모든 컴포넌트에 중복됩니다.
const itemList = ref([]);
const getQuickMenuList = () => dispatch('api/getQuickMenuList');
const getData = async () => {
const res = await getQuickMenuList();
if (res.status === 200) {
itemList.value = res.data;
}
await nextTick();
!!swiperCase.value && new Swiper('.ern-hom-quick .swiper-container', swiperCase.value);
};
getData();
Trouble Shooting
Before: 중복 코드
const itemList = ref([]);
const getQuickMenuList = () => dispatch('api/getQuickMenuList');
const getData = async () => {
const res = await getQuickMenuList();
if (res.status === 200) {
itemList.value = res.data;
}
await nextTick();
!!swiperCase.value && new Swiper('.swiper-container', swiperCase.value);
};
getData();
After: useData 커스텀 훅
const getQuickMenuList = () => dispatch('api/getQuickMenuList');
const { itemList, getData } = useData(getQuickMenuList, () => {
!!swiperCase.value && new Swiper('.swiper-container', swiperCase.value);
});
route query is_preview로 BO 미리보기/운영 분기를 훅 내부에서 처리
- 라우트의 query를 통해 bo 미리보기 페이지 여부를 확인합니다.
- 중복되는 로직을 커스텀 훅에 구현합니다.
- 데이터 수신 및 렌더링 이후 실행할 로직은 커스텀 훅에 콜백함수로 삽입할 수 있도록 구현합니다.
const getQuickMenuList = () => dispatch('api/getQuickMenuList');
const { itemList, getData } = useData(getQuickMenuList, () => {
!!swiperCase.value && new Swiper('.ern-hom-quick .swiper-container', swiperCase.value);
});
import { nextTick, ref } from 'vue';
import { useRoute } from 'vue-router';
const useData = (getApiData: () => Promise<any>, callback: () => void) => {
const { is_preview } = useRoute().query;
const itemList = ref([]);
const getData = async () => {
// bo 미리보기
if (is_preview === 'Y') {
window.addEventListener('message', async (e) => {
itemList.value = e.data;
await nextTick();
callback();
});
return;
}
// 운영 데이터
const res = await getApiData();
if (res.status === 200) {
itemList.value = res.data;
}
await nextTick();
callback();
};
return { itemList, getData };
};
export default useData;