vue中跳转到详情页的两种方法

Posted #小裁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue中跳转到详情页的两种方法相关的知识,希望对你有一定的参考价值。

路由跳转过程中的参数传递

业务场景:在电影列表页面中点击某一项的点击名称,跳转到电影详情页,查看选中电影的详细信息。这个过程就需要在跳转的同时传递电影ID作为参数,这样,详情页才可以获取到选中项的ID,从而发送请求,查询详细信息。

1. 准备一个电影列表页:List.vue 一个电影详情页:Detail.vue
2. 配置路由:
a. 当访问地址:http://localhost:8080/list时,看到列表页。
b. 当访问地址:http://localhost:8080/detail时,看到详情页。
3. 注意:需要在App.vue中添加占位符:

路由跳转过程中的参数传递方式1

通过在请求资源路径后用?拼接查询字符串的方式,传递参数:

<router-link to="/detail?id=7&name=zs">xx</router-link>

方法一: 问号版

List.vue列表页: 列表项填入router-link标签

  <template>
  <tbody>
  <tr v-for="(item, i) in data.result" :key="item.id">
  <td>
  <router-link :to="`/detail?id=$item.id`">//问号版的
  item.title
</router-link>
  </td>
  </tr>
  </tbody>
  </template>

detail.vue详情页:

 <template>
  <div>
  <h2>电影详情页</h2>
  <p>电影名称:movieDate.title</p>
  <p>电影类型:movieData.type</p>
  </div>
  </template>
  <script>
  import  myaxios from './http/MyAxios'
export default	
  data( )
    return
      movieData: ,//绑定电影对象
    
  ,
  mounted( )  //当前主键已经挂载到DOM上,(已展示)时被vue自动调用
    console.log('生命周期方发mounted被调用')
    let  id  = this.$router.query.id  //接收请求路径后的   ?key= value  格式的参数id
    console.log('接收到参数id:' + id)
    let url  = "https://web.codeboy.com/bmdapi/movie-info/query"
    myaxios.get(url, id ).then(res =>
      console.log(res)  //res.data.data中存储了电影对象 
      this.movieDate = res.data.data
    )
  
;
</script>

方法二:不带问号版的

<router-link to="/detail/7">xx</router-link>
this.$router.push('/detail/7')

目标页如何接收该参数?
1、配置路由:


path:'/detail/:id',
component: ( ) => import 'Detail.vue'

该路由的配置,将会匹配:

/detail/7    =>   id:7
/detail/123  =>   id:123
/detail/abc  =>   id:abc

vue将会自动封装路径参数,放入this.$route.params属性中。如下即可获取该参数:

mounted()
  	let  id = this.$route.params.id

List.vue列表页: 列表项填入router-link标签

<template>
   <tbody>
        <tr v-for="(item, i) in data.result" :key="item.id">
          <td>
          <img  :src="item.cover"  width="60px"
			@click="$router.push(`/detail/$item.id`)">
          </td>
        </tr>
      </tbody>
</template>

router/index.js配置路由页:


paht:  '/detail/:id',
name: 'detail',
component: ( ) =>import ('../Detail.vue')

detail.vue详情页:

<template>
<div>
<h2>电影详情页</h2>
<p>电影名称:movieDate.title</p>
<p>电影类型:movieData.type</p>
</div>
</template>
<script>
import  myaxios from './http/MyAxios'
   export default	
data( )
return
movieData: ,//绑定电影对象

,
mounted( )  //当前主键已经挂载到DOM上,(已展示)时被vue自动调用
console.log('生命周期方发mounted被调用')
let  id  = this.$router.params.id  //接收路径参数: /detail/id   格式的参数id
console.log('接收到参数id:' + id) 
let url  = "https://web.codeboy.com/bmdapi/movie-info/query"
myaxios.get(url, id ).then(res =>
console.log(res)  //res.data.data中存储了电影对象 
this.movieDate = res.data.data
)

;
</script>

VUE的两种跳转push和replace对比区别

router.push(location)

在vue.js中想要跳转到不同的 URL,需要使用 router.push 方法。

