当前位置: 首页 > Web前端 > vue.js

vue使用路由使用query,params导航栏的变化和axios发起请求时携带的参数以及后端稍微解析时得到的参数

时间:2023-03-31 21:26:09 vue.js

1.vue路由携带的参数,params和queryparams:/router1/:id,/router1/123,/router1/789这里的id叫paramsquery:/router1?id=123,/router1?id=456这里的id叫query。通常配置的路由的index.js,如果是详情页,那么一般的路由变化只需要改变一个id,然后这个id会向后台发起网络请求,请求不同详情的数据。例1:Index.js配置动态路由,使用params:比如我要写一个国内各个学校的详情页,那么我要配置一个动态路由:{path:'/schoolDetail/:id',name:'SchoolDetail',component:schoolDetail,meta:{title:'SchoolDetail'}},我们只看上面的路径,后面的冒号表示id是一个变量,可以响应式改变,符合vue的特点。当我们使用语法跳转到路由时(此时直接在地址中加上你要跳转的id变量,就是params方式跳转):this.$router.push({path:'/testDetail/'+id)浏览器是这样的:后面一大串数字就是id号。示例2:index.js不需要配置动态路由,而是使用query方式实现动态路由变化:如果此时我们不需要在index中配置冒号id,也可以在路由跳转中配置,那么我们举个例子:{path:'/schoolDetail',name:'SchoolDetail',component:schoolDetail,meta:{title:'SchoolDetail'}},当我们使用语法跳转到路由时(直接定义一个查询参数,这个参数是一个对象,你可以去里面加很多属性值,但是不要超过浏览器的长度限制):this.$router.push({path:'/schoolDetail/',query:{id:id}})搜索框后面的id以问号分割开头:例3:也可以同时配置,但是搜索框的个数增加了,丑陋:使用语法跳转到路由(同时配置params和查询参数):this.$router.push({path:'/schoolDetail/'+id,query:{_id:_id}})的外观浏览器搜索框:注意:由于详情页的组件通常只改变id,Vue内部有处理组件重用,所以直接使用下面的route函数获取数据并重新渲染:beforeRouteUpdate举个例子:当我只使用以下请求挂载数据:mounted{getSchool(this.$route.params.id).then((res)=>{this.p1=res[0].school_briefthis.p2=res[0].camus_brief;this.title=res[0].school;this.img=res[0].school_img;this.corner_img=res[0].corner_imgthis.tag=res[0].tag[2]})}结果如下,只是导航栏的地址发生变化,数据不会重新渲染:当我添加路由更新函数时:mounted{getSchool(this.$route.params.id).then((res)=>{this.p1=res[0].school_briefthis.p2=res[0].campus_brief;this.title=res[0].school;this.img=res[0].school_img;this.corner_img=res[0].corner_imgthis.tag=res[0].tag[2]})}beforeRouteUpdate(to,from,next){//当当前路由改变且组件被重用时调用//例如,对于一个带动态参数的Path/foo/:id,当在/foo/1和/foo/2之间跳转时,//由于会渲染同一个Foo组件,所以组件实例会被复用,这个hook就会在这种情况下被调用。//你可以访问组件实例`this`console.log("routingupdate");getSchool(to.params.id).then((res)=>{this.p1=res[0].school_briefthis.p2=res[0].campus_brief;this.title=res[0].school;这.img=res[0].school_img;this.corner_img=res[0].corner_imgthis.tag=res[0].tag[2]})next();},结果如下,导航栏地址发生变化,会重新渲染数据:此时探索vue的params和query跳转路由的实验结束,axios的参数携带isstarted:2.axios发起请求携带的参数和后端解析时获取的参数1.get请求携带参数,使用paramsaxios.request({//method:"get",requesturl:"/school/schools",method:'get',params:{_id}})}值得注意的是axios的参数好像没有query对象,只有params对象。这是我刚开始的时候疑惑的,因为我可以使用params正确传递参数,使用queryobject,结果发现无法传递参数。下面是我复制的文档的参数配置{//`url`是将用于请求的服务器URLurl:'/user',//`method`是创建请求方法时要使用的请求方法:'get',//默认//`baseURL`将被添加到`url`之前,除非`url`是绝对的。//为axios的实例设置`baseURL`以将相对URL//传递给该实例的方法会很方便。baseURL:'https://some-domain.com/api/',//`transformRequest`允许在发送到服务器之前更改请求数据//这仅适用于请求方法'PUT','POST',and'PATCH'//数组中的最后一个函数必须返回字符串或Buffer、ArrayBuffer、//FormData或Stream的实例//您可以修改标题对象。transformRequest:[function(data,headers){//做任何你想转换的数据returndata;}],//`transformResponse`允许在将响应数据传递给then/catchtransformRespo之前更改响应数据nse:[function(data){//做任何你想做的数据转换returndata;}],//`headers`是要发送的自定义标头headers:{'X-Requested-With':'XMLHttpRequest'},//`params`是要随请求一起发送的URL参数//必须是普通对象或URLSearchParams对象params:{ID:12345},//`paramsSerializer`是一个可选函数,负责序列化`params`//(例如https://www.npmjs.com/package/qs,http://api.jquery.com/jquery.param/)paramsSerializer:function(params){returnQs.stringify(params,{arrayFormat:'brackets'})},//`data`是要发送的数据请求主体//仅适用于请求方法'PUT'、'POST'和'PATCH'//当未设置`transformRequest`时,必须是以下类型之一://-字符串、普通对象、ArrayBuffer、ArrayBufferView,URLSearchParams//-仅限浏览器:FormData、File、Blob//-仅限节点:Stream、Bufferdata:{firstName:'Fred'},//`timeout`spe指定请求超时前的毫秒数。//如果请求时间超过`timeout`,请求将被中止。timeout:1000,//默认为`0`(无超时)//`withCredentials`表示跨站点访问控制请求是否应该使用凭据进行//withCredentials:false,//默认//`adapter`允许自定义处理请求,使测试更容易。//返回承诺并提供有效响应(请参阅lib/adapters/README.md)。adapter:function(config){/*...*/},//`auth`指示应该使用HTTP基本身份验证,并提供凭据。//这将设置一个`Authorization`标头,覆盖您使用`headers`设置的任何现有//`Authorization`自定义标头。auth:{username:'janedoe',password:'s00pers3cret'},//`responseType`表示服务器将响应的数据类型//optionsare'arraybuffer','blob','document','json','文本','流'responseType:'json',//default//`responseEncoding`表示用于解码响应的编码//注意:对于'stream'或客户端请求的`responseType`忽略responseEncoding:'utf8',//default//`xsrfCookieName`是用作xsrf令牌值的cookie的名称xsrfCookieName:'XSRF-TOKEN',//default//`xsrfHeaderName`是携带xsrf令牌值的http标头的名称xsrfHeaderName:'X-XSRF-TOKEN',//default//`onUploadProgress`允许处理上传的进度事件onUploadProgress:function(progressEvent){//用原生进度事件做任何你想做的事},//`onDownloadProgress`允许处理进度下载事件onDownloadProgress:function(progressEvent){//使用本机进度事件做任何你想做的事},//`maxContentLength`定义允许的http响应内容的最大字节数maxContentLength:2000,//`validateStatus`定义无论解决或拒绝给定//HTTP响应状态代码的承诺。如果`validateStatus`返回`true`(或设置为`null`//或`undefined`),承诺将被解决;否则,promise将被//拒绝。validateStatus:function(status){返回状态>=200&&状态<300;//default},//`maxRedirects`定义node.js中要遵循的最大重定向数。//如果设置为0,则不会遵循任何重定向。maxRedirects:5,//default//`socketPath`定义了一个在node.js中使用的UNIX套接字。//例如'/var/run/docker.sock'将请求发送到docker守护进程。//只能指定`socketPath`或`proxy`。//如果两者都指定,则使用`socketPath`。socketPath:null,//default//`httpAgent`和`httpsAgent`分别定义了在node.js中执行http//和https请求时要使用的自定义代理。这允许添加选项,例如//`keepAlive`未启用的选项默认。httpAgent:newhttp.Agent({keepAlive:true}),httpsAgent:newhttps.Agent({keepAlive:true}),//'proxy'定义代理服务器的主机名和端口。//您还可以使用常规的`http_proxy`和//`https_proxy`环境变量来定义您的代理。如果您使用环境变量//作为您的代理配置,您还可以将`no_proxy`环境//变量定义为不应被代理的以逗号分隔的域列表。//使用`false`禁用代理,忽略环境变量。//`auth`表示应该使用HTTPBasic身份验证来连接到代理,并且//提供凭据。//这将设置一个`Proxy-Authorization`标头,覆盖您使用`headers`设置的任何现有//`Proxy-Authorization`自定义标头。proxy:{host:'127.0.0.1',port:9000,auth:{username:'mikeymike',password:'rapunz3l'}},//`cancelToken`指定可用于can的取消令牌celtherequest//(详见下文Cancellation部分)cancelToken:newCancelToken(function(cancel){})}附上文档地址,本站文档可能不是最新的,但足以解决你的开发使用:axios文档中提到,axios好像没有query参数对象,所以意思是可以通过一定的方式配置params中携带的参数,让后端使用params接收或者通过query接收?老实说我不知道??,所以当我使用params携带我需要传递的信息时:axios.request({//method:"get",requesturl:"/school/schools",method:'get',params:{_id}})}发现后台打印:此时params的参数为空,只能看到query参数,所以我认为axios使用get请求的参数只能通过query查询2.post请求携带parameters,使用dataaxiospost请求的参数写在data里,我上面复制的文档也写了。此时在后台传递参数时,将其放在请求参数的body中,可以使用req.body获取:Example:axios.request({//method:"get",requesturl:"/login",method:'post',data:{myStatus,//代表学生或老师的用户名,密码}})}后台接收: