vue|Vue项目的记录(四)

1. 过渡动画 vue中过渡的知识点: 参考 https://blog.csdn.net/weixin_44482737/article/details/126192726
vue|Vue项目的记录(四)
文章图片

vue|Vue项目的记录(四)
文章图片

vue|Vue项目的记录(四)
文章图片

vue|Vue项目的记录(四)
文章图片

vue|Vue项目的记录(四)
文章图片

2. 商品分类列表的优化 vue|Vue项目的记录(四)
文章图片

vue|Vue项目的记录(四)
文章图片

项目:home切换到search或者search切换到home,会发现一件事情,就是组件在频繁的向服务器发请求,来获取三级联动的数据进行展示。
项目中如果频繁的向服务器发请求,很耗性能的,因此需要进行优化。
原因:为什么会频繁的向服务器发请求获取三级联动的数据那?
回答:因为路由跳转的时候,组件会进行销毁的【home组件的created:在向vuex派发action,因此频繁的获取三级联动的数据】只需要发一次请求,获取到三级联动的数据即可,不需要多次。
最终解决方案:在App.vue中发送请求即可
3. 参数合并 vue|Vue项目的记录(四)
文章图片

vue|Vue项目的记录(四)
文章图片

4. mockjs模拟数据 Mockjs: 用来拦截ajax请求, 生成随机数据返回

  1. 在项目当中src文件夹中创建mock文件夹
    vue|Vue项目的记录(四)
    文章图片

  2. 第二步准备JSON数据(mock 文件夹中创建相应的JSON文件) ,进行格式化,不要留有空格(跑不起来的)
    vue|Vue项目的记录(四)
    文章图片

  3. 把mock数据需要的图片放置到public文件夹中(public文件夹在打包的时候,会把相应的资源原封不动打包到dist文件夹)
    vue|Vue项目的记录(四)
    文章图片

  4. 创建mockSerer . js通过mockj s插件实现模拟数据
    vue|Vue项目的记录(四)
    文章图片

  5. mockServer. js文件在入口文件中引入(至少需要执行一次,才能模拟数据) 不然等于没用
    mockServe当成一个本地服务器,然后这个mockServe就是服务器的入口文件,只需要运行一下就是启动了,入口文件则不用暴露
    vue|Vue项目的记录(四)
    文章图片

  6. 在API文件夹中创建mockRequest (axios实例:baseURL:‘/mock’),专门获取模拟数据用的axios实例。
    vue|Vue项目的记录(四)
    文章图片

    在api中的index.js中配置mockjs数据的接口
    vue|Vue项目的记录(四)
    文章图片

  7. 在轮播图组件(listContainer)中派发action , vuex三件套
    vue|Vue项目的记录(四)
    文章图片

    actions
    vue|Vue项目的记录(四)
    文章图片

    mutations 和 state
    vue|Vue项目的记录(四)
    文章图片

  8. 放置在组件中
    vue|Vue项目的记录(四)
    文章图片

  9. :swiper在Vue项目中使用 (swiper实例必须在结构完整出现后才能实例化)
    1.swiper安装到项目当中 npm i swiper@5
    2.在相应的组件引入 swiper.js || swiper.css
    3.但是需要注意,home模块很多组件都使用到swiper.css,没必要在每一个组件内部都引入样式一次,只需要在入口文件引入一次即可。
    main.js中引入
    vue|Vue项目的记录(四)
    文章图片

    组件中导入包(listContainer)
    vue|Vue项目的记录(四)
    文章图片

  10. 重点
    1)初始化swiper实例在哪里书写?
    初始化swiper实例之前,页面中的节点(结构)务必要有,
    对于Vue一个组件而言,首先会想到mounted(组件挂载完毕:相应的结构不就有了吗)
    mounted–>组件挂载完毕
2)出现问题,动态效果为什么没有出来?
Swiper需要获取到轮播图的节点DOM,才能给swiper轮播添加动态效果,因为没有获取到节点。
那是因为dispatch涉及到异步的操作,导致v-for遍历的时候结构还没有完全,因此在mounted中发送请求了之后,还没获得轮播图的数据,swiper就开始初始化了。
vue|Vue项目的记录(四)
文章图片

3)第一种解决方案,延迟器(不是完美的解决方案)
created里面:created执行与mounted执行,时间差可能2ms,白扯
updated里面:如果组件有很多响应式(data),只要有一个属性值发生变化updated还会再次执行,再次初始化实例。
mounted() { //派发action:通过Vuex发起ajax请求,把数据仓储在仓库中 this.$store.dispatch("getBannerList"); //在new Swiper实例之前,页面的结构必须要有,如果没实现,应该是结构不完整 //因为dispatch当中涉及到异步语句,导致v-for遍历的时候结构还没有完整 因此不行 setTimeout(() => { var mySwiper = new Swiper(".swiper-container", { loop: true, // 循环模式选项 // 如果需要分页器 pagination: { el: ".swiper-pagination", clickable:true //点击小球也切换图片 }, // 如果需要前进后退按钮 navigation: { nextEl: ".swiper-button-next", prevEl: ".swiper-button-prev", }, }) },1000); },

总结:第一种解决方案可以通过延迟器(异步)去解决问题,
但是这种解决方案存在风险(无法确定用户请求到底需要多长时间),因此没办法确定延迟器时间。
4)Swiper在Vue项目中使用完美解决方案
a.第一种解决方案问题出现在哪里:v-for,在遍历来自于Vuex(数据:通过ajax向服务器发请求,存在异步)
b. watch:监听属性,watch可以检测到属性值的变化,当属性值发生变化的时候,可以触发一次。
c. Vuex当中的仓库数据bannerList(组件在使用):
问:bannerList仓库数据有没有发生过变化?
答:一定是有的:bannerList初始值空数组,当服务器的数据返回以后,它的bannerList存储的属性值会发生变化(变为服务器返回的数据)
组件实例在使用仓库中的bannerList,组件的这个属性bannerList一定是发生过变化,watch可以监听到。
【vue|Vue项目的记录(四)】nextTick解释:
在下次DOM更新, 循环结束之后,执行延迟回调。在 修改数据之后 立即使用这个方法,获取更新后的DOM。
注意:组件实例的$nextTick方法,在工作当中经常使用,经常结合第三方插件使用,获取更新后的DOM节点
vue|Vue项目的记录(四)
文章图片

    推荐阅读