最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue加入購物車判斷token添加登錄提示功能

 更新時(shí)間:2023年11月27日 14:12:42   作者:自學(xué)Java筆記本  
加入購物車,是一個(gè)登錄后的用戶 才能進(jìn)行的操作,所以需要進(jìn)行鑒權(quán)判斷,判斷用戶token是否存在,這篇文章主要介紹了Vue加入購物車判斷token添加登錄提示,需要的朋友可以參考下

Vue-加入購物車-判斷token添加登錄提示

目標(biāo):給未登錄的用戶,添加登錄提示
說明:加入購物車,是一個(gè)登錄后的用戶 才能進(jìn)行的操作,所以需要進(jìn)行鑒權(quán)判斷,判斷用戶token是否存在

  • 若存在:繼續(xù)加入購物車操作
  • 不存在:提示用戶未登錄,引導(dǎo)到登錄頁,登錄完回跳
addCart () {
      // 判斷 token 是否存在
      // 1.如果token不存在,彈確認(rèn)框
      // 2.如果token存在,繼續(xù)請(qǐng)求操作
      if (!this.$store.getters.token) {
        // 彈確認(rèn)框
        this.$dialog.confirm({
          title: '溫馨提示',
          message: '此時(shí)需要先登錄才能繼續(xù)操作哦',
          confirmButtonText: '去登錄',
          cancelButtonText: '再逛逛'
        })
          .then(() => {
            // 點(diǎn)擊確認(rèn)表示用戶要去登錄界面,此時(shí)讓路由跳轉(zhuǎn)
            // 如果希望,跳轉(zhuǎn)到登錄 =》登錄后能回跳回來,需要在跳轉(zhuǎn)去攜帶參數(shù),(當(dāng)前的路徑地址)
            // this.$route.fullPath(會(huì)包含查詢參數(shù))
            this.$router.replace({
              path: '/login',
              query: {
                backUrl: this.$route.fullPath
              }
            })
          })
          .catch(() => {
            // on cancel
          })
        return
      }
      console.log('正常請(qǐng)求')
    }

當(dāng)用戶點(diǎn)擊去登錄后:頁面會(huì)封裝成一個(gè)請(qǐng)求參數(shù)到login界面,隨后要在login界面中通過路由的方式去判單是否有回調(diào)url,如果有則登錄成功后回到當(dāng)前界面。

對(duì)于一些后端接口,尤其是用戶權(quán)限等,我們需要在請(qǐng)求頭中攜帶token信息,對(duì)此在請(qǐng)求攔截器上進(jìn)行配置

基于vuex管理購物車模塊

說明:購物車 數(shù)據(jù)聯(lián)動(dòng)關(guān)系較多,且通常會(huì)封裝一些小組件,所以為了便于維護(hù),一般都會(huì)將購物車的數(shù)據(jù)基于vuex分模塊管理

需求分析:

  • 基本靜態(tài)結(jié)構(gòu)
  • 構(gòu)建vuex cart模塊,獲取數(shù)據(jù)存儲(chǔ)
  • 基于數(shù)據(jù) 動(dòng)態(tài)渲染 購物車列表
  • 封裝getters 實(shí)現(xiàn)動(dòng)態(tài)統(tǒng)計(jì)
  • 全選反選功能
  • 數(shù)字框修改數(shù)量功能
  • 編輯切換狀態(tài),刪除功能
  • 空購物車處理

對(duì)于vuex cart模塊來說:

