vue router.replace 根据输入对象的组装方式表现不同

vue router.replace acts differently based on how input object is assembled

我在使用 Vue 路由器时遇到了一些奇怪的行为,路由器的行为会根据其输入对象的组装方式而有所不同。下面的代码示例是组件 'methods' 属性 的一个例外。有关详细信息,请参阅我的代码示例中的注释。

switchLocale(newLocale) {
                // this solution works
                const route = {
                    name: this.$route.name,
                    query: {locale: newLocale},
                    params: this.$route.params,
                };
                console.log(JSON.stringify(route));
                // {"name":"v.support.help","query":{"locale":"en"},"params":{}}
                this.$router.replace(route);

                // this solution does not change the route. I would expect it to work exactly like the solution above
                /*
                const {name, query, params} = this.$route;
                let route = {name, query, params};
                route.query.locale = newLocale;
                console.log(JSON.stringify(route));
                // {"name":"v.support.help","query":{"locale":"en"},"params":{}}
                this.$router.replace(route);
                */
            }

什么会导致这种情况发生?

在您的第二个代码中,您直接改变 this.$route.query 对象并将其传递给 this.$router.replace。我猜 vue-router 将无法检测到查询是否已更改,因为您改变了 vue-router 的内部状态。

不要改变 this.$route 对象(或与此相关的任何 Vue 内部状态),否则事情可能无法正常工作。

如果您想在引入或更改另一个查询参数的同时保留现有的查询参数,那么您可以这样做:

this.$router.replace({
  query: Object.assign({}, this.$route.query, { locale: newLocale }),
  // No need to specify route name and params, they will be preserved
});