这个方法会向 history 栈添加一个新的记录,当用户点击浏览器后退按钮时,则回到之前的 URL。

当你点击

<router-link>

时,这个方法会在内部调用,所以说,点击

<router-link :to="...">

等同于调用

router.push(...)

声明式

<router-link :to="...">

编程式:router.push(...)//该方法的参数可以是一个字符串路径,或者一个描述地址的对象。

// 字符串
router.push(‘home‘)
// 对象
this.$router.push({path: ‘/login?url=‘ + this.$route.path});
// 带查询参数,变成/backend/order?selected=2
this.$router.push({path: ‘/backend/order‘, query: {selected: "2"}});
// 命名的路由
router.push({ name: ‘user‘, params: { userId: 123 }})

router.replace(location)

设置 replace 属性(默认值: false)的话,当点击时,会调用 router.replace() 而不是 router.push(),于是导航后不会留下 history 记录。即使点击返回按钮也不会回到这个页面。

加上replace: true后,它不会向 history 添加新记录,而是跟它的方法名一样 —— 替换掉当前的 history 记录。

//声明式:
<router-link :to="..." replace></router-link>
// 编程式:
router.replace(...)
//push方法也可以传replace
this.$router.push({path: ‘/home‘, replace: true})

传参两种方式

使用query:

this.$router.push({
  path: ‘/home‘,
  query: {
    site: [],
    bu: []
}
})

使用params:

this.$router.push({
  name: ‘Home‘,  // 路由的名称
  params: {
    site: [],
    bu: []
}
})

params:/router1/:id ,/router1/123,/router1/789 ,这里的id叫做params

query:/router1?id=123 ,/router1?id=456 ,这里的id叫做query。

两者都可以传递参数,区别是什么?

  1. query 传参配置的是path,而params传参配置的是name,在params中配置path无效
  2. query在路由配置不需要设置参数,而params必须设置
  3. query传递的参数会显示在地址栏中
  4. params传参刷新会无效,但是query会保存传递过来的值,刷新不变 ;

5.路由配置:

query 的写法

{
path: ‘/home‘,
name: Home,
component: Home
}

params写法:

{
path: ‘/home/:site/:bu‘,
name: Home,
component: Home
}

如果路由上面不写参数,也是可以传过去的,但不会在url上面显示出你的参数,并且当你跳到别的页面或者刷新页面的时候参数会丢失,那依赖这个参数的http请求或者其他操作就会失败

6,获取路由参数

在接收的跳转的页面

created () {
let self = this
self.getParams()
},
watch () {
‘$route‘: ‘getParams‘
},
methods: {
  getParams () {
  let site = this.$route.query.site
  let bu = this.$route.query.bu
  // 如果是params 传参,那就是this.$route.params.site
  上面就可以获取到传递的参数了
 }
}

注意:获取路由上面的参数,用的是$route,后面没有r

params是路由的一部分,必须要有。query是拼接在url后面的参数,没有也没关系。

params一旦设置在路由,params就是路由的一部分,如果这个路由有params传参,但是在跳转的时候没有传这个参数,会导致跳转失败或者页面会没有内容。

params、query不设置也可以传参,但是params不设置的时候,刷新页面或者返回参数会丢失,query并不会出现这种情况,这一点的在上面说过了

最后总结:

路由传递参数和传统传递参数是一样的,命名路由类似表单提交而查询就是url传递,在vue项目中基本上掌握了这两种传递参数就能应付大部分应用了,最后总结为以下:

1.命名路由搭配params,刷新页面参数会丢失

2.查询参数搭配query,刷新页面数据不会丢失

3.接受参数使用this.$router后面就是搭配路由的名称就能获取到参数的值

以上是关于vue中跳转到详情页的两种方法的主要内容,如果未能解决你的问题,请参考以下文章

VUE的两种跳转push和replace对比区别

Vue路由实现页面跳转的两种方式(router-link和JS)

怎样在vue中跳转到外部链接

luffy前台案例

降低vue-router版本的两种方法

vue-router打开新的tab页时,其内容是上一个tab页的内容问题