vue移动端开发(四)购物车模块实现

1 基础

在此之前你需要先了解vuex在项目中的使用点击学习

2 项目

  • vue实现数据共享

2.1 引入vuex

  • 安装下载
  • 配置
  • 使用

2.1.1 安装下载

cnpm i vuex -S

2.1.2 配置

在这里插入图片描述

  • 创建资源
  • 配置资源
  • 讲解
1 创建资源
  • src/store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
  state: {
    cart: JSON.parse(localStorage.getItem('cart') || '[]')
  },
  mutations: {
    //业务逻辑
    addCart (state,addInfo) {
      let flag=false
      state.cart.some(el =>{
        if(el.id === addInfo.id){
          el.count+=addInfo.count
          flag=true
        }
      })
      if(!flag){
        state.cart.push(addInfo)
      }
      localStorage.setItem('cart',JSON.stringify(state.cart))
    }
  },
  actions: {
    addCart ({commit},addInfo) {
      commit('addCart',addInfo)
    }
  },
  getters: {
    getAllCount (state) {
      let all = 0;
      state.cart.some(el=>{
        all+=el.count
      })
      return all
    },
    getAllPrice (state){
      let price = 0
      state.cart.some(el=>{
        if(el.selected===true){
          price+=el.count*el.sell_price
        }
      })
      return price
    }
  },
  modules: {
  }
})

2 配置资源
  • main.js
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import './plugins/vant.js'
import './api'
import './mixins'
import './filters/dataFmt'
import store from  './store'
Vue.config.productionTip = false

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')

2.1.3 使用

  • src/views/cart/index.vue
<template>
 <div class="cart">
   <div class="info" v-for="(el,index) in $store.state.cart" :key="index">
     <van-switch v-model="el.selected" />
     <van-card
       :num="el.count"
       :price="el.sell_price"
       :title="el.title"
       :thumb="el.src"
     />
     <div slot="desc">
       <van-stepper v-model="el.count" />
     </div>
     <van-submit-bar :price="$store.getters.getAllPrice*100" button-text="提交订单" />
   </div>
 </div>
</template>

<script>
export default {
}
</script>

<style lang="less" scoped>
.cart {
  margin-bottom: 100px;
  .info{
    background: #fafafa;
    display: flex;
    justify-content: center;
    align-items: center;
    padding: 6px;
    margin: 6px;
    .van-card{
      flex: 3.5;
    }
  }
}

</style>

3 讲解
共享

在这里插入图片描述

在这里插入图片描述

传递

在这里插入图片描述

使用

在这里插入图片描述

3 模块化

在这里插入图片描述

  • utils
export const  getCar = ()=>{
  return JSON.parse(localStorage.getItem('cart') || '[]')
}
export const setCar=(cart)=>{
  localStorage.setItem('cart',JSON.stringify(cart))
}

  • 使用
    在这里插入图片描述

4 打包

1 执行命令

npm run build

在这里插入图片描述

  • 该文件夹是托给服务器静态资源托管public文件夹下的(直接复制过去)

5 优化

1 项目添加 nprogress 进度条

  • 执行
yarn add nprogress -S 
  • 配置
    • 在main.js 中导入依赖包和样式
  import NProgress from 'nprogress' 
  import 'nprogress/nprogress.css'

在这里插入图片描述

  • 实现缓存
    在这里插入图片描述

2 自动移除log

1 执行命令

 yarn add babel-plugin-transform-remove-console -D

2 配置

  • babel.config.js
const prodPlugins = []
// 生产环境移除console
if (process.env.NODE_ENV === 'production') {
  prodPlugins.push('transform-remove-console')
}
module.exports = {
  presets: [
    '@vue/cli-plugin-babel/preset'
  ],
  plugins: [
    [
      'import',
      {
        libraryName: 'vant',
        libraryDirectory: 'es',
        style: true
      },
      'vant'
    ],
    ...prodPlugins
  ]
}

3 使用

vue ui

在这里插入图片描述
在这里插入图片描述

3 CDN移除外部资源

按需打包

1 配置

  • vue.config.js
  chainWebpack: config => {
    // 发布模式
    config.when(process.env.NODE_ENV === 'production', config => {
      // 配置入口文件
      config
        .entry('app')
        .clear()
        .add('./src/main-prod.js')
      // 配置CDN
      config
        .set('externals', {
          vue: 'Vue',
          'vue-router': 'VueRouter',
          axios: 'axios',
          nprogress: 'NProgress',
          moment: 'moment'
        })
      // 配置首页定制
      config.plugin('html').tap(args => {
        args[0].isProd = true
        return args
      })
    })
    // 开发模式
    config.when(process.env.NODE_ENV === 'development', config => {
      config
        .entry('app')
        .clear()
        .add('./src/main-dev.js')
      // 配置首页定制
      config.plugin('html').tap(args => {
        args[0].isProd = false
        return args
      })
    })
  }


2 引入

点击进入官网

6 总结

  • 在开发中,组件和路由最好按需加载可以实现页面优化
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值