Vue-Router를 사용하여 Vue에서 URL 쿼리 매개 변수를 설정하는 방법


114

입력 필드를 변경할 때 Vue-router를 사용 하여 쿼리 매개 변수를 설정하려고합니다. 다른 페이지로 이동하고 싶지는 않지만 동일한 페이지에서 URL 쿼리 매개 변수를 수정하고 싶습니다.

this.$router.replace({ query: { q1: "q1" } })

그러나 이것은 또한 페이지를 새로 고치고 y 위치를 0으로 설정합니다. 즉, 페이지의 맨 위로 스크롤됩니다. 이것이 URL 쿼리 매개 변수를 설정하는 올바른 방법입니까 아니면 더 나은 방법이 있습니까?


편집 :

내 라우터 코드는 다음과 같습니다.

export default new Router({
  mode: 'history',
  scrollBehavior: (to, from, savedPosition)  => {
    if (to.hash) {
      return {selector: to.hash}
    } else {
      return {x: 0, y: 0}
    }
  },
  routes: [
    ....... 
    { path: '/user/:id', component: UserView },
  ]
})

답변:


132

다음은 문서의 예입니다.

// with query, resulting in /register?plan=private
router.push({ path: 'register', query: { plan: 'private' }})

참조 : https://router.vuejs.org/en/essentials/navigation.html

해당 문서에서 언급했듯이 다음 router.replace과 같이 작동합니다.router.push

따라서 문제의 샘플 코드에 올바르게 포함되어있는 것 같습니다. 그러나 라우터가 탐색 할 경로를 갖도록 name또는 path매개 변수도 포함해야 할 수도 있습니다 . 없이 name또는 path, 그것은 매우 의미있는 보이지 않는다.

이것은 현재 나의 이해입니다.

  • query 라우터의 경우 선택 사항입니다. 뷰를 구성하는 구성 요소에 대한 몇 가지 추가 정보
  • name또는 path필수-에 표시 할 구성 요소를 결정합니다 <router-view>.

샘플 코드에서 누락 된 것일 수 있습니다.

편집 : 주석 후 추가 세부 정보

이 경우 명명 된 경로 를 사용해 보셨습니까 ? 동적 경로가 있으며 매개 변수와 쿼리를 별도로 제공하는 것이 더 쉽습니다.

routes: [
    { name: 'user-view', path: '/user/:id', component: UserView },
    // other routes
]

그리고 당신의 방법에서 :

this.$router.replace({ name: "user-view", params: {id:"123"}, query: {q1: "q1"} })

기술적으로 위와 사이에는 차이가 없지만 this.$router.replace({path: "/user/123", query:{q1: "q1"}})경로 문자열을 구성하는 것보다 명명 된 경로에 동적 매개 변수를 제공하는 것이 더 쉽습니다. 그러나 두 경우 모두 쿼리 매개 변수를 고려해야합니다. 두 경우 모두 쿼리 매개 변수가 처리되는 방식에서 잘못된 점을 찾을 수 없습니다.

경로 내부에있는 후에는 동적 매개 변수를로 가져오고 this.$route.params.id쿼리 매개 변수를 this.$route.query.q1.


나는 또한 경로를 제공하려고 시도했지만 이것은 페이지 상단으로 스크롤하는 것을 멈추지 않았으며 라우터 옵션으로 질문을 편집했으며 거기에 필요한 변경이있을 수 있습니다.
— Saurabh

쿼리 매개 변수가 문서의 올바른 위치로 스크롤하기위한 것입니까? 앵커 태그 에 대한 다른 질문처럼 ?
— Mani

아니요, URL에 쿼리 매개 변수를 추가하고 싶습니다. 여기에서는 스크롤을 원하지 않습니다.
— Saurabh

방금 로컬 설정에서 옵션을 테스트했는데 쿼리 매개 변수가 정상적으로 작동합니다. 업데이트 된 답변에 표시된대로 새 경로로 이동하고 쿼리 매개 변수에 액세스 할 수 있습니다. 그래서 문제는 스크롤을 원하지 않습니까? 아니면 전체 앱이 다시 새로 고쳐지는 문제입니까?
— Mani

그래서 같은 페이지에 있는데요, 입력을 선택하면 URL에 추가하고 싶은데 입력하면 스크롤이 발생합니다. 스크롤은 저에게 문제입니다. 다른 페이지로 이동하지 않고 같은 페이지에 있고 URL 쿼리 매개 변수를 겉보기에 추가 / 수정하고 싶습니다.
— Saurabh

15

