上一篇文章中写了路由跳转和路由传参的相应内容
Vue2和Vue3的路由跳转及路由传参_Eric加油学!的博客-CSDN博客
针对于params和query参数的传递,有若干的面试题值得记录
上一篇也写到了,如果使用对象形式传递params参数,需要占位,并使用name形式。
所以,第一步试验params参数占位了,但是不传递params参数会怎么样
- {
- path:'/search/:keyword',
- component: SearchIndex,
- meta:{show:true},
- name:"search"
- }
- $router.push({
- name:"search",
- query:{k:keyword.value.toUpperCase()}
- })
这里我配置路由时,params参数占位了,但是我实际传递时,并没有params参数,只有query参数。
这时候它的路径就会有问题。 比如,此时我是在localhost/home 。 讲道理点一下搜索按钮,至少路径应该是localhost/search 吧。如果传参了,后面应该会跟参数。
比如 params参数为abc,query参数为ABC 。 跳转的路径应该是localhost/search/abc?k=ABC
但如果占位而不传递params的话,它的路径是 localhost/?k=ABC (它连/search都没了!!!)
所以如何去指定params可传可不传呢? 配置路由后,占位的后面加上一个问号? (就表示params可传递或不传递)
- {
- path:'/search/:keyword?',
- component: SearchIndex,
- meta:{show:true},
- name:"search"
- }
按照上面的步骤,指定了params可传可不传,但是我实际传递时,传了params参数只不过是个空串,会怎样?
- {
- path:'/search/:keyword?',
- component: SearchIndex,
- meta:{show:true},
- name:"search"
- }
- $router.push({
- name:"search",
- params:{keyword: ' '},
- query:{k:keyword.value.toUpperCase()}
- })
同样的,它的路径也会出问题,也是会少了 /search
解决: 使用undefined解决params参数可以传递、不传递(空的字符串)
- $router.push({
- name:"search",
- params:{keyword: '' || undefined},
- query:{k:keyword.value.toUpperCase()}
- })
可以。 有三种写法
router/index.js中
- const routes = [
- {
- path:'/search/:keyword',
- component: SearchIndex,
- meta:{show:true},
- name:"search",
- // 路由组件能不能传递props数据? 可以!
- // 第一种:布尔值写法 - 只能params参数
- // props:true
-
- // 第二种:对象写法,额外给路由组件传递一些props
- // props:{a:1,b:2}
-
- // 第三种:函数写法 (最常见) params参数、query参数,通过props传递给路由组件
- props:($route)=>{
- return {keyword:$route.params.keyword,k:$route.query.k};
- }
- },
SearchIndex.vue中
- <div>
- 我是搜索
- <h1>params参数---{{$route.params.keyword}}---{{keyword}}h1>
- <h1>query参数---{{$route.query.k}}---{{k}}h1>
- div>
-
- <script>
- export default {
- props:['keyword','k']
- }
- script>
-
- <style>
-
- style>


不过好像实际中也很少用到props数据,(但似乎一定程度上可以解耦吧)