Vuex
vue中各个组件之间传值
父子组件
父组件-->子组件,通过子组件的自定义属性:props
子组件-->父组件,通过自定义事件:this.$emit('事件名',参数1,参数2,...);
非父子组件或父子组件
通过数据总数Bus,this.$root.$emit('事件名',参数1,参数2,...)
非父子组件或父子组件
更好的方式是在vue中使用vuex
方法1: 用组件之间通讯。这样写很麻烦,并且写着写着,估计自己都不知道这是啥了,很容易写晕。
方法2: 我们定义全局变量。模块a的数据赋值给全局变量x。然后模块b获取x。这样我们就很容易获取到数据
变量传值的演变形式:
Vuex
官方解释:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。可以想象为一个“前端数据库”(数据仓库),
让其在各个页面上实现数据的共享包括状态,并且可操作
Vuex分成五个部分:
1.State:单一状态树
2.Getters:状态获取
3.Mutations:触发同步事件
4.Actions:提交mutation,可以包含异步操作
5.Module:将vuex进行分模块
图解Vuex :
vuex使用步骤
安装
npm install vuex -S
创建store模块,分别维护state/actions/mutations/getters
store index.js state.js actions.js mutations.js getters.js
在store/index.js文件中新建vuex的store实例,并注册上面引入的各大模块
1 import Vue from 'vue' 2 import Vuex from 'vuex' 3 import state from './State' 4 import getters from './Getters' 5 import actions from './Actions' 6 import mutations from './Mutations' 7 8 Vue.use(Vuex) 9 10 const store = new Vuex.Store({ 11 state, 12 getters, 13 actions, 14 mutations 15 }) 16 17 export default store
在main.js中导入并使用store实例
1 // The Vue build version to load with the `import` command 2 // (runtime-only or standalone) has been set in webpack.base.conf with an alias. 3 import Vue from 'vue' 4 /* process.env.MOCK && require('@/mock') */ 5 import 'element-ui/lib/theme-chalk/index.css' 6 import App from './App' 7 import router from './router' 8 import ElementUI from 'element-ui' 9 import axios from '@/api/http' 10 import VueAxios from 'vue-axios' 11 import store from './store' 12 13 14 Vue.use(VueAxios,axios) 15 Vue.use(ElementUI) 16 Vue.config.productionTip = false 17 18 /* eslint-disable no-new */ 19 new Vue({ 20 el: '#app', 21 data(){ 22 return{ 23 Bus:new Vue({ 24 25 }) 26 } 27 }, 28 router, 29 store, 30 components: { App }, 31 template: '<App/>' 32 })
案列
state.js
1 export default{ 2 resturantName:'K' 3 }
actions.js
1 export default { 2 setResturantNameByAsync: (context, payload) => { 3 console.log('xxxx'); 4 setTimeout(() => { 5 console.log('yyyy'); 6 console.log(payload) 7 context.commit('setResturantName', payload); 8 }, 3000) 9 console.log('zzzz'); 10 }, 11 doAjax: (context, payload) => { 12 let _this=payload._this 13 let url = _this.axios.urls.SYSTEM_USER_DOLOGIN; 14 _this.axios.post(url, {}).then((respose) => { 15 console.log(respose); 16 }).catch(function(error) { 17 console.log(error); 18 }); 19 } 20 21 }
mutations.js
1 export default{ 2 setResturantName:(state,payload)=>{ 3 state.resturantName=payload.resturantName; 4 } 5 }
getters.js
1 export default{ 2 getResturantName:(state)=>{ 3 return state.resturantName; 4 } 5 }
VuexPage1.vue
1 <template> 2 <div> 3 <h1>页面1:欢迎来到{{msg}}</h1> 4 <button @click="buy">盘他(同步)</button> 5 <button @click="buyAsync">盘他(异步)</button> 6 <button @click="doAjax">。。。</button> 7 </div> 8 </template> 9 10 <script> 11 export default { 12 data() { 13 return { 14 15 }; 16 }, 17 computed: { 18 msg() { 19 return this.$store.state.resturantName; 20 } 21 }, 22 methods: { 23 buy() { 24 this.$store.commit('setResturantName', { 25 resturantName: 'T' 26 }); 27 }, 28 buyAsync() { 29 this.$store.dispatch('setResturantNameByAsync', { 30 resturantName: 'V' 31 }); 32 }, 33 doAjax() { 34 this.$store.dispatch('doAjax', { 35 _this:this 36 }); 37 } 38 } 39 } 40 </script> 41 42 <style> 43 </style>
VuexPage2.vue
1 <template> 2 <div> 3 <h1>页面2:欢迎来到{{msg}}</h1> 4 </div> 5 </template> 6 7 <script> 8 export default { 9 data() { 10 return { 11 12 }; 13 }, 14 computed: { 15 msg() { 16 return this.$store.getters.getResturantName; 17 } 18 } 19 } 20 </script> 21 22 <style> 23 </style>
vuex的核心概念:store、state、getters、mutations、actions
store
每一个Vuex应用的核心就是store(仓库),store基本上就是一个容器,它包含着你的应用中大部分的状态 (state)。
const store = new Vuex.Store({
state, // 共同维护的一个状态,state里面可以是很多个全局状态
getters, // 获取数据并渲染
actions, // 数据的异步操作
mutations // 处理数据的唯一途径,state的改变或赋值只能在这里
})
state(保存数据的容器)
状态,即要全局读写的数据
1 const state = { 2 resturantName:'飞歌餐馆' 3 }; 4 5 this.$store.state.resturantName;//不建议
getters(getXxx)获取数据并渲染
1 const getters = { 2 resturantName: (state) => { 3 return state.resturantName; 4 } 5 };
getters将state中定义的值暴露在this.$store.getters对象中,我们可以通过如下代码访问
1 this.$store.getters.resturantName
state状态存储是响应式的,从store实例中读取状态最简单的方法就是在计算属性中返回某个状态,如下:
1 computed: { 2 resturantName: function() { 3 return this.$store.getters.resturantName; 4 } 5 }
mutations(setXxx)处理数据的唯一途径,state的改变或赋值只能在这里
1 export default { 2 // type(事件类型): 其值为setResturantName 3 // payload:官方给它还取了一个高大上的名字:载荷,其实就是一个保存要传递参数的容器 4 setResturantName: (state, payload) => { 5 state.resturantName = payload.resturantName; 6 } 7 }
mutations中方法的调用方式不能直接调用this.$store.mutations.setResturantName('KFC'),必须使用如下方式调用:
1 this.$store.commit(type,payload);
把载荷和type分开提交
1 store.commit('setResturantName',{ 2 resturantName:'KFC' 3 })
载荷和type写到一起
1 store.commit({ 2 type: 'setResturantName', 3 resturantName: 'KFC' 4 }) 5
一定要记住,Mutation 必须是同步函数。为什么呢?异步方法,我们不知道什么时候状态会发生改变,所以也就无法追踪了如果我们需要异步操作,Mutations就不能满足我们需求了,这时候我们就需要Actions了
1 mutations: { 2 someMutation (state) { 3 api.callAsyncMethod(() => { 4 state.count++ 5 }) 6 } 7 }
actions
数据的异步(async)操作
1 export default {
2 setResturantNameByAsync: function(context, payload) {
3 setTimeout(() => {
4 context.commit('setResturantName', payload);//Action提交的是mutation
5 }, 3000);
6 }
7 }
Action类似于 mutation,不同在于:
1.Action提交的是mutation,而不是直接变更状态
2.Action可以包含任意异步操作
3.Action的回调函数接收一个 context 上下文参数,注意,这个参数可不一般,它与 store 实例有着相同的方法和属性
但是他们并不是同一个实例,context 包含:
1. state、2. rootState、3. getters、4. mutations、5. actions 五个属性
所以在这里可以使用 context.commit 来提交一个 mutation,或者通过 context.state 和 context.getters 来获取 state 和 getters。
Vuex的管理员Module
其实是为了搞定那些稍微大型复杂一点的项目,避免 store 里面的数据太多。这样的话,store 对象就会变得相当的臃肿,非常难管理Module应运而生
1 const moduleA = { 2 state: { ... }, 3 mutations: { ... }, 4 actions: { ... }, 5 getters: { ... } 6 } 7 8 const moduleB = { 9 state: { ... }, 10 mutations: { ... }, 11 actions: { ... } 12 } 13 14 const store = new Vuex.Store({ 15 modules: { 16 a: moduleA, 17 b: moduleB 18 } 19 })
原文地址:https://www.cnblogs.com/xcn123/p/11479351.html
- Message和handler传递对象
- MVC RC2中关于HtmlHelper给DropDownList设置初始选中值的问题
- 结构struct(值类型)在实际应用要注意的二点:
- 王璋:腾讯云为游戏行业提供解决方案
- 利用Reflector把"闭包"看清楚
- CSS伪类的三种写法
- 吴晓斌:"吃鸡"游戏全球多地部署架构分析
- silverlight + wcf(json格式) + sqlserver存储过程分页
- 联众收购多家公司 多枚域名齐助阵
- Android AlertDialog去除黑边白边自定义布局(转)
- “超自然”域名近139万易主
- 服务器磁盘监控脚本分享(含报警邮件)
- 通用分页存储过程
- 你真的会玩SQL吗?表表达式,排名函数
- 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 数组属性和方法
- Unity3D网络通讯(三)-- HttpRestful请求的简单封装
- 详解Elasticsearch 的性能优化
- console.log的那件事
- Codeforces Round #668 (Div. 2)A-D
- nodejs源码解析之udp服务器
- LeetCode | 35.搜索插入位置
- Redis | 源码阅读 —— 字符串
- 一个小白的角度看JavaScript Promise 完整指南
- 教会舍友玩 Git (再也不用担心他的学习)
- Python极简入门:数据类型、条件语句、循环语句、异常处理
- 手把手带你入门Python爬虫Scrapy
- 工作中巧用了这几个设计模式重构代码,女同事直呼666
- SourceMap知多少:介绍与实践
- (实战)Node.js 实现抢票小工具&短信通知提醒
- 目标检测 | Anchor free之CenterNet深度解析