美文网首页
(vue) keep-alive下在同一个路由下更改url

(vue) keep-alive下在同一个路由下更改url

作者: 小七是外号 | 来源:发表于2022-04-13 13:33 被阅读0次

背景:

有一个容器页面,里面有两个组件,根据容器中的data中某个值showPage可以切换展示A组件页面/B组件页面,现在想要实现根据当前页面入口url中的参数识别默认展示的是A组件页面还是B组件页面

目标

完成背景中的需求需要达到两个目标,A/B相互跳转时

  1. url值有更改
  2. 页面展示有更改

解决问题的方法思路分析

1. 在query中增加参数识别,在切换A/B组件页面展示时,获取query并更改
const query=JSON.parse(JSON.stringify(this.$route.query))
delete query.showPage
this.$router.push({ path: this.$route.path, query })

有文章说用IsBinding有效,试了下,在keep-alive的时候还是没有生效

const query=JSON.parse(JSON.stringify(this.$route.query))
delete query.showPage
query.IsBinding=true
this.$router.push({ path: this.$route.path, query })

存在的问题:query中的参数会一直在url中无法去除,因为$route是只读模式,对象部分是他监管不到的

2. 在params里增加参数

存在的问题:入口的URL都得改,适合搭建页面初期,不适合后面的维护改造

3. watch监听路由
watch: {
    '$route.query.showPage': function(newVal, oldVal){
        console.log(newVal, oldVal);
    }
}

存在的问题:watch只能在离开页面时才能取到oldVal的值,如果非要以此方法处理就必须要在vuex里面保存这个值,下次再进行判断,处理比较繁琐

4. deactivated 及 activated 配合判断

存在问题:deactivated获取不到this.$route.query的值

5. 给router-view设置key为路由的完整路径
<keep-alive :include="cacheList">
    <router-view :key="$route.fullPath"></router-view>
</keep-alive>

存在问题:未生效,url仍旧未更新

6. 更改href配合data中的控制页面展示的值showPage (最终采用)

容器中的this.showPage控制页面展示A/B
更改href中的参数,再使用location.replace改变url

存在问题,更改href中的参数或者去掉其中某一个参数需要考虑情况比较多,?和&在前在后,前后是否还有其他参数。以下代码采取的方式是把url中的参数全部取出来放对象中,更改或者去除我们药改的参数,最后冲新拼接

/**
* 获取当前 URL 所有 GET 查询参数
* 入参:要解析的 URL,不传则默认为当前 URL
* 返回:一个<key, value>参数对象
*/
// 注意,在路由#/后面的?a=1&b=2使用location.search拿不到,html后直接拼接的?a=1&b=2才可以使用location.search拿
function getUrlQueryParams(url = location.search){
    const params = {};
    const keys = url.match(/([^?&]+)(?==)/g);
    const values = url.match(/(?<==)([^&]*)/g);
    for(const index in keys){
        params[keys[index]] =  values[index];
    }
    return params;
}
 /**
* 传入对象返回url参数
* @param {Object} data {a:1}
 * @returns {string}
 */
function  getParam(data){
     let url = '';
     for(var k in data){
         let value = data[k] !==undefined ? data[k] : '';
         url += `&${k}=${encodeURIComponent(value)}`
     }
     return url ? url.substring(1) : ''
}

// 
let urlArray = location.href.split('?')
let urlParams = getUrlQueryParams(urlArray[1])
delete urlParams.showPage
location.replace(urlArray[0] + getParam(urlParams))

相关文章

  • (vue) keep-alive下在同一个路由下更改url

    背景: 有一个容器页面,里面有两个组件,根据容器中的data中某个值showPage可以切换展示A组件页面/B组件...

  • Vue-Router的hash 和 history 模式

    在vue的路由配置中有mode选项,最直观的区别就是: hash 模式下在url中带了一 # 。 而 histor...

  • vue路由

    vue路由--- SPA应用,单页面应用vue-resouce 交互vue-router 路由根据不同url地址...

  • Vue路由

    Vue路由 什么是Vue路由? 后端路由:即请求的URL地址都对应后端的接口,请求URL响应对应的服务器的资源。 ...

  • axios减少重复请求数据 keep-alive

    Vue路由开启keep-alive时的注意点:https://blog.csdn.net/qq_32786873/...

  • v.2.16 header 渐隐渐显效果

    Vue路由开启keep-alive时的注意点:https://blog.csdn.net/qq_32786873/...

  • 与Vue.js的第九天

    今天学习了路由 路由 路由 路由vue-router是vue的核心组件根据不同的url访问不同页面配合单页面使用 ...

  • 使用vue-cli工具开发

    使用单文件组件开发todolist App.vue ListItem.vue 路由Router 路由是根据url的...

  • keep-alive使用场景

    Vue中keep-alive的深入理解与使用(配合router-view缓存整个路由页面)在搭建 vue 项目时,...

  • 路由

    路由(vue-router)是vue的工具库 vue.js路由允许我们通过不同的URL访问不同的页面 Vue.js...

网友评论

      本文标题:(vue) keep-alive下在同一个路由下更改url

      本文链接:https://www.haomeiwen.com/subject/ifaosrtx.html