需求

在学习用vue做项目中,有这样一个需求,在某个页面中有一个分页组件,组件的功能有一个是点击某一数字,需要往url中push参数,但原来url中可能有其他的参数,也有可能没有其他参数,有可能已经有关于页数的参数,也有可能没有,使用$router.push()的形式则会覆盖原有的query,因此开始了我的探索之路(可以直接看最后结论)

step 1 (查找其他方法)

主要试图找到其他方法,可以直接添加新参数或者修改已有参数,绕过需要获取已有参数的坑

很明显失败了,一个是没有找到其他方法,二是$router.push()也没有发现满足我需求的调用方法,因此确定必须要获取原有参数,进行修改或者新增,最后调用$router.push()完成任务

step 2 (确定思路)

经过思考,我觉得代码逻辑应该是这样:

methods: {changePage (num) {var _this = this,oldQuery = _this.$router.currentRoute.query,newQuery = _this.getNewQuery(oldQuery, 'page', num);_this.$router.push({query: newQuery})}getNewQuery (oldQuery, name, val) {var obj = {}, // 这里初始化一定是{}而不是null,否则会出错flag = false;for (key in oldQuery) {if (oldQuery.hasOwnProperty(key)) {if (key === name) {// 这里是修改已有参数obj[key] = val;flag = true;} else {obj[key] = oldQuery[key]}}}// 这里是新增参数if (!flag) {obj[name] = val}return obj;}
}
复制代码

到此已经可以完成任务了

step3 (尝试优化,假如要添加或者修改多个参数)

这样是可以完成任务的,然后我又想了一下,如果是要修改或者是添加多个参数呢,可以把要修改或者添加的放到一个对象中,大概是这样

methods: {changePage (num) {var _this = this,oldQuery = _this.$router.currentRoute.query,obj = {page: num,category: 'all'},newQuery = _this.getNewQuery(oldQuery, obj);_this.$router.push({query: newQuery})}getNewQuery (oldQuery, new) {var obj = {}, // 这里初始化一定是{}而不是null,否则会出错flag = false;obj = ....(这里还没想清楚怎么写)return obj;}
}
复制代码

这时突然发现,这不就是两个对象合并吗,好像有个原生方法可以直接用啊——Object.assign(obj1, obj2),如果能成功的话,那根本不用写个新函数啊(当初我还再想为啥vue-router不提供一个类似我上面实现的函数)

step4 (尝试Object.assign())

因为这里涉及到深浅拷贝的知识,我就顺便又学习了一下深浅拷贝,对象深拷贝的两种方法

methods: {changePage (num) {Object.assign(_this.$router.currentRoute.query, {page: num})}
}
复制代码

讲道理我感觉已经完成任务了,但实际情况是我打开devtool,发现$route.query确实和我想的一样变化,但是url没有变,可能直接修改$route.query参数不管用,必须调用$route.push()方法,因此再作调整(这里究竟为什么直接改query参数不管用,应该是涉及到了vue-router的源码实现,目前这阶段,我就先忽视了。。。):

final

methods: {changePage (num) {var _this = this,obj = JSON.parse(JSON.stringify(_this.$router.currentRoute.query)) // 这里我们需要的应该是值,因此必须转为深拷贝Object.assign(obj, {page: num})_this.$router.push({query: obj})}
}
复制代码

成功!(不忘忘记巩固一下数组、对象各自的深浅拷贝方法啊)

转载于:https://juejin.im/post/5cc407ed6fb9a0321f04219b

vue-router 修改或添加新参数相关推荐

  1. vue elementUI 默认事件 添加额外参数

    vue elementUI 默认事件 添加额外参数 有如下需求,在表格中有多个树形,点击树形获取的节点的事件为 <el-table><el-table-column><t ...

  2. vue router获取整条路径参数

    $route.path 当前路由对象的路径,如'/vi $route.query 请求参数,如/foo?user=1获取到query.user = 1 $route.router 所属路由器以及所属组 ...

  3. 修改Visual Studio中“添加新项”时默认添加的命名空间

    最近要修改一个以前开发的项目,项目中并没有运用Linq,但是我在VS2008中添加新项都会自动添加Linq命名空间,每次都要手动去删除很麻烦,就想想有没有办法可以修改这个"添加新项" ...

  4. Vue Router参数大全

    Vue Router对象创建 Vue Router构建选项详解 参数 类型 默认值 可选值 描述 routes Array 配置路由规则 mode string "hash" (浏 ...

  5. 【Vue】相关生态——Vue Router路由

    Vue Router路由 基本使用 带参数的动态路由匹配 捕获所有路由或404 Not found 路由 嵌套路由 编程式导航 重定向和别名 将props传递给路由组件 不同的历史模式 进阶 导航守卫 ...

  6. 重构ElementUI解决DatePicker日期选择组件修改父组件placement参数问题[Vue.js项目实践: 新冠自检系统]

    新冠疫情自我检测系统网页设计开发文档 Sylvan Ding 的第一个基于 Vue.js 的项目. 本项目所提供的信息,只供参考之用,不保证信息的准确性.有效性.及时性和完整性,更多内容请查看国家卫健 ...

  7. vue router 参数_Vue.js项目开发技术解析

    Vue.js项目开发技术解析 一.Vue.js实例 在一个Vue.js工程中,用于显示内容最基层的实例称之为根实例.通过该实例可以进行页面或组件的更新和显示.对于项目本身而言,无论是什么样的页面,都要 ...

  8. vue 什么是渐进式 响应式 意思。Vue常用的指令。VUE:跨域设置。vue router 新窗口。$router.push。

    Vue  是 轻量的 模型视图视图模型 框架.就是数据的双向开发. 数据驱动+组件化开发. 渐进式框架. 官网:cn.vuejs.org 在读 Vue2.0 文档的时候,介绍"Vue.js( ...

  9. vue 传递 对象 路由_vue 04 -vue路由对象($route)参数简介以及和router的区别

    vue路由对象($route) 在使用了 vue-router 的应用中,路由对象会被注入每个组件中,赋值为 this.$route ,并且当路由切换时,路由对象会被更新. so , 路由对象暴露了以 ...

  10. 【Vue】添加新页面

    在[src\components\]路径下添加新vue文件,例如下图(图省事直接就复制了HelloWorld.vue,修改了一下里面的内容,需要懂html基础即可) 注意修改name 在[src\ro ...

最新文章

  1. C# 获得系统AppData路径
  2. Linux Logwatch 使用说明
  3. python matplotlab.pyplot.grid() 函数
  4. 【GoLang】GoLang 错误处理 -- 异常处理思路示例
  5. JavaScript实现计算需要更改的位数,以便将 numberA转换为 numberB(bitsDiff)算法(附完整源码)
  6. Adobe 中国区 "Adobe RIA 开发工程师认证考试" 正式发布
  7. java 打印 模板_Java输入输出模板
  8. ☆【CodeForces - 764C】Timofey and a tree (思维题,树的性质)
  9. Web Api 中使用 PCM TO WAV 的语音操作
  10. VMware vSAN6.7 设计和优化 vSAN 主机 vSAN 6.5带来七大更新 解读VMware超融合增长秘诀
  11. 计算机系统结构与组成原理
  12. 袋鼠云数智之旅·上海站|探索“十四五”智慧校园新图景
  13. 西北工业大学网络空间安全考研经验分享
  14. 爬虫实用分析工具网址
  15. 【论文泛读171】具有对抗性扰动的自监督对比学习,用于鲁棒的预训练语言模型
  16. Eslint代码规范
  17. excel 2种方法将长日期修改成短日期
  18. python中的正则表达式re模块_Python中的re模块--正则表达式
  19. 有趣的三个水桶等分8升水问题
  20. AB实验只是开始!如何归因才是王道!

热门文章

  1. 涉密计算机多用户审批表,涉密计算机及信息系统安全策略
  2. b站 前端构架_技术干货:哔哩哔哩(B站)功能框架图
  3. ai 数据模型 下载_为什么需要将AI模型像数据一样对待
  4. 机器学习 结构化数据_聊天机器人:根据结构化数据创建自然语言
  5. 例2.11 FatMouse' Trade - 九度教程第21题(贪心算法)
  6. C++string基本概念
  7. Mac效率:配置Alfred web search
  8. maven profile参数动态打入
  9. zabbix(三)—— update
  10. [Unity 3D] Unity 3D 性能优化(二)