vue3项目(四)---一级分类页

1. 一级分类-整体认识和路由配置

1)当点击一级分类的时候,会路由跳转到Category组件,并传递参数过去。

所以需要在Category组件进行路由配置,进行参数的占位。

 2)配置导航区域链接

因为点击LayoutHeader,LayoutFixed组件都会进行路由跳转。所以都需要配置链接,传递参数。

2. 一级分类-面包屑导航渲染 

 步骤:

1)准备静态组件

2)封装接口

//src/apis/category.js
import request from "@/utils/http";

// 获取分类数据
export function getCategoryAPI(id){
    return request({url:'/category',params:{id}})
}

3)获取数据

注意这里有参数传过来,所以需要使用useRoute来获取参数

//src/views/Category/index.vue
<script setup>
import { getCategoryAPI } from "@/apis/category";
import { onMounted, ref } from "vue";
import { useRoute } from "vue-router";
// 获取数据
const categoryData = ref({});
// 使用useRoute获取传过来的参数
const route = useRoute();
const getCategory = async () => {
  const res = await getCategoryAPI(route.params.id);
  categoryData.value = res.result;
};
onMounted(() => {
  getCategory();
});

渲染页面

 3. 一级分类-banner轮播图实现

由于分类的轮播图和首页的轮播图是一样的,只是接口的参数不同,所以其他步骤一样。

步骤:

1)适配接口参数

//src/apis/home.js
// 获取banner
export function getBannerAPI(params={}){
    // 默认为1 商品为2
    const {distributionSite='1'}=params
    return httpInstance({
        url:'/home/banner',
        params:{
            distributionSite
        }
    })
}

2)迁移首页Banner逻辑,获取数据,渲染数据

//src/views/Category/index.vue
<script setup>
import { getBannerAPI } from "@/apis/home";

//获取banner
const bannerList = ref([]);
const getBanner = async () => {
  const res = await getBannerAPI({ distributionSite: "2" });
  console.log(res);
  bannerList.value = res.result;
};
onMounted(() => {
  getBanner();
});
</script>

 4. 一级分类-激活状态显示和分类列表渲染

激活状态显示

RouterLink组件默认支持激活样式显示的类名,只需要给 active-class属性设置对应的类名 即可

 分类列表渲染

分类的数据已经在面包屑导航实现的时候获取到了,只需要通过v-for遍历出来即可
//src/views/Category/index.vue
<div class="sub-list">
  <h3>全部分类</h3>
  <ul>
    <li v-for="i in categoryData.children" :key="i.id">
      <RouterLink to="/">
        <img :src="i.picture" />
        <p>{{ i.name }}</p>
      </RouterLink>
    </li>
  </ul>
</div>
<div class="ref-goods" v-for="item in categoryData.children" :key="item.id">
  <div class="head">
    <h3>- {{ item.name }}-</h3>
  </div>
  <div class="body">
    <GoodsItem v-for="good in item.goods" :goods="good" :key="good.id" />
  </div>
</div>

注意:这里引用了GoodsItem组件,所以记得引入进去。

5. 一级分类-解决路由缓存问题

 当组件实例复用了,生命周期钩子函数就不会调用,就不会执行里面的函数,所以就得不到数据。一级分类就是如此,当我们点击时,只是参数的变化,所以我们需要解决路由缓存。

解决方法:

方法一:让组件实例不复用,强制销毁重建。

方法一存在的问题:因为 轮播图是一样的,所以不需要每一次都重新获取一次,消耗性能。

方法二:监听路由变化,变化之后执行数据更新操作

在src/views/Category/index.vue中

 6.一级分类-使用逻辑函数拆分业务

需求:把同一个组件中的独立的代码通过函数封装起来,方便以后维护。

在category分类页面,就是获取分类的代码和获取轮播图的代码。

把这两个逻辑代码封装。

实现步骤:
1. 按照业务声明以 `use` 打头 的逻辑函数
2. 把 独立的业务逻辑 封装到各个函数内部
3. 函数内部把组件中需要用到的数据或者方法 return出去
4. 在 组件中调用函数 把数据或者方法组合回来使用

步骤:

1)在Category中创建composables文件夹,存储这两段代码。 

2)把独立的逻辑代码封装到函数中