import { getCartList, updateCart } from '@/api/cart'
export default {
  namespaced: true,
  state () {
    return {
      cartList: [] // 購物車列表
    }
  },
  mutations: {
    // 提供一個(gè)修改 cartList 的方法
    setCartList (state, payload) {
      state.cartList = payload
    },
    setCartTotal (state, payload) {
      state.cartTotal = payload
    },
    // 切換狀態(tài)
    toggleCheck (state, goodsId) {
      const goods = state.cartList.find(item => item.goods_id === goodsId)
      goods.isChecked = !goods.isChecked
    },
    // 全不選或全選
    toggleAll (state, isChecked) {
      state.cartList.forEach(item => {
        item.isChecked = !isChecked
      })
    },
    // 修改列表中的數(shù)量,根據(jù)id修改
    changeCount (state, { goodsId, goodsNum }) {
      const goods = state.cartList.find(item => item.goods_id === goodsId)
      goods.goods_num = goodsNum
    }
  },
  actions: {
    // 獲取購物車列表
    async getCartListAction (content) {
      const { data: { list } } = await getCartList()
      // 后臺(tái)返回的數(shù)據(jù)中,不包含復(fù)選框的選中狀態(tài),為了實(shí)現(xiàn)將來的的功能
      // 需要手動(dòng)維護(hù)數(shù)據(jù),給每一項(xiàng),添加一個(gè)isChecked狀態(tài),(標(biāo)記當(dāng)前商品是否選中)
      list.forEach(item => {
        item.isChecked = true
      })
      console.log('list', list)
      // 調(diào)用mutations,實(shí)現(xiàn)對(duì)state的修改
      content.commit('setCartList', list)
    },
    async changeCountAction (content, obj) {
      const { goodsNum, goodsId, goodsSkuId } = obj
      // 先本地修改
      content.commit('changeCount', { goodsId, goodsNum })
      // 在同步到后臺(tái)
      await updateCart(goodsId, goodsNum, goodsSkuId)
    }
  },
  getters: {
    // 求所有的商品累加總數(shù)
    cartTotal (state) {
      return state.cartList.reduce((sum, item) => sum + item.goods_num, 0)
    },
    // 選中的商品項(xiàng)
    selCartList (state) {
      return state.cartList.filter(item => item.isChecked)
    },
    // 對(duì)于getter來說,可以通過 getters 作為第二個(gè)參數(shù)去訪問我們getters中定義的計(jì)算屬性
    // 選中的總數(shù)
    selCartCount (state, getters) {
      return getters.selCartList.reduce((sum, item) => sum + item.goods_num, 0)
    },
    // 選中的總價(jià)
    selCartPrice (state, getters) {
      return getters.selCartList.reduce((sum, item) => sum + item.goods_num * item.goods.goods_price_min, 0).toFixed(2)
    },
    // 是否全選
    isAllChecked (state, getters) {
      return state.cartList.every(item => item.isChecked)
    }
  }
}

對(duì)于購物車組件來說:

<script>
import CountBox from '@/components/CountBox'
import { mapActions, mapGetters, mapState } from 'vuex'
export default {
  name: 'CartPage',
  components: {
    CountBox: CountBox
  },
  computed: {
    ...mapState('cart', ['cartList']),
    ...mapGetters('cart', ['cartTotal', 'selCartCount', 'selCartPrice', 'selCartList', 'isAllChecked'])
  },
  methods: {
    ...mapActions('cart', ['getCartListAction']),
    init () {
      if (this.$store.getters.token) {
        // 必須是登錄過的用戶,才能獲取購物車列表
        this.getCartListAction()
      }
    },
    // 切換選中狀態(tài)
    toggleCheck (goodsId) {
      this.$store.commit('cart/toggleCheck', goodsId)
    },
    // 全選或反選
    toggleAllCheck () {
      this.$store.commit('cart/toggleAll', this.isAllChecked)
    },
    // 數(shù)字框點(diǎn)擊事件
    async changeCount (goodsNum, goodsId, goodsSkuId) {
      // 調(diào)用 vuex 的action,進(jìn)行數(shù)量修改
      this.$store.dispatch('cart/changeCountAction', {
        goodsNum,
        goodsId,
        goodsSkuId
      })
    }
  },
  data () {
    return {
    }
  },
  created () {
    this.init()
  }
}
</script>