페이지를 다시로드 하거나 DOM을 새로 고치지 않고도history.pushState 작업을 수행 할 수 있습니다.
구성 요소 또는 다른 곳에이 메서드를 추가하여 수행합니다.

addParamsToLocation(params) {
  history.pushState(
    {},
    null,
    this.$route.path +
      '?' +
      Object.keys(params)
        .map(key => {
          return (
            encodeURIComponent(key) + '=' + encodeURIComponent(params[key])
          )
        })
        .join('&')
  )
}

따라서 구성 요소의 어느 곳에서나 addParamsToLocation({foo: 'bar'})window.history 스택의 쿼리 매개 변수를 사용하여 현재 위치를 푸시하도록 호출하십시오 .

새 기록 항목 을 푸시하지 않고 현재 위치에 쿼리 매개 변수를 추가하려면 history.replaceState대신을 사용하십시오.

Vue 2.6.10 및 Nuxt 2.8.1로 테스트되었습니다.

이 방법에주의하십시오!
Vue Router는 URL이 변경되었음을 알지 못하므로 pushState 이후에 URL을 반영하지 않습니다.



4
this.$router.push({ query: Object.assign(this.$route.query, { new: 'param' }) })

1
이 답변이 가장 마음에 들었습니다. 불행히도 이로 인해Error: Avoided redundant navigation to current location
— Max Coplan

수정 :this.$router.push({ query: Object.assign({...this.$route.query}, { new: 'param' }) })
— Max Coplan

2
그러나 나는 그것에 대해 생각 지금 당신은 할 수this.$router.push({ query: {...this.$route.query,new: 'param'},) })
— 최대 코플란

3

일부 매개 변수는 유지하고 다른 매개 변수는 변경하려는 경우 vue 라우터 쿼리의 상태를 복사하고 재사용하지 마십시오.

참조되지 않은 사본을 만들기 때문에 작동합니다.

  const query = Object.assign({}, this.$route.query);
  query.page = page;
  query.limit = rowsPerPage;
  await this.$router.push({ query });

아래에서 Vue Router는 동일한 쿼리를 재사용하고 NavigationDuplicated오류가 발생 한다고 생각하게됩니다 .

  const query = this.$route.query;
  query.page = page;
  query.limit = rowsPerPage;
  await this.$router.push({ query });

물론 다음과 같이 쿼리 개체를 분해 할 수 있지만 페이지에 대한 모든 쿼리 매개 변수를 알고 있어야합니다. 그렇지 않으면 결과 탐색에서 매개 변수가 손실 될 위험이 있습니다.

  const { page, limit, ...otherParams } = this.$route.query;
  await this.$router.push(Object.assign({
    page: page,
    limit: rowsPerPage
  }, otherParams));
);

위의 예는에 대한 것이지만 이것도 push()함께 작동합니다 replace().

vue-router 3.1.6으로 테스트되었습니다.


3

여러 쿼리 매개 변수를 추가하는 경우 이것이 저에게 효과적이었습니다 (여기 https://forum.vuejs.org/t/vue-router-programmatically-append-to-querystring/3655/5 ).

위의 대답은 가깝습니다 ... Object.assign을 사용하면 this. $ route.query가 변경되지만 원하는 작업이 아닙니다 ... Object.assign을 수행 할 때 첫 번째 인수가 {}인지 확인하십시오.

this.$router.push({ query: Object.assign({}, this.$route.query, { newKey: 'newValue' }) });

2

한 번에 여러 쿼리 매개 변수를 설정 / 제거하려면 글로벌 믹스 인 ( thisvue 구성 요소를 가리킴)의 일부로 아래 메서드를 사용했습니다 .

    setQuery(query){
        let obj = Object.assign({}, this.$route.query);

        Object.keys(query).forEach(key => {
            let value = query[key];
            if(value){
                obj[key] = value
            } else {
                delete obj[key]
            }
        })
        this.$router.replace({
            ...this.$router.currentRoute,
            query: obj
        })
    },

    removeQuery(queryNameArray){
        let obj = {}
        queryNameArray.forEach(key => {
            obj[key] = null
        })
        this.setQuery(obj)
    },

1

나는 일반적으로 이것을 위해 히스토리 객체를 사용합니다. 또한 페이지를 다시로드하지 않습니다.

예:

history.pushState({}, '', 
                `/pagepath/path?query=${this.myQueryParam}`);

0

다음은 페이지를 새로 고치지 않고 URL의 쿼리 매개 변수를 업데이트하는 간단한 솔루션입니다. 사용 사례에 맞는지 확인하십시오.

const query = { ...this.$route.query, someParam: 'some-value' };
this.$router.replace({ query });
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.