【Vue.js学习笔记】16:使用Vuex做组件状态管理的demo
时间:2019-01-23
本文章向大家介绍【Vue.js学习笔记】16:使用Vuex做组件状态管理的demo,主要包括【Vue.js学习笔记】16:使用Vuex做组件状态管理的demo使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Vuex集中管理组件的状态,提供store来集中存储所有组件用的数据,代替传统的繁琐的组件通信方式。
store.js
在这里导入Vuex并设置store的各项功能。
import Vue from "vue";
import Vuex from "vuex";
Vue.use(Vuex);
export const store = new Vuex.Store({
strict:true,//在严格模式下,不允许非mutation操作vuex中store管理的数据
state:{//state中存储数据
products:[
{name:"马云",price:200},
{name:"马化腾",price:140},
{name:"马冬梅",price:20},
{name:"马蓉",price:10},
]
},
getters:{//getters中获取数据(只读不写)
saleProducts:(state)=>{
//获取打折后的商品价格,这里用map遍历其中的每个prodcut返回price折半的结果
var saleProducts = state.products.map(
product => {
return {
name :"*"+product.name,
price: product.price/2
}
});
//将打折的商品数组返回
return saleProducts;
}
},
mutations:{//mutations中注册改变state的事件(只写不读)
reducePrice:(state,payload)=>{
//如果在这里用setTimeout,那么就是在调用reducePrice之后,3秒后再执行商品降价的操作
// setTimeout(function(){
//商品降价:遍历store中的每个商品使其price减少
state.products.forEach(product => {
product.price -= payload;
});
// },3000);
}
},
actions:{//actions用于提交mutation,可以实现异步操作
reducePrice:(context,payload)=>{
//在这种方式下,数据改变和mutation的方法执行是同时的
setTimeout(function(){
context.commit("reducePrice",payload);
},3000);
}
}
});
根组件
这里在其中包含了两个子组件。
<template>
<div id="app">
<!-- 传统的组件通信方式 -->
<!-- <product-list-one v-bind:products="products"></product-list-one> -->
<!-- <product-list-two v-bind:products="products"></product-list-two> -->
<!-- 现在使用vuex管理数据和通信,不再需要上面的方式 -->
<product-list-one></product-list-one>
<product-list-two></product-list-two>
</div>
</template>
<script>
import productListOne from './conponents/productListOne';
import productListTwo from './conponents/productListTwo';
export default {
name: 'app',
data () {
return {
}
},
components:{
'product-list-one':productListOne,
'product-list-two':productListTwo
}
}
</script>
<style>
</style>
组件1
注意这里对mapGetters和mapActions使用了ES6的语法,目前要安装babel。
<template>
<div id="product-list-one">
<p>降价后的商品</p>
<ul>
<li v-for="product in saleProducts" v-bind:key="product.value">
<span class="name">{{product.name}}</span>
<span class="name">${{product.price}}</span>
</li>
</ul>
<button @click="reducePrice(4)">商品降价</button>
</div>
</template>
<script>
import {mapGetters} from 'vuex';
import {mapActions} from 'vuex';
export default {
data () {
return {
}
},
computed:{
products(){
//获取vuex的store中的商品数据
return this.$store.state.products;
},
/*
saleProducts(){
//获取打折后的商品信息
return this.$store.getters.saleProducts;
}
*/
...mapGetters([//在这个传入的数组里写store中getters里的方法
"saleProducts",
])
},
methods:{
/*
reducePrice(amount){
//点击商品降价时触发的函数,在这里调用mutation进行降价
// this.$store.commit("reducePrice");
//改成调用action,再由action去调用mutation.这里可以进行传参
this.$store.dispatch("reducePrice",amount);
}
*/
...mapActions([
"reducePrice",
])
}
}
</script>
<style>
</style>
组件2
<template>
<div id="product-list-two">
<p>降价前的商品</p>
<ul>
<li v-for="product in products" v-bind:key="product.value">
<span class="name">{{product.name}}</span>
<span class="name">${{product.price}}</span>
</li>
</ul>
</div>
</template>
<script>
export default {
data () {
return {
}
},
computed:{
products(){
return this.$store.state.products;
}
}
}
</script>
<style>
</style>
运行结果
点击按钮3秒后商品降价,同时Vue开发者工具中Vuex中可以看到调用了相应的mutation。
- 利用腾讯云COS云对象存储定时远程备份网站
- 分享一个自写的Python远程命令和文件(夹)传输类
- Oracle数据误操作全面恢复实战(r11笔记第78天)
- 远程协助解决异常宕库的问题(r11笔记第75天)
- Nginx-helper纯代码版,文章评论发布自动清理Fastcgi缓存
- MySQL和Oracle行值表达式对比(r11笔记第74天)
- 闪回数据库不是“万金油”(r11笔记第73天)
- 修改Apache的超时设置,解决长连接请求超时问题
- Oracle 12cR2初体验(r11笔记第91天)
- MySQL中的undo截断(r11笔记第89天)
- Linux系统 df 命令显示异常、分区丢失问题解决
- MySQL主从、字典死锁、连接数的Python监控脚本
- MySQL Online DDL(二)(r11笔记第88天)
- 转-Android上面运行golang
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- springboot之场景启动器
- ICLR2020 | 深度自适应Transformer
- springboot之自动配置
- golang--连接redis数据库并进行增删查改
- golang--redis连接池
- springboot配置之使用application.properties时编码问题
- mybatis动态sql之foreach补充(二)
- golang数据结构之稀疏数组
- mybatis扩展之使用PageHelper插件进行分页(是真好用)
- 动态规划--0,1背包问题(再也不怕类似背包问题了)
- springboot配置之Profile多环境支持
- LeetCode | 102.二叉树的层次遍历
- golang数据结构之队列
- 动态规划--最长上升子序列(LIS)的长度
- golang数据结构之环形队列