用vuex写了一个购物车H5页面的示例代码:https://www.jb51.net/article/152008.htm

通过购物车的一个案列,把vuex学习了一篇。

vuex概念浅谈

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。简单的来说,就是数据共用,对数据集中起来进行统一的管理。
如果您的应用够简单,您最好不要使用 Vuex。一个简单的 global event bus 就足够您所需了。但是,如果您需要构建是一个中大型单页应用,您很可能会考虑如何更好地在组件外部管理状态,Vuex 将会成为自然而然的选择。

核心概念主要有这些

State

Vuex 使用单一状态树——是的,用一个对象就包含了全部的应用层级状态,将所需要的数据写放这里,类似于data。

Getter

有时候我们需要从 store 中的 state 中派生出一些状态,使用Getter,类似于computed。

Mutation

更改 Vuex 的 store 中的状态的唯一方法,类似methods。

Action

Action 提交的是 mutation,而不是直接变更状态,可以包含任意异步操作,这里主要是操作异步操作的,使用起来几乎和mutations方法一模一样,类似methods。

Module

当应用变得非常复杂时,store 对象就有可能变得相当臃肿。Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块。

vuex

首先需要创建一个Vue项目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 全局安装 vue-cli
 
$ npm install --global vue-cli
 
# 创建一个基于 webpack 模板的新项目
 
$ vue init webpack my-project
 
# 安装依赖,走你
 
$ cd my-project
 
$ npm install
 
$ npm run dev

安装vuex

1
npm install --save vuex

对vuex进行配置

1.创建一个store文件夹
2.在store文件夹下创建如图的一系列js文件

3.在main.js文件中引入上面创建的store.js

1
2
3
4
5
6
7
8
9
10
11
12
13
import store from './store'
 
new Vue({
 
 el: '#app',
 
 store, //将store暴露出来
 
 components: { App },
 
 template: '<App/>'
 
})

4.将要存放的数据写在state对象中,state则存写在index.js文件中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import Vue from 'vue'
 
import Vuex from 'vuex'
 
import mutations from './mutations'
 
import actions from './actions'
 
import getters from './getters'
 
import shop from './modules/shop'
 
Vue.use(Vuex)
 
const state = {
 
 goods: [
 
  {
 
   id: '0',
 
   name: 'vivo-X20Plus屏幕指纹版',
 
   hint: '逆光也清晰,照亮你的美',
 
   price: 3596.00,
 
   num: 0,
 
   img: require('../assets/v.jpg')
 
  },
 
  {
 
   id: '1',
 
   name: '华为mate10Plus',
 
   hint: '真正的人工智能芯片',
 
   price: 4999.00,
 
   num: 0,
 
   img: require('../assets/h.jpeg')
 
  },
 
  {
 
   id: '2',
 
   name: '华为mate10Plus',
 
   hint: '真正的人工智能芯片',
 
   price: 4999.00,
 
   num: 0,
 
   img: require('../assets/v.jpg')
 
  }
 
 ],
 
 totalPrice: 0.00,
 
 totalNum: 0
 
}
 
export default new Vuex.Store({
 
 state,
 
 mutations,
 
 actions,
 
 getters,
 
 modules: {
 
  shop //shop模块
 
 }
})

5.将改变state原始数据的方法写在mutation.js文件中,可以使用常量替代 Mutation 事件类型,用不用常量取决于你——在需要多人协作的大型项目中,这会很有帮助。可以让你的代码合作者对整个 app 包含的 mutation 一目了然。

1
2
3
4
5
// 使用常量,这是mutation-type.js文件
 
export const ADD_CART = 'ADD_CART'
 
export const REDUCE_CART = 'REDUCE_CART'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// 这是mutation.js文件
 
import {
 
 ADD_CART,
 
 REDUCE_CART
 
} from './mutation-types.js'
 
export default {
 
 [ADD_CART] (state, id) {
 
  state.goods[id].num++
 
  state.totalNum++
 
  state.totalPrice += state.goods[id].price
 
  // console.log(state.totalPrice)
 
 },
 
 [REDUCE_CART] (state, id) {
 
  if (state.goods[id].num > 0) {
 
   state.goods[id].num--
 
   state.totalNum--
 
   state.totalPrice -= state.goods[id].price
 
  }
 
 }
 
}

