【Vue3从零开始-实战】S14:详情页回退事件及路由参数的传递获取数据

简介: 【Vue3从零开始-实战】S14:详情页回退事件及路由参数的传递获取数据

@@DVBVTGC2D7ROIYF4YK_@O.png


前言


实战已经开始了!上一篇已经将详情页的店铺信息展示出来了,但是顶部还有一个搜索框和返回按钮,而且详情页的店铺数据是在页面中固定写死的,所以本章节会将顶部搜索栏进行布局,并且通过返回按钮可以回到首页。其次会通过路由传参的方式,从首页跳转到详情页,并动态获取详情页店铺数据。


搜索框布局


@I4V_MNQM9AMV)Z1WKC7YL4.png


🌀 根据稿图,我们发现搜索框部分只有一个input输入框和一个返回按钮,比较简单,所以下面就直接贴代码了,有兴趣的朋友可以自己设计的哦。


👉 DOM元素


<div class="search">
  <div class="search__back iconfont">&#xe6f2;</div>
  <div class="search__content">
    <span class="search__content__icon iconfont">&#xe62d;</span>
    <input class="search__content__input" placeholder="请输入商品名称" />
  </div>
</div>
复制代码


👉 样式


.search {
  display: flex;
  margin: .2rem 0 .16rem 0;
  line-height: .32rem;
  &__back {
    width: .3rem;
    font-size: .24rem;
    color: #B6B6B6;
  }
  &__content {
    display: flex;
    flex: 1;
    background: #F5F5F5;
    border-radius: .16rem;
    &__icon {
      width: .44rem;
      text-align: center;
      color: #B7B7B7;
    }
    &__input {
      display: block;
      width: 100%;
      padding-right: .2rem;
      border: none;
      outline: none;
      background: none;
      height: .32rem;
      font-size: .14rem;
      color: #333;
      &::placeholder {
        color: #333;
      }
    }
  }
}
复制代码


4B]YLRB0I0B5XSR@CF23POX.png


router-link标签实现跳转


🌀 页面跳转之前在首页和登录注册页面之间都有写过,但是用的点击事件去跳转的,这次我们就用以前学过但没有实际用过的router-link标签实现


<router-link to="/shop" v-for="item in nearbyList" :key="item.id">
    <ShopItem :item="item" />
</router-link>
复制代码


  • 将Nearby.vue中的子组件标签用router-link标签包裹起来。


  • 由于列表页上的每一条数据都得点击跳转,所以需要将循环事件放在router-link标签上。


  • router-link标签还会接收一个参数 to ,它表示需要跳转到哪个路由(对应路由配置页中的path)


