记录vue项目中遇到的问题

本文记录了一位开发者在Vue.js项目中遇到的问题及解决方法,涉及路由参数传递、Vuex状态管理、API请求、登录注册、导航守卫、ElementUI使用等方面,通过实例详细阐述了解决方案。

开发某一个产品的详情页面

  • 静态页面
  • 发请求
  • vuex
  • 动态展示组件

1.点击产品的图片的时候,跳转到详情页面,在路由跳转的时候需要带上产品的ID给详情页面,且是params参数

 

 在路由跳转的时候带商品ID

 跳转到详情页面后,滚动条在底部,vue-router的解决办法,返回的y=0,代表的是滚动条在最上方

2. API请求接口

3.vuex获取产品详细信息

 state.goodInfo初始状态是空对象,空对象的categoryView属性值是undefined

并上一个空对象,当网络卡顿数据还没有加载出来,返回的就是一个空对象

如果服务器数据没有回来,skuInfo这个对象是一个空对象

使用了和硅谷老师一样的方法还是报上面那个警告:Cannot read properties of undefined (reading '0')

最后v-if加了个判断

加入购物车

在点击加入购物车这个按钮的时候,需要将参数带给服务器(发请求),通知服务器加入购物车的产品是谁。

派发一个action

请求成功,进行路由跳转,如果失败,给出错误提示

 注册添加购物车成功的路由

 路由跳转

 this.$router.push({ name: "addcartsuccess" });

在进行路由跳转的时候还需要将产品的信息带给下一级的路由组件

AddCartSuccess组件接受会话存储的数据

当点击查看详情页时,要带着产品的id跳转到详情页

 向服务器发起ajax请求,获取购物车数据,操作vuex三连环,组件获取数据展示数据

在发请求的时候,获取不到你购物车里面的数据,因为服务器不知道你是谁--使用UUID临时游客身份,且UUID只生成一次永久保存

 但此时详情页跳转到添加购物车成功页面时,只允许携带两个参数skuId /skuNum

解决办法,在请求头添加参数!这个userTempId是后端人员写好的,一定不能写错,不然返回的数据为空。

复习删除所有选中商品与修改全部产品的选中状态

登录与注册

登录与注册功能(git)

--assets文件夹---放置全部组件公用静态资源

在样式中也可以使用@【src别名】,还要在其前面加上~

注册功能

点击获取验证码按钮,发起请求

vuex三连环

派发action  

commit

修改state中的数据

 // 将组件的code属性值变为仓库中验证码

        this.code = this.$store.state.user.code

点击注册按钮请求成功进行路由跳转

 登录功能

当注册成功后跳转到登录页面

点击登录按钮发起请求,跳转home页面

登录跳转到home首页时,需要携带用户的唯一标识token,才能在Header头部显示用户名

在请求头加上token

 此时出现了一个新的问题,页面刷新,获取不到用户信息--即获取不到token

因为vuex是非持久化存储----解决----本地存储

 退出登录

1.需要发请求,通知服务器退出登录【清楚数据:token】

2.清除项目中的数据【userInfo、token】

 

导航守卫

1.全局守卫:只要发生路由变化,守卫就能监听到使用全局前置守卫解决在非home页面刷新,用户信息为空的问题

// 全局守卫,前置守卫(在路由跳转之前进行判断)

router.beforeEach(async(to, form, next) => {

    // to:可以获取到你要跳转到哪个路由信息

    // from:可以获取到你从哪个路由而来的信息

    // next:放行函数

    // next()

    // 用户登录了,才会有token,未登录一定不会有token

    let token = store.state.user.token;

    // 用户信息

    let name = store.state.user.userInfo.name

        // 用户已经登录了

    if (token) {

        // 用户已经登录了还想去login页面

        if (to.path == '/login') {

            next('/')

        } else {

            // 登录,去的不是login【home|search|detail|shopcart】

            // 如果用户名已有

            if (name) {

                next()

            } else {

                // 没有用户信息,派发action让仓库存储用户信息再跳转

                try {

                    await store.dispatch('getUserInfo')

                    next()

                } catch (error) {

                    // token失效了获取不到用户信息,重新登录

                    // 清除token

                    await store.dispatch("userLogOut");

                    next('/login');

                }

            }

        }

    } else {

       // 未登录:不能到交易相关、不能到【pay|paysuccess】、不能去个人中心
        let toPath = to.path
        if (toPath.indexOf('/trade') != -1 || toPath.indexOf('/pay') != -1 || toPath.indexOf('/center') != -1) {
            //  把未登录的时候想去而没有去成的信息,存储于地址栏中【路由】
            next('/login?redirect=' + toPath)
        } else {
            next()
        }

    }

})

2.路由独享守卫

当用户交易成功时才跳pay路由

 3.组件内守卫

当用户支付成功时才能调paysuccess路由

 

交易页面

在动态展示商品总数量以及总金额一直报错。

vue.runtime.esm.js?c320:4605 [Vue warn]: Error in render: "TypeError: Cannot read properties of undefined (reading ‘totalNum’)"。

原因是我在计算totalNum时忽略了当orderInfo.detailArrayList初始值为空对象,空对象的xxx属性为undefined,而我在使用该属性时,undefined的xxx就会出现警告。

所以我在return 后面的返回值加上 或 || [] ,因为一开始的初始值就是个空数组。

 最后计算totalNum、totalPrice

 使用elementUI

在使用弹框组件时,点击确定报错

分析:出现Uncaught (in promise) cancel的原因因为this.$confirm方法内置promise方法不能去掉.catch(),没有.catch取消操作无法捕获.

加上.catch()

还有一个小bug,就是在点击按钮的时候会出现页面抖动现象

解决办法:在APP组件加上以下代码

 body {

        overflow: hidden;

        padding-right: 0 !important;

    }

个人中心二级路由

在一级路由组件中配置子路由组件

 声明式导航链接到个人订单与团购订单

 我的订单

定义获取订单的接口

当路由定位到/center/myorder时,发请求

 动态渲染页面

此时需要注意:当我们遍历数组时,有几个订单详情就会遍历几次,需要把rowspan动态赋值为数组的长度,且只显示index=0时的(这里不太懂)

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值