首页 > 其他分享 >Vue路由params、query传参用法,以及form表单回车自动提交问题

Vue路由params、query传参用法,以及form表单回车自动提交问题

时间:2023-12-08 14:57:17浏览次数:31  
标签:传参 Vue form title params push query 方法 路由

一、路由参数用法

1.1 query参数

第一种方式传参:跳转路由并携带query参数,注意to的字符串写法

将id和title拼接字符串形成地址

<router-link :to="`/home/message/detail?id=${item.id}&title=${item.title}`">{{ item.title }}</router-link>&nbsp;&nbsp; 

第二种方式传参:

to中使用对象写法,path包含地址,query包含传递的参数

<router-link :to="{
  path:'/home/message/detail',
  query:{
    id:item.id,
    title:item.title
  }
}">
  {{ item.title }}
</router-link>

如何接收参数?

<ul>
  <li>消息编号:{{ $route.query.id }}</li>
  <li>消息标题:{{ $route.query.title }}</li>
</ul>

如何配置路由规则?

下面例子中使用了children配置项

//router/index.js文件下
{
    path: "/home",
    component: Home,
    children: [ //children里面写嵌套路由
        {
            path: "news", //这里不要写成 /news
            component: News
        },
        {
            path: "message",
            component: Message
        }
    ]
},
<!--跳转使用:to="地址"-->
<router-link class="list-group-item" active-class="active" to="/home/news">
  News
</router-link>

1.2 params参数

第一种方式传参:跳转路由并携带params参数,注意to的字符串写法

<router-link :to="`/home/message/detail/${item.id}/${item.title}`">{{ item.title }}</router-link>&nbsp;&nbsp;

第二种方式传参:

<router-link :to="{
  name:'xiangqing', //这里必须写name属性,个人认为可能params参数的路径是动态不确定的,所以用不了path属性
  params:{
    id:item.id,
    title:item.title
  }
}">
  {{ item.title }}
</router-link>&nbsp;&nbsp;

如何接收参数?

<ul>
  <li>消息编号:{{ $route.params.id }}</li>
  <li>消息标题:{{ $route.params.title }}</li>
</ul>

如何配置路由规则?

//router/index.js文件下 message路由下
children: [
    {
        name: "xiangqing",
        path: "detail/:id/:title",
        component: Detail,
    }
]

二、params传参引申的问题

如何控制params可传可不传

✔️ 在路由配置的时候使用?占位

{
    path: '/search/:keyword?',
    component: searchVue,
    name: 'search',
    meta: { showHeaderFooter: true }
},

既然params可传可不传,那么如果是传递空字符串怎么解决?

(空字符串导致地址有误,即地址不显示search→)http://localhost:8080/#/?k=123IKJ

✔️ 使用undefined

let location = {
  name: "xiangqing",
  params: {
    id: this.id || undefined,
  },
};

Vue切换路由报Uncaught(in promise)

编程式路由跳转到当前路由(参数不变),多次执行会抛出警告错误。

✔️ 在main.js下注册一个全局函数(不是唯一方法)

//router/index.js
import vue from 'vue'
import VueRouter from "vue-router";
vue.use(VueRouter)

//更改push方法,使得多次访问同一个参数路由不报错
let originPush = VueRouter.prototype.push; //备份原型对象上的方法
VueRouter.prototype.push = function push(location, resolve, reject) {
    //对原型对象上的方法重新定义,将自定义函数作为新的push方法
    if (resolve & reject) { //是否传递了 resolve 和 reject 参数?
        originPush.call(this, location, resolve, reject) //调用原来的 push 方法,并将传递的参数传递给它
    } else { //在调用 push 方法时没有提供回调函数
        originPush.call(this, location, () => { }, () => { }) //调用原来的 push 方法,并传递两个空的箭头函数作为回调函数,避免错误
    }
}
//重写replace
let originReplace = VueRouter.prototype.replace; //备份原型对象上的方法
VueRouter.prototype.replace = function replace(location, resolve, reject) {
    if (resolve & reject) {
        originReplace.call(this, location, resolve, reject)
    } else {
        originReplace.call(this, location, () => { }, () => { })
    }
}

三、form表单自动提交问题

使用enter回车input搜索框,并携带空params进行路由跳转页面。

但由于外层form表单回车自动跳转导致第一次路由地址出错,搜索到如下解决方案:阻止submit默认行为

<form @submit.prevent>
  <input
    ref="input"
    type="text"
    v-model="keyword"
    @keyup.enter="searchClick"
  />
  <button type="button" @click="searchClick">搜索</button>
</form>

第一种方法,把表单去掉,这是最管用,但也是最傻的方法,直接添加onclick事件,不用表单提交,这种方法就不赘述了。

