Front-End

[Vue.js] Vuex를 기본으로 구성한 프로젝트에서 URL의 파라미터 값들을 저장 후 필요시 호출하는 방법 ( 이전 페이지 이동시 파라미터값들을 유지하는 방법)

라우터를 사용하여 파라미터 값들을 전달하는 방법은 2가지가 있다. 하나는 params 방식이고 또 하나는 query를 사용하는 방식이다.  메인페이지에서 다른 페이지를 호출하여 페이지 이동이 발생했다고 하자. 이전 페이지로 돌아올 때 메인페이지에서 조회했던 검색 조건들을 유지해서 다시 보여줘야하는데, $router.go(-1)과 같은 윈도우 히스토리 백을 사용중이라면 어떻게 해야 검색조건을 유지할 수 있을까?????

 

라우터(router)를 사용하여 vue.js 프로젝트를 구성하였을 때 

  • 뒤로 돌아가기시 this.$router.go(-1)를 할 경우 라우터를 거치지 않음으로 , this.$route.params 정보를 가져올 수 없다. (undefined)
  • params 방식이 아닌 query 방식으로 전달해도 어쟀든 라우터를 거치지 않음으로 $this.$route.query 정보 역시 가져올 수 없다. 
  • this.$router.push({ name: ‘CompanyDetail’, params: param, query: { searchStr: this.query.searchStr, calltime: moment(new Date()).format(‘YYYYMMDDhhmmss’) } });

 

[해결방법]

페이지 이동하기 전에 vuex 구성 정보에 파라미터와 값 정보를 가지고 있도록 처리해준다.

this.$store.commit(‘setRouteParams’, { routeName: this.$route.name, startDate: this.myQuery.strtDate, searchStr: this.myQuery.searchStr }); 

그리고 라이프 사이클 중에 created()에서 저장해둔 파리미터 정보를 가져와서 대입시켜준다. 

  created() {
    console.log('####lifecycle : created called');
	if (this.$route.params.startDate !== undefined) {
		this.query.startDate = this.$route.params.startDate;
	} else {  
		//router.go()를 할 경우 라우터를 거치지 않음으로 else문을 탄게 된다.
		const routeParams = this.$store.getters.getRouteParams(this.$route.name);
		this.query.startDate = routeParams.startDate;
		this.query.searchStr = routeParams.searchStr;
		console.log(`####routeParams.startDate : ${routeParams.startDate}`);
		console.log(`####routeParams.searchStr : ${routeParams.searchStr}`);
	}
  },

 

Vuex 기본 구성 정보

[index.js]

import Vue from 'vue';
import Vuex from 'vuex';
import state from './state';
import mutations from './mutations';
import getters from './getters';
import actions from './actions';

Vue.use(Vuex);

export default new Vuex.Store({
  state,
  mutations,
  getters,
  actions,
});

[state.js]

export default {
  userMenu: null,
  userId: null,
  
  routeParams: {},
}

[mutations.js]

export default {

  setUserMenu(state, replace) {
    const s = state;
    s.userMenu = replace;
  },
  setUserId(state, replace) {
    const s = state;
    s.userId = replace;
  },
  
  setRouteParams(state, replace) {
    const s = state;
    s.routeParams[replace.routeName] = replace;
  },  
};

[getters.js]

export default {

  getUserMenu: state => state.userMenu,
  getUserId: state => state.userId,
  
  /**
   * Router Parameter($route.params)를 저장하기 위한 객체
   * Router Name이 화면의 키가 되며, Name을 통해 저장된 파라메터 객체를 반환
   * (데이터구조)
   * {
   *    Company: {compId: A1},
   *    CompanyDetail: {compId: A1, contId: C1}
   * }
   */
  getRouteParams(state) {
    const s = state;
    return (routeName) => {
      const retVal = s.routeParams[routeName];
      return retVal;
    };
  },	  
}

[actions.js]

import axios from 'axios';

// Store에 데이터를 저장하기 위해 사용해야 할 경우 actions.js 스크립트를 통해 데이터 Commit
export default {

  // 로그인 후 메뉴 및 사용자정보 조회
  getUserInfo({ commit }, payload) {
    const reqUrl = '/test/getMenuInfo.do';
    return axios.post(reqUrl, '').then((rs) => {
      const clsUserInfo = JSON.parse(rs.data.userInfo);

      commit('setUserId', clsUserInfo.UserId);
      commit('setUserNm', clsUserInfo.UserNm);
    }).catch((err) => {
      //오류 발생 시, 로그인페이지로 이동
      payload.router.push('/login');
      throw new Error(err.message);
    });
  },
};

3일간의 삽질 끝에 해결책을 찾았다. 덕분에 라우터 공부가 많이 되었다.

Leave a Reply

error: Content is protected !!