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
    评论
Vue移动端应用中实现单点登录,可以使用一些流行的认证协议和库,如OAuth 2.0和Vue Router。下面是一个简单的示例代码,演示如何在Vue移动端应用中实现单点登录。 首先,你需要在Vue项目中安装`vue-router`和`axios`: ```bash npm install vue-router axios ``` 然后,在你的Vue项目中创建一个新的路由文件 `router.js`,并添加下面的代码: ```javascript import Vue from 'vue'; import Router from 'vue-router'; Vue.use(Router); // 定义路由 const router = new Router({ mode: 'history', routes: [ // 其他路由 { path: '/login', name: 'Login', component: () => import('./views/Login.vue') }, // 其他路由 ] }); // 添加路由导航守卫 router.beforeEach((to, from, next) => { const isAuthenticated = localStorage.getItem('accessToken'); if (to.path !== '/login' && !isAuthenticated) { next('/login'); } else { next(); } }); export default router; ``` 这段代码中,我们创建了一个Vue Router实例,并定义了一些路由。其中,`/login` 是登录页面的路由路径。我们还添加了一个路由导航守卫,在每次路由跳转之前检查用户是否已经登录(通过检查本地存储中是否存在访问令牌 `accessToken`)。如果用户未登录且不是访问登录页面,则自动跳转到登录页面。 接下来,创建一个登录组件 `Login.vue`,并添加下面的代码: ```vue <template> <div> <h1>Login Page</h1> <button @click="login">Login</button> </div> </template> <script> export default { methods: { login() { // 调用认证服务器的登录接口获取访问令牌 // 例如使用axios发送请求 axios.post('https://auth-server.com/login', { username: 'your-username', password: 'your-password' }) .then(response => { const accessToken = response.data.accessToken; // 将访问令牌保存到本地存储 localStorage.setItem('accessToken', accessToken); // 跳转到首页或其他需要登录才能访问的页面 this.$router.push('/'); }) .catch(error => { console.error(error); }); } } } </script> ``` 在这个示例中,我们通过点击登录按钮来触发登录流程。你需要根据你的认证服务器的实际情况,使用`axios`或其他HTTP库发送登录请求,并将返回的访问令牌保存到本地存储中。最后,使用`this.$router.push('/')`跳转到首页或其他需要登录才能访问的页面。 请注意,这只是一个简单的示例,实际应用中可能还需要处理认证服务器返回的令牌验证和刷新等逻辑。 希望这个示例能帮助你在Vue移动端应用中实现单点登录!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值