最近发现职场前端用的框架大多为vue,所以最近也跟着黑马程序员vue3的课程进行学习,以下是我的学习记录
视频网址:
Day2-17.Layout-Pinia优化重复请求_哔哩哔哩_bilibili
学习日记:
vue3学习日记3 - 组合式API练习小案例-CSDN博客
一、路由配置
1、新建文件夹及文件
<script setup>
</script>
<template>
<div class="container ">
<!-- 面包屑 -->
<div class="bread-container">
<el-breadcrumb separator=">">
<el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
<el-breadcrumb-item :to="{ path: '/' }">居家
</el-breadcrumb-item>
<el-breadcrumb-item>居家生活用品</el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="sub-container">
<el-tabs>
<el-tab-pane label="最新商品" name="publishTime"></el-tab-pane>
<el-tab-pane label="最高人气" name="orderNum"></el-tab-pane>
<el-tab-pane label="评论最多" name="evaluateNum"></el-tab-pane>
</el-tabs>
<div class="body">
<!-- 商品列表-->
</div>
</div>
</div>
</template>
<style lang="scss" scoped>
.bread-container {
padding: 25px 0;
color: #666;
}
.sub-container {
padding: 20px 10px;
background-color: #fff;
.body {
display: flex;
flex-wrap: wrap;
padding: 0 10px;
}
.goods-item {
display: block;
width: 220px;
margin-right: 20px;
padding: 20px 30px;
text-align: center;
img {
width: 160px;
height: 160px;
}
p {
padding-top: 10px;
}
.name {
font-size: 16px;
}
.desc {
color: #999;
height: 29px;
}
.price {
color: $priceColor;
font-size: 20px;
}
}
.pagination-container {
margin-top: 20px;
display: flex;
justify-content: center;
}
}
</style>
2、修改路由
3、修改Categorize中index.vue
4、运行截图
二、面包屑导航实现
1、新建文件
// 二级分类
import request from '@/utils/http'
// 获取二级分页数据
export function getCategoryFilterAPI(id){
return request({
url:'/category/sub/filter',
params:{
id
}
})
}
2、修改SubCategory文件夹下index.vue
<script setup>
import {getCategoryFilterAPI} from '@/apis/SubCategory'
import { onMounted, ref } from 'vue'
import { useRoute } from 'vue-router'
const categoryFilter = ref([])
const route = useRoute()
const getCategoryFilter = async () => {
const res = await getCategoryFilterAPI( route.params.id)
console.log(res)
categoryFilter.value = res.result
}
onMounted(()=>getCategoryFilter())
</script>
<template>
<div class="container ">
<!-- 面包屑 -->
<div class="bread-container">
<el-breadcrumb separator=">">
<el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
<el-breadcrumb-item :to="{ path: `/categorize/${categoryFilter.parentId}` }">{
{ categoryFilter.parentName }}</el-breadcrumb-item>
<el-breadcrumb-item>{
{ categoryFilter.name }}</el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="sub-container">
<el-tabs>
<el-tab-pane label="最新商品" name="publishTime"></el-tab-pane>
<el-tab-pane label="最高人气" name="orderNum"></el-tab-pane>
<el-tab-pane label="评论最多" name="evaluateNum"></el-tab-pane>
</el-tabs>
<div class="body">
<!-- 商品列表-->
</div>
</div>
</div>
</template>
3、运行截图
三、基础商品列表实现(传参data)
1、Subgategory.js,添加接口
/**
* @description: 获取导航数据
* @data {
categoryId: 1005000 ,
page: 1,
pageSize: 20,
sortField: 'publishTime' | 'orderNum' | 'evaluateNum'
}
* @return {*}
*/
export const getSubCategoryAPI = (data) => {
return request({
url:'/category/goods/temporary',
method:'POST',
data
})
}
2、修改页面
<script setup>
import {getCategoryFilterAPI,getSubCategoryAPI} from '@/apis/SubCategory'
import { onMounted, ref } from 'vue'
import { useRoute } from 'vue-router'
import GoodItem from '@/views/Home/componments/GoodsItem.vue'
// 面包屑
const categoryFilter = ref([])
const route = useRoute()
const getCategoryFilter = async () => {
const res = await getCategoryFilterAPI( route.params.id)
console.log(res)
categoryFilter.value = res.result
}
onMounted(()=>getCategoryFilter())
// 商品列表
const goodList = ref([])
const reqData = ref({
categoryId: route.params.id ,
page: 1,
pageSize: 20,
sortField: 'publishTime'
} )
const getSubCategory = async () => {
const res = await getSubCategoryAPI(reqData.value)
goodList.value = res.result
console.log(goodList)
}
onMounted(()=>getSubCategory())
</script>
<template>
<div class="container ">
<!-- 面包屑 -->
<div class="bread-container">
<el-breadcrumb separator=">">
<el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
<el-breadcrumb-item :to="{ path: `/categorize/${categoryFilter.parentId}` }">{
{ categoryFilter.parentName }}</el-breadcrumb-item>
<el-breadcrumb-item>{
{ categoryFilter.name }}</el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="sub-container">
<el-tabs>
<el-tab-pane label="最新商品" name="publishTime"></el-tab-pane>
<el-tab-pane label="最高人气" name="orderNum"></el-tab-pane>
<el-tab-pane label="评论最多" name="evaluateNum"></el-tab-pane>
</el-tabs>
<div class="body">
<!-- 商品列表-->
<GoodItem v-for=" item in goodList.items" :key="item.id" :good="item" />
</div>
</div>
</div>
</template>
3、运行截图
四、列表筛选功能的实现
1、绑定方法和参数
// 切换按钮时调用
const tabchange = () => { getSubCategory() }
3、运行结果(只要保证访问时参数不同即可,后台接口有问题,页面不会改变)
五、列表无限加载实现
1、核心实现逻辑
可以使用elementPlue提供的指令v-infinite-scroll监听是否满足触底雕件,满足条件时让页数参数加一获取下一页数据,做新老数据的拼接渲染
2、实践
六、定制路由行为
在不同路由切换的时候,可以自动滚动到页面的顶部,而不是停留在原先的位置