到此這篇關(guān)于Vue-加入購物車-判斷token添加登錄提示的文章就介紹到這了,更多相關(guān)vue登錄token內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Vue實(shí)現(xiàn)文字轉(zhuǎn)語音播放功能的示例代碼

    基于Vue實(shí)現(xiàn)文字轉(zhuǎn)語音播放功能的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何基于Vue實(shí)現(xiàn)文字轉(zhuǎn)語音播放應(yīng)用,具有美觀的界面和完整的交互功能,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-12-12
  • 計(jì)算屬性和偵聽器詳情

    計(jì)算屬性和偵聽器詳情

    這篇文章主要介紹了計(jì)算屬性和偵聽器,文章以介紹計(jì)算屬性、偵聽器的相關(guān)資料展開詳細(xì)內(nèi)容,需要的朋友可以參考一下,希望對(duì)你有所幫助
    2021-11-11
  • vue實(shí)現(xiàn)拖拽窗口功能

    vue實(shí)現(xiàn)拖拽窗口功能

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)拖拽窗口功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • vue的代理配置pathRewrite重寫不生效問題及解決

    vue的代理配置pathRewrite重寫不生效問題及解決

    這篇文章主要介紹了vue的代理配置pathRewrite重寫不生效問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue中如何實(shí)現(xiàn)后臺(tái)管理系統(tǒng)的權(quán)限控制的方法示例

    vue中如何實(shí)現(xiàn)后臺(tái)管理系統(tǒng)的權(quán)限控制的方法示例

    這篇文章主要介紹了vue中如何實(shí)現(xiàn)后臺(tái)管理系統(tǒng)的權(quán)限控制的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-09-09
  • vue interceptor 使用教程實(shí)例詳解

    vue interceptor 使用教程實(shí)例詳解

    本文通過實(shí)例代碼給大家介紹了vue interceptor 使用,需要的朋友可以參考下
    2018-09-09
  • 如何使用vue-json-viewer插件展示JSON格式數(shù)據(jù)

    如何使用vue-json-viewer插件展示JSON格式數(shù)據(jù)

    這篇文章主要給大家介紹了關(guān)于如何使用vue-json-viewer插件展示JSON格式數(shù)據(jù)的相關(guān)資料,Vue-json-viewer是一個(gè)Vue組件,用于在Vue應(yīng)用中顯示JSON數(shù)據(jù)的可視化工具,需要的朋友可以參考下
    2023-11-11
  • Vue組件文檔生成工具庫的方法

    Vue組件文檔生成工具庫的方法

    本文主要介紹了Vue組件文檔生成工具庫的方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Vue.js 中 ref 和 reactive 的區(qū)別及用法解析

    Vue.js 中 ref 和 reactive 的區(qū)別及用法解析

    在Vue.js中,ref主要用于創(chuàng)建響應(yīng)式的引用,通過.value屬性來訪問和修改值,特別適用于需要頻繁更改整個(gè)值的場(chǎng)景,而reactive則用于創(chuàng)建深度響應(yīng)的對(duì)象或數(shù)組,本文給大家介紹Vue.js 中 ref 和 reactive 的區(qū)別及用法,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • 談?wù)勔騐ue.js引發(fā)關(guān)于getter和setter的思考

    談?wù)勔騐ue.js引發(fā)關(guān)于getter和setter的思考

    最近因?yàn)楣镜男马?xiàng)目決定使用Vue.js來做,但在使用的過程中發(fā)現(xiàn)了一個(gè)有趣的事情,因?yàn)榘l(fā)現(xiàn)的這個(gè)事情展開了一些對(duì)于getter和setter的思考,具體是什么下面通過這篇文章來一起看看吧,有需要的朋友們可以參考學(xué)習(xí)。
    2016-12-12

最新評(píng)論

图片| 北碚区| 临汾市| 宣汉县| 淮滨县| 大城县| 吉安县| 常德市| 巴中市| 上饶市| 阿瓦提县| 博乐市| 栖霞市| 扶余县| 沙田区| 石楼县| 高邑县| 汤原县| 鸡西市| 宜宾县| 岚皋县| 镇远县| 淳化县| 镇赉县| 昭觉县| 中阳县| 婺源县| 铜梁县| 遂川县| 禄丰县| 探索| 申扎县| 广平县| 淄博市| 公主岭市| 琼海市| 博爱县| 南皮县| 罗田县| 长治市| 博乐市|