【vue2项目总结】—— vuex相关

简介: 【vue2项目总结】—— vuex相关

@[toc]

登录页面

存入vuex

1.新建 vuex user 模块 store/modules/user.js

export default {
   
  namespaced: true,//开启命名空间
  state () {
   
    return {
   
      userInfo: {
   
        token: '',
        userId: ''
      },
    }
  },
  mutations: {
   },
  actions: {
   }
}

2.挂载到 vuex 上

import Vue from 'vue'
import Vuex from 'vuex'
import user from './modules/user'

Vue.use(Vuex)

export default new Vuex.Store({
   
  modules: {
   
    user,
  }
})

3.提供 mutations

mutations: {
   
  setUserInfo (state, obj) {
   
    state.userInfo = obj
  },
},

4.页面中 commit 调用

// 登录按钮(校验 & 提交)
async login () {
   
  if (!this.validFn()) {
   
    return
  }
  ...
  const res = await codeLogin(this.mobile, this.msgCode)
  this.$store.commit('user/setUserInfo', res.data)
  this.$router.push('/')
  this.$toast('登录成功')
}

持久化处理

1.新建 utils/storage.js 封装方法

const INFO_KEY = 'hm_shopping_info'

// 获取个人信息
export const getInfo = () => {
   
  const result = localStorage.getItem(INFO_KEY)
  return result ? JSON.parse(result) : {
   
    token: '',
    userId: ''
  }
}

// 设置个人信息
export const setInfo = (info) => {
   
  localStorage.setItem(INFO_KEY, JSON.stringify(info))
}

// 移除个人信息
export const removeInfo = () => {
   
  localStorage.removeItem(INFO_KEY)
}

2.vuex user 模块持久化处理

import {
    getInfo, setInfo } from '@/utils/storage'
export default {
   
  namespaced: true,
  state () {
   
    return {
   
      userInfo: getInfo()
    }
  },
  mutations: {
   
    setUserInfo (state, obj) {
   
      state.userInfo = obj
      setInfo(obj)
    }
  },
  actions: {
   }
}

购物车

1.新建 modules/cart.js 模块

export default {
   
  namespaced: true,
  state () {
   
    return {
   
      cartList: []
    }
  },
  mutations: {
   
  },
  actions: {
   
  },
  getters: {
   
  }
}

2.挂载到 store 上面

import Vue from 'vue'
import Vuex from 'vuex'
import user from './modules/user'
import cart from './modules/cart'

Vue.use(Vuex)

export default new Vuex.Store({
   
  getters: {
   
    token: state => state.user.userInfo.token
  },
  modules: {
   
    user,
    cart
  }
})

3.封装 action 和 mutation

mutations: {
   
  setCartList (state, newList) {
   
    state.cartList = newList
  },
},
actions: {
   
  async getCartAction (context) {
   
    const {
    data } = await getCartList()
    data.list.forEach(item => {
   
      item.isChecked = true
    })
     // 后台返回的数据中,不包含复选框的选中状态,为了实现将来的功能
      // 需要手动维护数据,给每一项,添加一个 isChecked 状态 (标记当前商品是否选中)
    context.commit('setCartList', data.list)
  }
},

5.页面中 dispatch 调用

computed: {
   
  isLogin () {
   
    return this.$store.getters.token
  }
},
created () {
   
  if (this.isLogin) {
   
    this.$store.dispatch('cart/getCartAction')
  }
},

mapState - 渲染购物车列表

1.将数据映射到页面

import {
    mapState } from 'vuex'

computed: {
   
  ...mapState('cart', ['cartList'])
}

2.动态渲染

<!-- 购物车列表 -->
<div class="cart-list">
  <div class="cart-item" v-for="item in cartList" :key="item.goods_id">
    <van-checkbox icon-size="18" :value="item.isChecked"></van-checkbox>
    <div class="show" @click="$router.push(`/prodetail/${item.goods_id}`)">
      <img :src="item.goods.goods_image" alt="">
    </div>
    <div class="info">
      <span class="tit text-ellipsis-2">{
   {
    item.goods.goods_name }}</span>
      <span class="bottom">
        <div class="price">¥ <span>{
   {
    item.goods.goods_price_min }}</span></div>
        <CountBox :value="item.goods_num"></CountBox>
      </span>
    </div>
  </div>
</div>

封装 getters - 动态计算展示

1.封装 getters:商品总数 / 选中的商品列表 / 选中的商品总数 / 选中的商品总价

getters: {
   
  cartTotal (state) {
   
    return state.cartList.reduce((sum, item, index) => sum + item.goods_num, 0)
  },
  selCartList (state) {
   
    return state.cartList.filter(item => item.isChecked)
  },
  selCount (state, getters) {
   
    return getters.selCartList.reduce((sum, item, index) => sum + item.goods_num, 0)
  },
  selPrice (state, getters) {
   
    return getters.selCartList.reduce((sum, item, index) => {
   
      return sum + item.goods_num * item.goods.goods_price_min
    }, 0).toFixed(2)
  }
}