6.对state数据派生出一些状态,例如需要知道商品的个数

1
2
3
4
5
6
7
8
const getters = {
 
 goods_obj: state => state.goods,
 
 goods_length: state => state.goods.length
 
}
export default getters

7.使用vuex,获取数据,方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
<template>
 <div class="hello">
  <ul class="shop_container">
   <li v-for="item in $store.state.goods" :key="item.id" class="shop_container_li">
 
    <div class="shop_img">
 
     <img :src="item.img" alt="" width="100%" height="100%"/>
 
    </div>
 
    <div class="shop_detail">
 
     <p>{{item.name}}</p>
 
     <p>{{item.hint}}</p>
 
     <p>¥{{item.price}}</p>
 
     <p>
 
      <span class="shop_reduce" @click="reduce_num(item.id)">-</span>
 
      <span class="shop_num">{{item.num}}</span>
 
      <span class="shop_add" @click="add_num(item.id)">+</span>
 
     </p>
 
    </div>
 
   </li>
 
  </ul>
 
  <div class="foot">
 
   <div class="total_price">
 
    <span>合计:¥{{totalPrice}}</span>
 
   </div>
 
   <div class="total_num" :class="{payment: totalNum}">
 
    <span>去结账:{{totalNum}}</span>
 
   </div>
 
  </div>
 
 </div>
 
</template>
 
<script>
 
import {mapState, mapMutations, mapGetters} from 'vuex'
 
export default {
 
 name: 'HelloWorld',
 
 data () {
 
  return {
 
  }
 
 },
 
 created () {
 
  // console.log(this.goods)
 
  // console.log(this.goods_obj)
 
  // console.log(this.goods_length)
 
  // console.log(this.$store.state.shop) // 模块化 Vuex允许我们将 store 分割成模块(module)每个模块拥有自己的 state、mutation、action、getter、
 
 },
 
 computed: {
 
  ...mapState([
 
  // 获取state中的数据可以通过mapState辅助函数获取,也可以直接获取 例:this.$store.state.goods
 
   'goods', 'totalPrice', 'totalNum'
 
  ]),
 
  ...mapGetters([
 
   'goods_obj', 'goods_length'
 
  ])
 
 },
 
 methods: {
 
  ...mapMutations([
 
  // 获取mutation中的方法可以通过mapMutations 辅助函数获取,也可以直接获取。
 
   'ADD_CART'
 
   // 'REDUCE_CART'
 
  ]),
 
  reduce_num (id) {
 
   // this.REDUCE_CART(id)
 
   this.$store.commit('REDUCE_CART', id) //也可以直接获取
 
  },
 
  add_num (id) {
 
   this.ADD_CART(id) //通过mapMutations 辅助函数获取
 
  }
 
 }
 
}
</script>

8.假如数据过多,复杂,可以进行模块化来开发,可以将上述的state,mutation,action等可以同时写在shop.js文件中,此时shop就是一个模块了。

总结

若数据不是很多,也不复杂,我们也可以在构造vue实例data中存放我们所需要的共用数据。一旦数据较多,复杂,vuex是一个非常不错的选择,对于状态管理。

努力学习中,希望能和大神一起。

github地址:https://github.com/flym1013/vuexDemo

效果预览地址: https://flym1013.github.io/vuexDemoBuild/

效果图预览

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