//src/views/Category/composables/userBanner.js
// 封装banner轮播图的代码
import {ref ,onMounted} from 'vue'
import { getBannerAPI } from "@/apis/home";

export function useBanner() {
    const bannerList = ref([]);
    const getBanner = async () => {
        const res = await getBannerAPI({ distributionSite: "2" });
        console.log(res);
        bannerList.value = res.result;
    };
    onMounted(() => {
        getBanner();
    });
    // 此时的bannerList在另一个文件里面需要使用,使用要return出去
    return {
        bannerList
    }
}
//src/views/Category/composables/userCategory.js
// 封装分类数据业务相关的代码
import {ref,onMounted} from 'vue'
import {onBeforeRouteUpdate, useRoute } from "vue-router";
import { getCategoryAPI } from "@/apis/category";

export function useCategory() {
    // 获取分类数据
    const categoryData = ref({});
    // 使用useRoute获取传过来的参数
    const route = useRoute();
    const getCategory = async (id = route.params.id) => {
        const res = await getCategoryAPI(id);
        categoryData.value = res.result;
    };
    onMounted(() => getCategory());

    // 目标:路由参数变化的时候,可以把分类数据接口重新发送
    onBeforeRouteUpdate((to) => {
        console.log('路由变化了');
        // 存在的问题:使用最新的路由参数请求最新的分类数据
        console.log(to);
        getCategory(to.params.id)
    })
    
    return {categoryData}
}

3)在组件中调用函数 

核心思想:

1. 逻辑拆分的过程是一个拆分再组合的过程

2. 函数use打头,内部封装逻辑,return组件需要用到的数据和方法给组件消费

总结:

1.在vue3中,路由传参记得使用useRoute来传递参数。
2.在轮播图实现中,由于只是和首页轮播图的接口参数不同,所以可以通过适配接口来使用同样的函数。
3.在使用带参数的路由时,相同的组件实例会被重复使用,生命周期钩子函数也不会被调用,所以需要解决路由缓存问题。
4.在同一个组件中,如果有多个独立的代码,可以通过以'use'开头的函数封装起来,后期通过调用函数来实现,也有利于后期的维护。(记得return 出去

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Cloud项目中实现三级分类,可以采用树形结构的方式实现。具体步骤如下: 1. 定义一个分类类,包含分类ID、分类名称、分类父ID等属性。 ``` public class Category { private int id; private String name; private int parentId; // getter和setter方法省略 } ``` 2. 构建树形结构,可以使用递归方式实现。首先需要定义一个方法,该方法接收一个分类列表和一个父分类ID,返回该父分类下的所有子分类。 ``` private List<Category> getChildren(List<Category> categories, int parentId) { List<Category> children = new ArrayList<>(); for (Category category : categories) { if (category.getParentId() == parentId) { children.add(category); List<Category> grandchildren = getChildren(categories, category.getId()); children.addAll(grandchildren); } } return children; } ``` 3. 在Spring Cloud项目中,可以定义一个RESTful API接口,用于获取分类列表。 ``` @RestController @RequestMapping("/categories") public class CategoryController { @Autowired private CategoryService categoryService; @GetMapping("") public List<Category> getAllCategories() { return categoryService.getAllCategories(); } } ``` 4. 在前端中,可以使用Vue.js实现树形结构的展示。首先需要定义一个组件,用于展示单个分类的信息。 ``` <template> <div> <span>{{ category.name }}</span> <ul v-if="category.children"> <category-item v-for="child in category.children" :key="child.id" :category="child"></category-item> </ul> </div> </template> <script> export default { name: 'category-item', props: { category: { type: Object, required: true } } } </script> ``` 5. 在前端中,可以定义一个根组件,用于展示整个分类树。 ``` <template> <div> <category-item v-for="category in categories" :key="category.id" :category="category"></category-item> </div> </template> <script> import CategoryItem from './CategoryItem.vue' export default { name: 'category-tree', components: { CategoryItem }, data() { return { categories: [] } }, mounted() { axios.get('/categories').then(response => { this.categories = response.data }) } } </script> ``` 以上就是使用Spring Cloud和Vue.js实现三级分类的步骤。在实际开发中,还需要考虑数据的缓存和更新等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值