• web学习笔记(六十六)项目总结


    目录

    1. Suspense标签

    2.发布订阅者模式

    3.pinia的使用

    4.在请求过来的数据添数据

    5.设置token和取token

    6. 实现触底加载

    7.导航守卫判断登录状态。


    1. Suspense标签

    Suspense主要用于用于处理异步组件加载和数据获取。,使用这个标签可以允许你在组件等待数据或资源加载时显示一个占位符(通常是加载指示器),并在数据准备好后显示实际内容。这对用户体验来说非常重要,因为可以避免在数据加载过程中用户看到空白页面或不完整的内容。一般当我们请求数据都会用到async和await,此时就可以在app.vue页面中用  包裹住页面占位符  进行使用。

    1. <Suspense>
    2. <RouterView>RouterView>
    3. Suspense>

    2.发布订阅者模式

    发布订阅者模式中得先触发发布的语句,订阅方才会获得数据,所以在组件路由中获取数据并发布,在app.vue及其他路由组件中进行订阅是无法实现实时更新的,比如购物车的数量。此时我们可以使用pinia来完成这个操作,这两者有本质的区别,前者是用来传值的,后者是用来实现全局状态共享。

    3.pinia的使用

    (1)下载对应的库文件,如果在构建脚手架时已经选择了使用pinia进行状态管理那就不用再单独下载pinia了。

    npm i pinia

    (2)在main.js文件中配置pinia

    1. import { createPinia } from 'pinia'
    2. app.use(createPinia())

    (3)在stores文件夹下创建.js文件,然后在文件中编写相关共享状态的数据,通常我们将一类状态编写在同一个.js文件中,在这个文件中需要导出defineStore,并暴露useCounter模块。 state属性是配置公告状态(数据)actions:定义修改公共状态的方法

    1. import { defineStore } from "pinia";
    2. export const useCounter = defineStore("counter", {
    3. // state属性:配置公共状态(数据)
    4. state: () => {
    5. return { count: 0};
    6. },
    7. // actions:定义修改公共状态的方法
    8. actions: {
    9. increment() {
    10. this.count++;
    11. }
    12. }
    13. },);

    (4)在需要用到useCounter的组件中进行导入和初始化的操作。

    1. // 导入pinia
    2. import { useCounter } from '@/stores/counter.js'
    3. // 初始化对象
    4. const counter = useCounter()

    (5)通过counter 来调用相关变量和方法 

    1. counter.increment()
    2. counter.count=number.value

    4.在请求过来的数据添数据

    当请求过来的数据比我们需要的数据少时,我们可以自己将所需数据添加进去,比如分类中的全部,通常是接口数据中不包含的,此时就需要我们自己将分类添加到数据中去。

    (1)在初始化时就将全部的数据以对象的方式放入数组中

    1. // 初始商品分类的数据
    2. const Categoricallists = ref([{ id: 0, cate_name: '全部' }])

    (2)使用.push的方式将接口返回的数据添加到 数组Categoricallists中。注意:我们从接口中拿到的是一个数组,在push时需要将数据解构出来。

    1. const sidebarreq = async () => {
    2. const sidebarres = await http(`/api/category`)
    3. sidebararr.value = sidebarres.data
    4. Categoricallists.value.push(...data[0].children)
    5. }
    6. sidebarreq()

    5.设置token和取token

    设置token(将token存到本地存储中):  localStorage.setItem('data', data.data.token)

    取token(从本地存储中取token):const token = localStorage.getItem('data')

    6. 实现触底加载

    (1)给盒子添加滚动事件

     
    class="box" @scroll="pageScroll">

    (2)写触底加载事件的逻辑

    1. // 触底事件
    2. const pageScroll = async (e) => {
    3. const sTop = e.target.scrollTop // 容器已滚动高度
    4. const sHeight = e.target.scrollHeight // 容器内容总高度
    5. const cHeight = e.target.clientHeight // 容器元素高度
    6. if (sHeight - sTop <= cHeight) {
    7. console.log('触底了')
    8. }
    9. }

    (3)注意需要给box设置固定的高度,不能把高度设为auto。

    7.导航守卫判断登录状态。

     在index.js中写入相关代码,注意,此时如果没有登录,在跳转登录页面时我们已经通过to.path将我们需要跳转到的页面以参数的形式传递到了登录页面,我们可以在登录页面进行获取,如何进行路由的重定向

    1. router.beforeEach((to, from,next) => {
    2. // to:目的地页面路由 from:当前要切换的路由
    3. // 返回false以取消导航
    4. // 一般需要授权验证的页面才需要拦截,其他页面直接放行。
    5. if (to.path == '/Shoppingcart'||to.path == '/Personal') {
    6. if (localStorage.getItem('data')) next();//已登录,允许跳转
    7. else {
    8. console.log('请先登录');
    9. next(`/login?target=${to.path}`)//跳转登录页面
    10. }
    11. }
    12. // return false
    13. else {
    14. next();//使用了next参数就不再使用返回值true/false来决定是否跳转。因为next()不带参数等价于return true,允许跳转
    15. }
    16. // 保证任意条件下next只执行一次
    17. })

    路由的重定向:

    1. // 重定向路由
    2. router.replace(route.query.target)



     

  • 相关阅读:
    【听课笔记】复旦大学遗传学_10肿瘤遗传学
    【Flink】Flink任务缺失Jobmanager日志的问题排查
    【算法题】2530.执行 K 次操作后的最大分数
    Go - 用户服务和Web服务
    ArangoDB 学习笔记(二)
    edgexfoundry device-sdk-c编译过程记录
    @Autowired与@Resource区别
    网络层学习常见问题及答案整理
    「运维有小邓」审核并分析文件和文件夹访问权限
    MySQL - 深入理解锁机制和实战场景
  • 原文地址:https://blog.csdn.net/shan33__/article/details/139936322