当前位置:   article > 正文

微信小程序(黑马优购:加入购物车)_微信小程序黑马优购源代码

微信小程序黑马优购源代码

1.配置Vuex 

1).创建store.js目录

  1. import Vue from 'vue'
  2. import Vuex from 'vuex'
  3. Vue.use(Vuex)
  4. const store = new Vuex.Store({
  5. modules:{}
  6. })
  7. export default store

2).pages.json中配置

  1. import store from '@/store/store.js'
  2. const app = new Vue({
  3. ...App,
  4. ///挂载
  5. store
  6. })

3).配置cart.js

  1. export default{
  2. namespaced: true,
  3. state: ()=> ({
  4. //购物车的数组,用来存储购物车中每个商品的信息对象
  5. //每个商品的信息对象,都包含如下6个属性
  6. //{goods_id,goods_name,goods_price,goods_count,goods_small_logo,goods_state}
  7. cart: []
  8. }),
  9. mutations: {
  10. },
  11. getters: {
  12. }
  13. }

store.js中引入cart.js

  1. import Vue from 'vue'
  2. import Vuex from 'vuex'
  3. import moduleCart from '@/store/cart.js'
  4. Vue.use(Vuex)
  5. const store = new Vuex.Store({
  6. modules:{
  7. 'm_cart': moduleCart
  8. }
  9. })
  10. export default store

2.把cart.js的cart数组到当前页面

  1. import { mapState } from 'vuex'
  2. export default {
  3. computed: {
  4. ...mapState('m_cart',['cart'])
  5. },

3.定义addToCart对象

cart.js

  1. export default{
  2. namespaced: true,
  3. state: ()=> ({
  4. //购物车的数组,用来存储购物车中每个商品的信息对象
  5. //每个商品的信息对象,都包含如下6个属性
  6. //{goods_id,goods_name,goods_price,goods_count,goods_small_logo,goods_state}
  7. cart: []
  8. }),
  9. mutations: {
  10. addToCart(state,goods){
  11. const findResult = state.cart.find(x => x.goods_id === goods.goods_id)
  12. if(!findResult){
  13. state.cart.push(goods)
  14. }else{
  15. findResult.goods_count++
  16. }
  17. }
  18. },
  19. getters: {
  20. }
  21. }

4.在goods_detail.vue中调用

  1. import { mapState, mapMutations } from 'vuex'
  2. methods: {
  3. ...mapMutations('m_cart'),

1)调用cart.js中的addToCart

  1. methods: {
  2. ...mapMutations('m_cart',['addToCart']),

5.定义getters

  1. getters: {
  2. total(state){
  3. let c = 0
  4. state.cart.forEach(x => c += x.goods_count)
  5. return c
  6. }

1)在goods_detail中进行映射

  1. //定义一个监听器
  2. watch:{
  3. //1.监听total值的变化,通过第一个形参得到变化后的新值
  4. total(newVal){
  5. //2.通过数组的find()方法,找到购物车按钮的配置对象
  6. const findResult = this.options.find(x => x.text === '购物车')
  7. if(findResult){
  8. //3.动态为购物车按钮的info属性赋值
  9. findResult.info = newVal
  10. }
  11. }
  12. },

6.持久化存储购物车的商品

  1. export default{
  2. namespaced: true,
  3. state: ()=> ({
  4. //购物车的数组,用来存储购物车中每个商品的信息对象
  5. //每个商品的信息对象,都包含如下6个属性
  6. //{goods_id,goods_name,goods_price,goods_count,goods_small_logo,goods_state}
  7. cart: JSON.parse(uni.getStorageSync('cart') || '[]')
  8. }),
  9. mutations: {
  10. addToCart(state,goods){
  11. //根据提交的商品的id,查询购物车中是否存在这件商品
  12. //如果不存在,则findResult为undefined;否则,为查找到的商品信息对象
  13. const findResult = state.cart.find(x => x.goods_id === goods.goods_id)
  14. if(!findResult){
  15. //如果购物车中没有这件商品,则直接push
  16. state.cart.push(goods)
  17. }else{
  18. //如果购物车中有这件商品,则只更新数量即可
  19. findResult.goods_count++
  20. }
  21. //通过commit方法,调用m_cart命名空间的saveToStorage方法
  22. this.commit('m_cart/saveToStorage')
  23. },
  24. saveToStorage(state){
  25. uni.setStorageSync('cart',JSON.stringify(state.cart))
  26. }
  27. },
  28. getters: {
  29. total(state){
  30. let c = 0
  31. state.cart.forEach(x => c += x.goods_count)
  32. return c
  33. }
  34. }
  35. }

7.优化商品详情页的total侦听器

这样可以确保一刷新就加载购物车数

  1. //定义一个监听器
  2. watch:{
  3. //1.监听total值的变化,通过第一个形参得到变化后的新值
  4. // total(newVal){
  5. // //2.通过数组的find()方法,找到购物车按钮的配置对象
  6. // const findResult = this.options.find(x => x.text === '购物车')
  7. // if(findResult){
  8. // //3.动态为购物车按钮的info属性赋值
  9. // findResult.info = newVal
  10. // }
  11. // }
  12. total: {
  13. handler(newVal){
  14. const findResult = this.options.find(x => x.text === '购物车')
  15. if(findResult){
  16. findResult.info = newVal
  17. }
  18. },
  19. //immediate属性用来声明次侦听器,是否在页面初次加载完毕后立即调用
  20. immediate: true
  21. }
  22. },

8.点击商品详情页购物车图标跳转到购物车页面

  1. <template>
  2. <view>
  3. cart
  4. </view>
  5. </template>
  6. <script>
  7. import { mapGetters } from 'vuex'
  8. export default {
  9. //计算属性
  10. computed: {
  11. ...mapGetters('m_cart',['total'])
  12. },
  13. onShow(){
  14. this.setBadge()
  15. },
  16. data() {
  17. return {
  18. }
  19. },
  20. methods: {
  21. setBadge(){
  22. uni.setTabBarBadge({
  23. index:2,
  24. text: this.total + ''
  25. })
  26. }
  27. }
  28. }
  29. </script>
  30. <style>
  31. </style>

9.创建minixs目录进行封装

tabbar-badage.js配置,减少重复代码

  1. import { mapGetters } from 'vuex'
  2. export default {
  3. //计算属性
  4. computed: {
  5. ...mapGetters('m_cart',['total'])
  6. },
  7. onShow(){
  8. this.setBadge()
  9. },
  10. methods: {
  11. setBadge(){
  12. uni.setTabBarBadge({
  13. index:2,
  14. text: this.total + ''
  15. })
  16. }
  17. }
  18. }

cart.vue页面配置,(其他tabbar页面也是同样配置)

  1. <template>
  2. <view>
  3. cart
  4. </view>
  5. </template>
  6. <script>
  7. import badgeMix from '@/mixins/tabbar-badge.js'
  8. export default {
  9. mixins: [badgeMix],
  10. data() {
  11. return {
  12. }
  13. }
  14. }
  15. </script>
  16. <style>
  17. </style>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/654172
推荐阅读
相关标签
  

闽ICP备14008679号