用vuex写了一个购物车H5页面的示例代码的更多相关文章

  1. 领导让我重新做一个微信H5页面!

    leader:我们需要做一个微信H5页面,效果如图,功能如描述,时间越快越好. 需求是不是很简单呢?2015-11-24 12:44:00文末有最新更新 背景描述 前几天微信转发相关项目开发后,这是第 ...

  2. vue-实现一个购物车结算页面

    这是路由之间的跳转,传递值最好采用传参,而不是用$emit和$on,不起作用 如果实在一个页面中的兄弟组件,可以使用$emit和$on 中间件,eventBus.js 放在components目录下面 ...

  3. 微信JS-SDK DEMO页面和示例代码

    <?php require_once "jssdk.php"; $jssdk = new JSSDK("yourAppID", "yourApp ...

  4. jsp页面使用javascript添加页面元素示例代码

    <body>    <input type="button" value="test" onclick="javascript:a( ...

  5. 用java编写一个微博登陆页面

    上次也写了一个微博登陆页面,不过功能还不够完善.今天重新完善了一些功能,分享出来给大家. 基本功能如下: (1)具有类似新浪微博的用户注册图形界面. (2)使用用户名或手机号注册,注册时需要提供新密码 ...

  6. VUE的一个数据绑定与页面刷新相关的bug

    1.场景: N层嵌套的循环查询业务场景,框架是vue.其中在最后一层查完之后,还需要查其中每一项的两个属性,类型都是列表.查完之后将其赋值给一个变量用于页面展示.代码如下: (1)异常代码: getS ...

  7. c# .Net :Excel NPOI导入导出操作教程之List集合的数据写到一个Excel文件并导出

    将List集合的数据写到一个Excel文件并导出示例: using NPOI.HSSF.UserModel;using NPOI.SS.UserModel;using System;using Sys ...

  8. 自己写的一个 java swing 的闹钟

    上一周新入职,把代码down下来之后,领导和我讲了一些大概的业务以及代码流程(领导是技术出身),领导让我自己先看看代码,然后我看了两天,觉得已经完全可以接任务了,但是领导却迟迟没有分配任务给我,虽然他 ...

  9. vue为app做h5页面,如何做到同域名对应不同版本的h5代码

    1.当我们在做混合开发的时候,app端可以有无数多个版本,一般情况h5页面只有一套代码.应该如何部署多套代码呢? 2.业务场景 当出现这种情况的时候,其实前端可以部署多套代码.比如: www.stat ...

随机推荐

  1. tomcat日志切割脚本shell

    tomcat-rotate.sh: #!/bin/bash log_path="/home/tomcat7-api/logs/"expried_time=7 function de ...

  2. NTP时间服务器构建

    搭建一个NTP服务器,为整个网络环境中的所有主机提供时间校准服务,具体如下: - 部署一台NTP时间服务器 - 设置时间服务器上层与0.centos.pool.ntp.org同步 - 设置本地服务器层 ...

  3. md5sum 计算和校验文件的md5值

    1. 命令功能 md5算法一般用于检查文件完整性, 2. 语法格式 md5sum  [option]  [file] 参数 参数说明 -b 以二进制模式读入文件 -t 以文本模式读入文件 -c 用来从 ...

  4. Redis分布式锁【实战】

    概述 目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题.分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性(Consistency).可 ...

  5. java四种引用类型以及使用场景详解

    每种编程语言都有自己操作内存中元素的方式,例如在 C 和 C++ 里是通过指针,而在 Java 中则是通过“引用”.在 Java 中一切都被视为了对象,但是我们操作的标识符实际上是对象的一个引用(re ...

  6. B1001. 害死人不偿命的(3n + 1)猜想

    题目描述 卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n + 1)砍掉一半.这样一直反复砍下去,最后一定在某一步得到n=1.卡拉兹在19 ...

  7. hdu 6055 : Regular polygon (2017 多校第二场 1011) 【计算几何】

    题目链接 有个结论: 平面坐标系上,坐标为整数的情况下,n个点组成正n边形时,只可能组成正方形. 然后根据这个结论来做. 我是先把所有点按照 x为第一关键字,y为第二关键字 排序,然后枚举向量 (p[ ...

  8. JavaScript用在哪里

    <script> 标签 在HTML,JavaScript代码必须插入<script> 和 </script>之间的. document.getElementById ...

  9. jenkins解决python不是内部命令

    1.在 Windows 提示符下运行是没有问题. 2.把Jenkins项目配置中 python main.py   修改成python可执行文件全路径:D:\Python35\python.exe m ...

  10. centos 7 网卡绑定 bond0 开机无法自启

    https://blog.csdn.net/u012881151/article/details/54910847 1.环境CentOS Linux release 7.2.1511 (Core)li ...