【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>
复制代码

总结


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

相关文章
|
29天前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
129 64
|
29天前
|
JavaScript 前端开发 API
Vue 3 中 v-model 与 Vue 2 中 v-model 的区别是什么?
总的来说,Vue 3 中的 `v-model` 在灵活性、与组合式 API 的结合、对自定义组件的支持等方面都有了明显的提升和改进,使其更适应现代前端开发的需求和趋势。但需要注意的是,在迁移过程中可能需要对一些代码进行调整和适配。
110 60
|
3天前
|
JavaScript API 数据处理
vue3使用pinia中的actions,需要调用接口的话
通过上述步骤,您可以在Vue 3中使用Pinia和actions来管理状态并调用API接口。Pinia的简洁设计使得状态管理和异步操作更加直观和易于维护。无论是安装配置、创建Store还是在组件中使用Store,都能轻松实现高效的状态管理和数据处理。
22 3
|
29天前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
33 8
|
28天前
|
存储 JavaScript 数据管理
除了provide/inject,Vue3中还有哪些方式可以避免v-model的循环引用?
需要注意的是,在实际开发中,应根据具体的项目需求和组件结构来选择合适的方式来避免`v-model`的循环引用。同时,要综合考虑代码的可读性、可维护性和性能等因素,以确保系统的稳定和高效运行。
31 1
|
28天前
|
JavaScript
Vue3中使用provide/inject来避免v-model的循环引用
`provide`和`inject`是 Vue 3 中非常有用的特性,在处理一些复杂的组件间通信问题时,可以提供一种灵活的解决方案。通过合理使用它们,可以帮助我们更好地避免`v-model`的循环引用问题,提高代码的质量和可维护性。
38 1
|
29天前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
1月前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
8天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
1月前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
43 1
vue学习第一章