nuxt 过滤 query 参数
今天发现了一个线上问题,我们的APP跳转内嵌H5时会默认
query
带一些参数,比如city
之类的,但是有时运营人员配置页面链接地址时在不太了解的情况下,会手动加上city
这些参数,恰巧你请求接口的时候需要这个参数,使用this.$route.query.city
获取,form
提交就会成为下图,会报400参数不规范,
这样重复query
传参数显然是不规范的,这样使用this.$route.query.city
获取回来是一个数组
解决该问题需要两点:
- 根源上配置的时候不要重复配置
- 前端对URL
query
传参进行过滤
那么过滤参数怎样才能一劳永逸呢,避免每次取参数时判断是不是数组这中重复的代码。我们使用nuxt
这中服务端渲染的框架,开始想当然的想到在middleware
中过滤,每次请求过来后执行middleware
,过滤参数
先写个filterQuery
的测试middleware
测试覆盖原来city,跑起来看看效果吧
控制台打印结果没啥问题
在页面里取一下试试,但结果不尽人意,this.$route.query.city
依然是数组多个值
看到这里,才发现自己太想当然了,nuxt
是一套vue ssr
的架构,服务端渲染的项目,**每当一个新路由过来时,都会创建一个新的vue
实例,包括router
, store
,**这样是为了避免交叉请求状态的污染,页面中vue
生命周期里this.$route
是vue
实例上的;改动middleware
的route
只在服务端比如asyncData
或fetch
时获取生效
测试一下 页面中asyncData
获取一下参数
果然这里变了
那现在就是对router
的query
做处理,其实vue-router
为我们提供这样的函数 parseQuery/stringQuery
(提供自定义查询字符串的解析/反解析函数。覆盖默认行为)
nuxt
是对vue
进行了封装,路由生成都是自动通过扫页面路径自动生成的,那我们去nuxt
的源码里探个究竟,生成的核心是一个模板文件,lib/app/router.js
文件,创建新router
实例的工厂函数也在这个文件里
export function createRouter () {return new Router({mode: '<%= router.mode %>',base: '<%= router.base %>',linkActiveClass: '<%= router.linkActiveClass %>',linkExactActiveClass: '<%= router.linkExactActiveClass %>',scrollBehavior,routes: [
<%= _routes %>],<% if (router.parseQuery) { %>parseQuery: <%= serialize(router.parseQuery).replace('parseQuery(', 'function(') %>,<% } %><% if (router.stringifyQuery) { %>stringifyQuery: <%= serialize(router.stringifyQuery).replace('stringifyQuery(', 'function(') %>,<% } %>fallback: <%= router.fallback %>})
}
复制代码
在这里找到了需要的parseQuery
函数,这里的router.parseQuery
是在 lib/common/options.js
中配置的
router: {mode: 'history',base: '/',routes: [],middleware: [],linkActiveClass: 'nuxt-link-active',linkExactActiveClass: 'nuxt-link-exact-active',extendRoutes: null,scrollBehavior: null,parseQuery: false,stringifyQuery: false,fallback: false},
复制代码
无论本地启动还是nuxt build
的时候这个options.js
都会与根目录下的nuxt.config.js
配置项进行合并,所以也就一目了然了,加到nuxt.config.js
的router
下就好了,明确了就开干试试吧
nuxt.config.js
加了如下代码
parseQuery: function (querystring) {let d = function (str) {try {return str && window.decodeURIComponent(str)} catch (e) {return str}}if (d(querystring).includes('?')) querystring = d(querystring).replace(/\?/g, '&')querystring = querystring.split('&')let params = {}let pair// march and parsefor (let i = querystring.length - 1; i >= 0; i--) {pair = querystring[i].split('=')params[d(pair[0])] = d(pair[1])}return params}
复制代码
不仅对重复的key过滤,也对url
混入多个?
做了合并过滤 结果就是 this.$router.query.city
进行了过滤,这里默认取第一个值
~本文完,有任何表述不清或者表达错误的,请大家指正~
转载于:https://juejin.im/post/5bae00116fb9a05d2469cb73
nuxt 过滤 query 参数相关推荐
- oracle exp导出表where,oracle EXP导出一张表时使用query参数指定where条件
oracle exp 导出一个表的部分内容,使用query参数可加上SQL的where条件进行过滤 注意:如果需要使用到日期字符串格式等单引号,需要使用双引号将where条件括起来,而且双引号要用\做 ...
- exp/expdp中query参数的使用
之前一直无法搞清楚exp/expdp中关于query参数的正确写法,每次都是零散的印象,这次特意把这个记录成日志以方便以后查看.关于query参数的写法请参看以下两个例子: 1.使用命令行: ...
- oracle Expdp带条件,Oracle 11g expdp中query参数的使用
Oracle 11g expdp中提供了query参数,可以在需要按条件导出表中部分数据时使用,它的使用就像是在select语句中的where条件使用一样. 数据库版本 linuxidc@ORCL&g ...
- 路由的query参数
文章目录 Message组件发送query参数 Detail组件接收query参数 本例基于 路由的基本使用.嵌套路由的实现. 项目目录如下: 一般组件components/Banner.vue &l ...
- oracle11 exp query,EXP的QUERY参数
QUERY 默认:none 当导出模式为表模式时,此参数可以选择这些表中的子集.query参数的相当于在select语句中增加了where条件.此条件应用于tables参数中的所有表.需要注意的是,q ...
- FastApi路径参数Query参数及参数类型
前面讲述了FastApi的搭建与运行,这篇来讲下FastApi的路径参数与查询参数. 路径参数 可以使用与Python格式字符串相同的语法来声明路径参数 from fastapi import Fas ...
- oracle 导出数据expdp的query参数用法
今天收到了一个数据同步的需求,具体信息是将原oracle数据库的几张表的部分数据同步到另外一台oracle数据库.完成这个需求使用的是oracle的expdp导出工具.因为是导出表的部分数据,因此用到 ...
- Vue路由params、query参数丢失解决
在vue中路由传参有两种形式:1.params:2.query 解决办法:sessionStorage或者localStorage 两者的区别:localStorage是永久保存不清除一直存在,ses ...
- 强大的PHP防SQL注入类,可以过滤敏感参数
这是一个考虑比较全面的php和sql结合的防注入程序,在php方便主要对get,post,cooke,files进行了过滤,在sql中我们就对delete,update一些查询命令进行检测过滤. SQ ...
最新文章
- 使用unix工具监控cpu、内存等系统资源占用率
- 分享一个超棒的响应式幻灯jQuery插件 - refineslide
- java mkfifo_在Java中创建命名管道
- ue的xml格式转换_VCARD格式
- 1、MyEclipse插件配置以及通过MyEclipse生成表对应的JPA代码
- 【对象程序设计面向】虚继承
- mysql 1556_mysql导入时Error Code: 1556 - You can't use locks with log tables.
- rabbitmq topic 收不到数据_RabbitMQ和Kafka到底怎么选?
- 封装直传阿里云存储文件上传控件
- 16.通过实现“函数一个返回值出口,返回两个返回值”。来了解指针与普通地址的区别...
- phpexcel 导出到xls文件的时候出现乱码解决
- msvcr100.dll不存在
- mybatis小结(1)
- (什么是 RPC?) AND(什么是域名?)AND (DMA是什么?)AND(IRQ是什么?) 选择自 ycool1984 的 Blog
- Vulkan 教程(1)开篇
- toLatin1 toLocal8Bit
- icp经营许可证怎么办?
- XDOJ综合题 数字统计排序
- 中兴换头;任正非表态中美差距还有 50 年;Google 回应隐私丑闻 | CSDN 极客头条...
- JAVA数字大写金额转换