6TDJ`3436P14RGXFV[@1G[X.png


  • 在浏览器中可以看到多了几个 a 标签包裹着列表中的元素


  • 由于 a 标签的默认样式,所以列表页上有下划线。


👉 去掉a标签的下划线


a{
    text-decoration: none;
}
复制代码


EJQTH`WD]C%[FHKJW31J[IQ.png


router.back函数回退


router.back函数是vue-router插件提供的一个回退事件方法。


👉 给详情页顶部栏中的返回按钮一个点击事件


<div class="search__back iconfont" @click="handleBackClick">&#xe6f2;</div>
复制代码


👉 引入所需的路由插件


import { useRouter } from 'vue-router'
复制代码


👉 在setup函数中定义路由,并调用回退事件的方法


const router = useRouter()
const handleBackClick = () => {
  router.back()
}
复制代码


SQ%F(2UHF9_[7SQZR8@4$IH.png


店铺信息动态数据


🌀 详情页中的店铺信息是固定的数据,在实际项目中我们应该通过接口请求获取到对应的店铺信息,所以就需要根据首页列表的店铺ID来请求接口获取到对应的店铺数据了。


mock接口


👉 打开mock接口后台,新增店铺详情接口


LBV76T6`[%QZ0LCKRGRN(@O.png


👉 在详情页中通过get请求接口


  • 引入get请求


import { get } from '../../utils/request'
复制代码


  • 进入页面就需要直接请求接口


const data = reactive({ item: {} })
const getItemData = async () => {
  const result = await get('/api/shop/1')
  if (result.data.code === 0 && result.data.data) {
    data.item = result.data.data
  }
}
getItemData()
const { item } = toRefs(data)
复制代码


👉 为了看到效果,需要将setup函数里面原来写死的数据删除


S06I@F~WBUGXJZR]]E5YR43.png


  • 在接口请求的时候动态传递了一个id,也就是接口url后面的/:id


😲 在实际项目中,id是通过列表传递过去的,然后去请求接口,也就是需要将id动态化。


动态路由传参


🌀 在接口后面可以添加/:id的方式获取动态参数,其实在路由中也可以通过这种方式获取到动态参数。


👉 打开路由配置文件,并重新配置详情页路由,在路由后面添加/:id


{
    path: '/shop/:id',
    name: 'Shop',
    component: () => import(/* webpackChunkName: "shop" */ '../views/shop/Shop')
}
复制代码


👉 首页列表中点击跳转时,就需要通过v-bind指令动态绑定参数


<router-link :to="`/shop/${item.id}`" v-for="item in nearbyList" :key="item.id">
    <ShopItem :item="item" />
</router-link>
复制代码


  • router-link标签中的to就是动态跳转路径,里面绑定了当前循环的店铺id


C0RJ@(Z2W1PAFHEM`J@9[]9.png


  • 在浏览器地址栏中可以发现,当我们点击列表中的店铺时,地址栏的URL后面就会动态添加当前点击的店铺ID


😲 但是接口请求的时候,需要获取到地址栏的店铺id才能让接口后面的参数也变成动态的。


route获取路由参数


👉 在详情页中引入useRoute


import { useRouter, useRoute } from 'vue-router'
复制代码


👉 为了知道useRoute是干啥的,我们需要在setup函数中调用useRoute方法,并打印出来看看


const route = useRoute()
console.log(route)
复制代码


`JW299P_@PBR`T_}@{5WB`8.png


useRoute函数是vue-router提供的一个用来获取路由配置项的方法,里面有配置项中的name、path、params等。


  • name:配置项中路由的名称。


  • params:路由项中传递的参数


  • path:路由项中跳转的路径


🔆 通过打印出来之后发现,可以通过useRoute函数中的params获取到店铺id


👉 修改接口传递参数的方式,将静态参数改为动态参数


const result = await get(`/api/shop/${route.params.id}`)
复制代码


%10$KPJJS}820XQ01MXB]E3.png


由于是模拟接口数据,所以每次请求的ID虽然变了,但是接口数据还是固定的。


拆分详情页setup函数


🌀 不管是在首页,亦或是登录注册页面,我们都去拆分过setup函数中的逻辑,也在前面的文章中说明过setup函数的职责。


🔆 下面就直接拆分了,也会按照前面文章中的拆分方式。


<script>
import { reactive, toRefs } from 'vue'
import { useRouter, useRoute } from 'vue-router'
import { get } from '../../utils/request'
import ShopItem from '../../components/shopItem'
// 获取当前店铺信息
const useShopInfoEffect = () => {
  const route = useRoute()
  const data = reactive({ item: {} })
  const getItemData = async () => {
    const result = await get(`/api/shop/${route.params.id}`)
    if (result.data.code === 0 && result.data.data) {
      data.item = result.data.data
    }
  }
  const { item } = toRefs(data)
  return { item, getItemData }
}
// 点击回退逻辑
const useBackRouterEffect = () => {
  const router = useRouter()
  const handleBackClick = () => {
    router.back()
  }
  return handleBackClick
}
export default {
  name: 'Shop',
  components: {
    ShopItem
  },
  setup () {
    const { item, getItemData } = useShopInfoEffect()
    const handleBackClick = useBackRouterEffect()
    getItemData()
    return { item, handleBackClick }
  }
}
</script>
复制代码

总结


本篇文章主要讲解了路由中的回退事件和动态传参的方式,并在接口请求中获取到路由传递的参数。

相关文章
|
SQL JavaScript 前端开发
Vue实现动态数据透视表(交叉表)
Vue实现动态数据透视表(交叉表)
638 13
|
JavaScript 前端开发 API
管理数据必备;侦听器watch用法详解,vue2与vue3中watch的变化与差异
一篇文章同时搞定Vue2和Vue3的侦听器,是不是很棒?不要忘了Vue3中多了一个可选项watchEffect噢。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
存储 数据采集 供应链
属性描述符初探——Vue实现数据劫持的基础
属性描述符还有很多内容可以挖掘,比如defineProperty与Proxy的区别,比如vue2与vue3实现数据劫持的方式有什么不同,实现效果有哪些差异等,这篇博文只是入门,以后有时间再深挖。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
750 161
|
监控 JavaScript 算法
深度剖析 Vue.js 响应式原理:从数据劫持到视图更新的全流程详解
本文深入解析Vue.js的响应式机制,从数据劫持到视图更新的全过程,详细讲解了其实现原理和运作流程。
|
9月前
|
缓存 JavaScript
vue中的keep-alive问题(2)
vue中的keep-alive问题(2)
670 137
|
10月前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
795 2
|
JavaScript 安全
在 Vue 中,如何在回调函数中正确使用 this?
在 Vue 中,如何在回调函数中正确使用 this?
591 0
|
人工智能 JSON JavaScript
VTJ.PRO 首发 MasterGo 设计智能识别引擎,秒级生成 Vue 代码
VTJ.PRO发布「AI MasterGo设计稿识别引擎」,成为全球首个支持解析MasterGo原生JSON文件并自动生成Vue组件的AI工具。通过双引擎架构,实现设计到代码全流程自动化,效率提升300%,助力企业降本增效,引领“设计即生产”新时代。
841 1
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
1400 0