Vue的Vuex的使用
一、Vuex是什么?
1:Vuex是一个专为vue.js应用程序开发的状态管理模式,核心就是一个store仓库,采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。基本思想:通过定义和隔离状态管理的各种概念并通过强制维持视图和状态间的独立性,我们的代码将会变得更结构化且易维护;
2:状态管理模式:state,驱动应用的数据源;view,以声明方式将state映射到视图上;actions,响应在view上的用户输入导致的变化;
3:单向数据流:单向数据流容易被破坏,在多个组件共享状态时:像多个视图依赖同一个状态或者来自不同视图的行为需要变更同一状态;
4:何时使用vuex:如果需要构建一个中大型单页面应用;
二、Vuex和单纯全局对象不同点:
1:Vuex的状态存储是响应式的。当Vue组件从store中读取状态的时候,若store中的状态发生变化,那么相应的组件也会相应的得到高效的更新;
2:不能直接更改state中的状态。改变store中的状态唯一的途径是显示的提交(commit)mutation。这样使得我们可以方便的跟踪每一个状态的变化,从而让我们能够实现一些工具帮助我们更好的了解我们的应用;
3:关于:store
// 创建一个store
const store = new Vue.Store({
state: { count: 0 },
getters: {},
mutations: {
increment(state){ state.count++ }
},
actions: {}
}) // 在Vue组件中访问this.$store property,以及通过this.store.commit方法触发状态变更
this.$store.state.count // 0
this.$store.commit('increment') // count 1 //Vuex提供了一个从根组件向所有子组件,以store选项的方式注入该store的机制;
new Vue({
el: '#app',
store // 把store对象提供给“store”选项,可以把store的实例注入到所有的子组件 需要调用Vue.use(Vuex)
}) // 由于store中的状态是响应式的,在组件中调用store中的状态简单到仅需要在计算属性中返回即可。触发变化也仅仅是在组件的methods中提交mutation
三、核心概念 state、getters、mutations、actions、module
1:state:Vuex使用的单一状态树,则state作为唯一数据源;由于Vuex的状态存储是响应式的,从store实例中读取状态最简单的方法就是在计算属性中返回某个状态;
// a组件
computed: {
count() {
return this.$store.state.count // 当依赖值变化的时候,都会重新求取计算属性,并且触发更新相关联的DOM
}
}
2:mapState辅助函数:当一个组件需要获取多个状态的时候,将这些状态都声明为计算属性会有些重复和冗余;
// mapState辅助函数使用 // 在单独构建的组件中辅助函数为 Vuex.mapState
import { mapState } from 'vuex'
// mapState返回的是一个对象,我们利用对象展开运算符将它和局部的计算属性混合即可
computed: { ...mapState({ ...... }) }
3:getter:类似于计算属性,可以对state中的数据加工后传递给组件;有时候需要从store中的state中派生出一些状态;
getters中的方法有两个默认参数:state,当前vuex对象中的状态对象;getters,当前getters对象,用于将getters下的其他getter拿来用;
就像计算属性一样,getter的返回值会根据它的依赖被缓存起来,且只有当它的依赖发生了改变才会被重新计算;
// getter接收state作为第一个参数
const store = new Vue.Store({
state: {
todos: [
{ id: 1, done: true },
{ id: 2, done: false }
]
},
getters: {
doneTodos: state => {
return state.todos.filter(todo => todo.done)
}
}
})
#通过属性访问:
// getter会暴露this.$store.getter对象,可以通过属性的方式访问这些值
this.$store.getter.doneTodos // { id:1, done: true }
// getter接收的第二个参数:getters
getters: {
doneTodosCount: (state, getters) => {
return getters.doneTodos.length
}
}
this.$store.getter.doneTodosCount // -> 1
#getter在通过属性访问时作为Vue的响应式系统的一部分缓存其中的
#通过方法访问:
// 也可以通过让getter返回一个函数,来实现getter传参
getters: {
getTodoById: (state) => (id) => {
return state.todos.find(todo => todo.id === id)
}
} this.$store.getters.getTodoById(2) // -> { id: 2, done: false } #getter在通过方法访问时,每次都会进去调用,而不会缓存结果
4:mapGetters辅助函数:仅仅是将store中的getter映射到局部计算属性
import { mapGetters } from 'vuex'
computed: {
// 使用对象展开运算符getter混入computed对象中
...mapGetters(['doneTodoCount', '', ...])
}
// 如果想将一个getter属性取别名,使用对象形式
...mapGetters({ doneCount: 'doneTodoCount' })
5:mutations:更改Vuex的store中的状态的唯一方法是提交mutation。每个mutation都有一个字符串类型的事件类型(type)和一个回调函数(handler),这个回调函数是我们实际进行状态更改的地方,接收state作为第一个参数;
const store = new Vue.Store({
state: { count: 1 },
mutations: {
// state和payload两个参数:payload载荷
increment(state, payload) {
state.count += payload
// state.count += payload.amount
}
}
})
// 组件触发回调
this.$store.commit('increment', 10)
// 载荷一般为对象
this.$store.commit('increment', { amount: 10 })
// 对象风格的提交方式:提交mutation的另一种方式是直接包含type属性的对象
store.commit({ type: 'increment', amount: 10 })
#Mutation需遵守Vue的响应规则
~:最好提前在store中初始化好所有的所需属性;
~:当需要在对象上添加新属性时,你应该 使用Vue.set(obj, 'newProp', 123) 或 以新对象替换老对象:state.obj = { ...state.obj, newProp: 123 }
#Mutation必须是同步函数
#在组件中提交Mutation
import { mapMutations } from 'vuex'
methods: {
...mapMutations([
'increment', // 将this.increment() 映射为 this.$store.commit('increment')
'incrementBy', // 将 this.incrementBy(amount)映射为this.$store.commit('incrementBy', amount)
])
...mapMutations({
add: 'increment' // 将this.add()映射为this.$store.commit('increment')
})
}
6:action:提交的是mutation而不是直接变更状态;action可以包含任意异步操作;
action函数接受一个与store实例具有相同方法和属性的context对象;因此可以调用context.commit提交一个mutation或者通过context.state和context.getters来获取state和getters;
action是通过this.$store.dispatch触发;action支持同样的载荷方式和对象方式进行分发;使用方法同mutations
this.$store.dispatch可以处理被触发的action的处理函数返回的promise,并且this.$store.dispatch仍旧返回promise
actions: {
actionA ({ commit }) {
return new Promise((resolve, reject) => {
setTimeout(() => {
commit('someMutation')
resolve()
}, 1000)
})
}
}
this.store.dispatch('actionA').then(() => {
// ...
})
Vue的Vuex的使用的更多相关文章
- Vue 2.0 + Vue Router + Vuex
用 Vue.js 2.x 与相配套的 Vue Router.Vuex 搭建了一个最基本的后台管理系统的骨架. 当然先要安装 node.js(包括了 npm).vue-cli 项目结构如图所示: ass ...
- Vue之Vuex
一.什么是vuex Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化.简单来说就是一个数据统一 ...
- requirejs、vue、vuex、vue-route的结合使用,您认为可行吗?
在五一节之前和一网友讨论前端技术时,对方提到vue.vue-route如果配合requirejs应用.当时的我没有想得很明白,也没能这位网友一个准确的回复,但我许诺于他五一研究后给他一个回复.本是一天 ...
- Vue中Vuex的详解与使用(简洁易懂的入门小实例)
怎么安装 Vuex 我就不介绍了,官网上有 就是 npm install xxx 之类的.(其实就是懒~~~哈哈) 那么现在就开始正文部分了 众所周知 Vuex 是什么呢?是用来干嘛的呢? Vuex ...
- vue:vuex中mapState、mapGetters、mapActions辅助函数及Module的使用
一.普通store中使用mapState.mapGetters辅助函数: 在src目录下建立store文件夹: index.js如下: import Vue from 'vue'; import ...
- vue+vue-router+vuex实战
shopping vue + vue-router + vuex实现电商网站 效果展示 install 下载代码: git clone https://github.com/chenchangyuan ...
- 15.vue动画& vuex
Vue.config.productionTip = false; ==是否显示提示信息== ==import/export== export xxx 必须跟跟对象或者和定义一起 对象: export ...
- Vue、Vuex+Cookie 实现自动登陆 。
概述 1.自动登陆实现思路. 2.vuex + cookie 多标签页状态保持. 自动登陆的需求: 1.登陆时勾选自动登陆,退出登陆或登陆到期后再次登陆后自动填写表单(记住密码)或访问登陆页自动登陆. ...
- 深入浅出的webpack4构建工具--webpack4+vue+route+vuex项目构建(十七)
阅读目录 一:vue传值方式有哪些? 二:理解使用Vuex 三:webpack4+vue+route+vuex 项目架构 回到顶部 一:vue传值方式有哪些? 在vue项目开发过程中,经常会使用组件来 ...
- vue:vuex详解
一.什么是Vuex? https://vuex.vuejs.org/zh-cn 官方说法:Vuex 是一个专为 Vue.js应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相 ...
随机推荐
- 深入 x64
本篇原文为 X64 Deep Dive,如果有良好的英文基础的能力,可以点击该链接进行阅读.本文为我个人:寂静的羽夏(wingsummer) 中文翻译,非机翻,著作权归原作者所有. 由于原文十 ...
- Robinhood基于Apache Hudi的下一代数据湖实践
1. 摘要 Robinhood 的使命是使所有人的金融民主化. Robinhood 内部不同级别的持续数据分析和数据驱动决策是实现这一使命的基础. 我们有各种数据源--OLTP 数据库.事件流和各种第 ...
- 4.1 ROS元功能包
4.1 ROS元功能包 场景:完成ROS中一个系统性的功能,可能涉及到多个功能包,比如实现了机器人导航模块,该模块下有地图.定位.路径规划...等不同的子级功能包.那么调用者安装该模块时,需要逐一的安 ...
- 顺利通过EMC实验(14)
- 关于mui中一个页面有有多个页签进行切换的下拉刷新加搜索问题
此图是最近做的项目中的一页,用的是mui结合vue,用了mui后,觉得是真心难用啊,先不说其他的,就光这个下拉刷新就让人奔溃了,问题层出不穷,不过最后经过努力还是摆平了哈. 1.每次切换到新的标签,都 ...
- sparksql Seq生成DataFrame
首先,使用样例类: case class User(id:Int,name: String,gender:String, age: Int) 之后使用Seq创建Dataframe val alice: ...
- centos报错:Could not retrieve mirrorlist http://mirrorlist.centos.org/
检查是否可以上网. ping 114.114.114.114 如果不可以,调试通.通了之后下一步: 然后检查DNS设置是否正常. ping www.baidu.com 不正常的话,设置DNS,如下: ...
- 【零碎小bug系列】windows下的回车和换行符,cmd(telnet)上输出不左对齐
cmd(telnet)上输出不左对齐,而是有莫名其妙的空格 目录 cmd(telnet)上输出不左对齐,而是有莫名其妙的空格 背景 解决 细究 背景 在cmd上使用telnet连接本地端口的服务器时, ...
- IOH和MCH(北桥芯片的变化)
IOH位置架构图示意图 北桥芯片-MCH和北桥芯片-IOH区别 1.MCH是内存控制器中心的英文缩写,负责连接CPU,AGP总线和内存, 目前Intel的CPU已经把内存控制器(北桥芯片-MCH)总线 ...
- 2021.08.01 P3377 左偏树模板
2021.08.01 P3377 左偏树模板 P3377 [模板]左偏树(可并堆) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<iostream> ...