第二种方法,很多人估计都想到过,就是既然一个input会自动提交,多个input就没问题,那么我给它多加一个input不就行了,有些人试过发现不行,那是为什么呢?
因为他是这么写的,这样当然不行,一个隐藏域,type并不是text,所以不行。
但是,,使用这种方法就可以了,因为它是用样式隐藏输入框的,实质上还是一个type为text的input。

第三种方法,这种方法很好用,直接对form进行操作,个人推荐这种方式。直接在form上加上onsubmit="return false;"这段话,它会阻止表单的回车键进行提交。
例:

第四种方法,这种方法是直接对input进行操作,强行将回车键操作去掉,这种方式也不错,在input上加一个onkeydown事件,
onkeydown="if(event.keyCode == 13){return false;}",阻止回车键的操作。
例:

vue方案
@submit.native.prevent

.native 表示对一个组件绑定系统原生事件

.prevent 表示提交以后不刷新页面

————————————————
版权声明:本文为CSDN博主「Mr_linjw」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Mr_linjw/article/details/133878134

标签:传参,Vue,form,title,params,push,query,方法,路由
From: https://www.cnblogs.com/cherrymoon/p/17887147.html

相关文章

  • 基于vue脚手架的练习2
    <template><div><span>父值为:</span>{{to_value}}<button@click="clear()">清空</button></div></template><script>exportdefault{props:['to_value'],methods......
  • vue实现下载附件功能
    两种方式下载:第一种:直接a标签下载<aclass="item-btndownload":href="'/xxx/xxx/download?id='+xxx.id":download="xxx.name">下载附件</a>第二种: <el-buttonclass="item-btndownload"@click="downloadEnc......
  • Informatica_1020_Server-标准环境搭建
    转:https://www.cnblogs.com/buwuzhengye/articles/15596765.html一、介质介质名称版本信息描述informatica_1020_server_linux-64.tar10.2.0forLinux64bit必须JavaJdk1.8_191forLinux64bit可选,如果想图形安装INFA就需要安装oracle_11g_client11GR2......
  • Vue学习计划-Vue2--Vue核心(五)条件、列表渲染、表单数据
    1.条件渲染v-ifv-if="表达式"v-else-if="表达式"v-else="表达式"适用于:切换频率较低的场景特点:不显示dom元素,直接被删除注意:v-if和v-else-if、v-else一起使用,但要求结构不能被打断v-if和template一起使用,v-show不可以v-showv-show="表达式"适用于:切换频......
  • vue-quill富文本编辑器实现图片缩放
    安装环境官网:https://vueup.github.io/vue-quill/guide/modules.htmlnpm安装:npminstall@vueup/vue-quill@latest--savepnpm安装:pnpmadd@vueup/vue-quill@latest安装模块quill-blot-formatternpm:npminstall--savequill-blot-formatterpnpm:npmaddquill-blot-form......
  • Windows服务器,通过Nginx部署VUE+Django前后端分离项目
    目录基本说明安装Nginx部署VUE前端部署Django后端Djangoadmin静态文件(CSS,JS等)丢失的问题1.基本说明本文介绍了在windows服务器下,通过Nginx部署VUE+Django前后端分离项目。本项目前端运行在80端口,服务器端运行在8000端口。因此本项目使用Django的......
  • vue中this.$refs的使用方法和遇到的问题
    this.$refs:用于操作真实的DOM节点。 在开发时碰到了一个小需求,需要子组件向父组件传参,而且是不需要通过事件传递的,一开始使用this.$emit()来写的,但是一直没有接受到参数,于是放弃了使用this.$emit()的使用。 于是,使用了在父组件中调用子组件的方法,来获取传递的参数。 一.......
  • Graph regularized non-negative matrix factorization with [Formula: see text] nor
    Graphregularizednon-negativematrixfactorizationwith[Formula:seetext]normregularizationtermsfordrug-targetinteractionspredictionJunjunZhang 1, MinzhuXie 2 3Affiliations expandPMID: 37789278 PMCID: PMC10548602 DOI: 10.11......
  • vue-django 前端bootstrap配置
    2、前端引入bootstrap下载bootstrap源码,放在vue中的src目录中https://v5.bootcss.com/docs/getting-started/download/https://getbootstrap.net/docs/getting-started/introduction/在vue根目录修改main.jsimport{createApp}from'vue'importAppfrom'./App.vue'im......
  • How to get printk format specifiers right (如何正确使用printk格式说明符)(翻译 by
    原文:https://www.kernel.org/doc/html/latest/core-api/printk-formats.html#printk-specifiers如何正确使用printk格式说明符整数类型如果变量是Type类型,则使用printk格式说明符:signedchar%d或%hhxunsignedchar%u或%xchar......