全选反选功能

1.全选 getters

getters: {
   
  isAllChecked (state) {
   
    return state.cartList.every(item => item.isChecked)
  }
}

...mapGetters('cart', ['isAllChecked']),

<div class="all-check">
  <van-checkbox :value="isAllChecked" icon-size="18"></van-checkbox>
  全选
</div>

2.点击小选,修改状态

<van-checkbox @click="toggleCheck(item.goods_id)" ...></van-checkbox>

toggleCheck (goodsId) {
   
  this.$store.commit('cart/toggleCheck', goodsId)
},

mutations: {
   
  toggleCheck (state, goodsId) {
   
    const goods = state.cartList.find(item => item.goods_id === goodsId)
    goods.isChecked = !goods.isChecked
  },
}

3.点击全选,重置状态

<div @click="toggleAllCheck" class="all-check">
  <van-checkbox :value="isAllChecked" icon-size="18"></van-checkbox>
  全选
</div>

toggleAllCheck () {
   
  this.$store.commit('cart/toggleAllCheck', !this.isAllChecked)
},

mutations: {
   
  toggleAllCheck (state, flag) {
   
    state.cartList.forEach(item => {
   
      item.isChecked = flag
    })
  },
}
目录
相关文章
|
2月前
|
JavaScript 数据可视化
vue-cli学习一:vue脚手架的 vue-cli2和vue-cli3版本 创建vue项目,vue的初始化详解
这篇文章介绍了如何使用vue-cli 2和3版本来创建Vue项目,并详细说明了两者之间的主要区别。
121 5
vue-cli学习一:vue脚手架的 vue-cli2和vue-cli3版本 创建vue项目,vue的初始化详解
|
2月前
|
JavaScript 容器
乾坤qiankun框架搭建 主应用为vue3的项目。
乾坤qiankun框架搭建 主应用为vue3的项目。
193 2
|
2月前
|
JavaScript
Vue CLi脚手架创建第一个VUE项目
Vue CLi脚手架创建第一个VUE项目
40 3
|
1月前
|
数据采集 监控 JavaScript
在 Vue 项目中使用预渲染技术
【10月更文挑战第23天】在 Vue 项目中使用预渲染技术是提升 SEO 效果的有效途径之一。通过选择合适的预渲染工具,正确配置和运行预渲染操作,结合其他 SEO 策略,可以实现更好的搜索引擎优化效果。同时,需要不断地监控和优化预渲染效果,以适应不断变化的搜索引擎环境和用户需求。
|
1月前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
2月前
|
JavaScript 数据可视化
vue-cli学习二:vue-cli3版本 创建vue项目后,Runtime-Compiler和Runtime-only两个模式详解;vue项目管理器;配置文件的配置在哪,以及如何配置
这篇文章详细介绍了Vue CLI 3版本创建项目时的Runtime-Compiler和Runtime-only两种模式的区别、Vue程序的运行过程、render函数的使用、eslint的关闭方法,以及Vue CLI 2和3版本配置文件的不同和脚手架3版本创建项目的配置文件配置方法。
115 3
vue-cli学习二:vue-cli3版本 创建vue项目后,Runtime-Compiler和Runtime-only两个模式详解;vue项目管理器;配置文件的配置在哪,以及如何配置
|
2月前
|
JavaScript
如何在 Vue 项目中选择合适的模块格式
【10月更文挑战第20天】选择合适的模块格式需要综合考虑多个因素,没有一种绝对正确的选择。需要根据项目的具体情况进行权衡和分析。在实际选择过程中,要保持灵活性,根据项目的发展和变化适时调整模块格式。
21 7
|
1月前
Vue3 项目的 setup 函数
【10月更文挑战第23天】setup` 函数是 Vue3 中非常重要的一个概念,掌握它的使用方法对于开发高效、灵活的 Vue3 组件至关重要。通过不断的实践和探索,你将能够更好地利用 `setup` 函数来构建优秀的 Vue3 项目。
|
2月前
|
JavaScript 前端开发 编译器
在 Vue 项目中使用 ES 模块格式的优点
【10月更文挑战第20天】在 Vue 项目中使用 ES 模块格式具有众多优点,这些优点共同作用,使得项目能够更高效、更可靠地开发和运行。当然,在实际应用中,还需要根据项目的具体情况和需求进行合理的选择和配置。
38 6
|
1月前
|
JavaScript 测试技术 UED
解决 Vue 项目中 Tree shaking 无法去除某些模块
【10月更文挑战第23天】解决 Vue 项目中 Tree shaking 无法去除某些模块的问题需要综合考虑多种因素,通过仔细分析、排查和优化,逐步提高 Tree shaking 的效果,为项目带来更好的性能和用户体验。同时,持续关注和学习相关技术的发展,不断探索新的解决方案,以适应不断变化的项目需求。