【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
    })
  },
}
目录
相关文章
|
24天前
|
存储 JavaScript
解锁Vuex高级玩法:模块化与插件共舞,让你的Vue项目状态管理如虎添翼!
【8月更文挑战第27天】Vuex是一款专为Vue.js应用程序设计的状态管理模式及库,它通过集中管理组件状态来确保状态变更的可预测性。在大型应用中,采用模块化管理可以让代码结构更加清晰,同时利用插件增强功能。模块化管理允许将store拆分为包含各自state、mutations、actions和getters的独立模块。插件则能监听状态变化,实现诸如日志记录或数据持久化等功能。本文通过具体示例介绍了如何在Vuex中实现模块化管理和插件的高级应用。
34 1
|
1月前
|
JavaScript
如何创建一个Vue项目(手把手教你)
这篇文章是一篇手把手教读者如何创建Vue项目的教程,包括使用管理员身份打开命令行窗口、找到存放项目的位置、通过vue-cli初始化项目、填写项目信息、进入项目目录、启动项目等步骤,并提供了一些常见第三方库的引入方法。
如何创建一个Vue项目(手把手教你)
|
1月前
|
JavaScript 前端开发
在Vue2或Vue3中项目中使用 Isotope(同位素) 过滤和排序神奇的布局神器,全网独家实现!
本文介绍了在Vue2或Vue3项目中如何使用Isotope(同位素)布局库来创建动态的网格布局,并提供了详细的代码实现和效果展示,包括过滤和排序功能。
59 0
在Vue2或Vue3中项目中使用 Isotope(同位素) 过滤和排序神奇的布局神器,全网独家实现!
|
11天前
|
前端开发
vue3+ts项目中使用mockjs
vue3+ts项目中使用mockjs
216 58
|
2天前
|
JavaScript 前端开发
Vue项目使用px2rem
Vue项目使用px2rem
|
6天前
|
JavaScript 前端开发
Vue项目使用px2rem
Vue项目使用px2rem
|
8天前
|
JavaScript 前端开发 UED
让 HTML 向 Vue.js 华丽转身:如何把 `wangEditor` 仿腾讯文档项目整合进 Vue.js
让 HTML 向 Vue.js 华丽转身:如何把 `wangEditor` 仿腾讯文档项目整合进 Vue.js
|
14天前
|
数据采集 JavaScript 搜索推荐
我们一起聊聊如何对Vue项目进行搜索引擎优化
【9月更文挑战第4天】Vue 项目的搜索引擎优化(SEO)较为复杂,因其内容默认由 JavaScript 渲染,部分搜索引擎难以索引。为提升 SEO 效果,可采用服务器端渲染(SSR)或预渲染,使用 Nuxt.js 或 Vue Server Renderer 实现 SSR,或利用 Prerender SPA Plugin 预渲染静态 HTML。此外,动态管理 Meta 标签、优化静态内容与 Sitemap、懒加载、图片优化、提升页面速度、设置正确的路由模式、使用结构化数据及构建良好外链均有益于 SEO。
42 11
|
1月前
|
JavaScript
Vue项目如何生成树形目录结构
这篇文章介绍了如何在Vue项目中生成树形目录结构,通过安装并使用`mddir`命令行工具来创建一个`directoryList.md`文件,从而快速获取项目的树形目录列表。
Vue项目如何生成树形目录结构
|
1月前
|
数据可视化 JavaScript
Vue3项目使用G6可视化组件实现一个树形机构图
在Vue 3项目中使用G6可视化组件库实现树形机构图的构建和展示。
284 1
Vue3项目使用G6可视化组件实现一个树形机构图