我与Vuex的第一次邂逅
new Vue({
// state
data () {
return {
count: 0
}
},
// view
template: `
<div>{{ count }}</div>
`,
// actions
methods: {
increment () {
this.count++
}
}
})
上面是我们定义的一个vue的实例
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式
what is 状态管理模式?
状态管理模式
1:state:驱动应用的数据源,比如组件当中的data就是数据源
2:view:以声明的方式将state映射到视图,比如组件上面的那些标签
3:actions:响应在视图view上面用户操作导致的状态变化,比如组件当中methods中的事件
//自己的理解,他们三有啥共同点? count,他们三都用到了这个值,如果只是单个组件中用到这个值,那么还可以控制,如果是多个组件同时用到这个数据呢?
//store就是将这些共享的状态抽出来,用一个全局单例模式进行管理
重点:全局--表示所有的组件都可以访问
:单例--表示Vuex只有一个实例
//这是一个store的实例,暂时还没有加入模块
export default new Vuex.Store({
state,
getters,
mutations,
actions,
})
构造器选项的解析:
state:类型为对象或者函数,如果是对象的话就会被当做根state,如果传入的是一个返回对象的函数,那么返回的对象作为根state
作用:存放数据
全局访问 this.$store.state--将store注入到了根节点的情况
//state对象属性可以定义成所有数据类型
const state = {
userInfo: { phone: 111 }, //用户信息
orderList: [{ orderno: '1111' }], //订单列表
orderDetail: null, //订单产品详情
login: false, //是否登录
numver:1,
myfunction:function() {
console.log(arguments);
},
}
当我们组件需要使用这个状态的时候,并且随着状态改变,组件的视图也会改变,那么最简单的方式就是在计算属性中返回某个状态
const Counter = {
template: `<div>{{ count }}</div>`,
computed: {
count () {
return this.$store.state.count
}
}
}
//待续...如果组件需要多个状态呢?十个状态就要写十个计算实属性吗?
打个比方,你返回了一个数组,但是我们需要的是排序后的数组,并且多个组件都需要这个排序后的数组,解决办法无非是每个组件都重新进行对数组排序,或者写一个公共的方法,然后每个组件都引用这个方法
Vuex 允许我们在 store 中定义“getter”(可以认为是 store 的计算属性)。就像计算属性一样,getter 的返回值会根据它的依赖被缓存起来(当通过属性访问的时候),且只有当它的依赖值发生了改变才会被重新计算,
注意:getter 在通过方法访问时,每次都会去进行调用,而不会缓存结果
getters:{ [key: string]: Function },没错这货是对象,并且他的所有属性都必须为函数
const getters = {
myFirstGetter:function(state,getters){
console.log(arguments);
},
mysecondGetter:function(state,getters){
console.log(arguments);
return function(param) {
console.log(arguments)
}
}
}
作用:定义计算属性 //是的,计算属性,只不过这些计算属性是依赖state里面的数据
原因:我们确实可以在组件中对state的数据进行操作,但是多个组件获取同一个状态,都要进行相同的操作呢,那还不如我们集中管理.
全局访问 this.$store.getters
重点:所有的处理函数总是接收state作为第一个参数 ,接收其他的getter作为第二个参数
getters里面的方法的调用方式:
1:以属性的形式访问store.getters.funName //不要带括号,不要带括号,不要带括号
2:以方法的形式访问store.getters.funName(param) //前提是这个定义的方法的返回值必须是个函数,且param是作为返回值函数的参数.
待续.... 但是函数的参数很奇怪啊
mutations:类型{ [type: string]: Function },一个又一个函数
官方文档解释 { [type: string](事件类型): Function(回调函数) }
作用:如果我们在各自的组件当中更改状态的话,那么必然导致其他的组件也会更新该状态,最后我们都不知道到底是谁在更新这个状态,所以采用mutations提交的形式进行状态更改的管理,像不像git提交代码的形式...
全局访问 this.$store._mutations
重点:所有的回调函数(也就是进行状态更改的地方)总是接收state(没错就是上面的那个state)作为第一个参数
mutations里面的方法调用方式:
store.commit('funName')--这种是我们没有把store注入到根组件
this.$store.commit('funName') --这种是注入了根组件,那么在每一个子组件都可以这种方式 然后我们还可以传参数
this.$store.commit('funName',{}) 参数作为对象这样可以包含多个字段
还有一种方式,使用包含type属性的对象, this.$store.commit({type:'funName',key:value}) 重点:原则就是要记住 mutation 必须是同步函数
actions:类型{ [type: string]: Function },也是一个又一个函数,
官方文档解释 { [type: string](事件类型): Function(回调函数) }在回调函数当中,我们进行状态改变
全局访问 this.$store._actions
actions里面的方法调用方式: store.dispatch('funName') 同理于mutations
重点:所有的处理函数总是接收"context"作为第一个参数,他是一个对象... 一个与 store 实例具有相同方法和属性的对象
{ //感觉好厉害的样式,但是暂时不知道有什么用
state, // 等同于 `store.state`,若在模块中则为局部状态
rootState, // 等同于 `store.state`,只存在于模块中
commit, // 等同于 `store.commit`
dispatch, // 等同于 `store.dispatch`
getters, // 等同于 `store.getters`
rootGetters // 等同于 `store.getters`,只存在于模块中
} 重点:Action 与mutations的区别
1:Action 提交的是 mutation,而不是直接变更状态
2:Action 可以包含任意异步操作
Module:Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter
甚至于嵌套子模块,模块又是由几个模块组成
const moduleA = {
state: { ... },
mutations: { ... },
actions: { ... },
getters: { ... }
} const moduleB = {
state: { ... },
mutations: { ... },
actions: { ... }
} const store = new Vuex.Store({
modules: {
a: moduleA,
b: moduleB
}
}) 1:对于模块内部的 mutation 和 getter,接收的第一个参数是模块的局部状态对象 --state
2:对于模块内部的actions,局部状态通过 context.state暴露出来,根节点状态则为 context.rootState
3:对于模块内部的 getter,根节点状态会作为第三个参数暴露出来
我与Vuex的第一次邂逅的更多相关文章
- Vue 爬坑之路(四)—— 与 Vuex 的第一次接触
在 Vue.js 的项目中,如果项目结构简单, 父子组件之间的数据传递可以使用 props 或者 $emit 等方式 http://www.cnblogs.com/wisewrong/p/62660 ...
- 与python的第一次邂逅
python简介 一.什么是python python是一种面向对象.直译式的计算机程序语言,所以有了武老师的那句名言:一切皆为对象 python的设计哲学是:“优雅”,“明确”,“简单” pytho ...
- Vuex的第一次接触
前言:最近在做Vue实现去哪网,想要实现在城市列表页面,点击某个城市的时候,主页的头部的城市会随着改变,就是首页和城市页面有共用的数据要分享,这里使用Vuex 1. Vuex是什么? 是Vue官方推荐 ...
- (转)Vue 爬坑之路(四)—— 与 Vuex 的第一次接触
在 Vue.js 的项目中,如果项目结构简单, 父子组件之间的数据传递可以使用 props 或者 $emit 等方式 http://www.cnblogs.com/wisewrong/p/62660 ...
- Vue ---- Vuex 的第一次接触
在 Vue.js 的项目中,如果项目结构简单, 父子组件之间的数据传递可以使用 props 或者 $emit 等方式 http://www.cnblogs.com/wisewrong/p/62660 ...
- Vue 爬坑之路(六)—— 使用 Vuex + axios 发送请求
Vue 原本有一个官方推荐的 ajax 插件 vue-resource,但是自从 Vue 更新到 2.0 之后,官方就不再更新 vue-resource 目前主流的 Vue 项目,都选择 axios ...
- vuex状态管理工具
父子组件之间的通信 props传递 父 向子单向传递:且每次 父组件更新时 子组件的props会跟着更新: 如果需要 子组件把数据传递给父组件,就需要在子组件上绑定自定事件 在子组件使用this ...
- session和cookie
第一次听到cookie这个词的时候着实兴奋了一段时间,以为是小饼干呢~快喝一杯82年的java压压惊!哈哈~ 与cookie的第一次邂逅——清缓存和清cookie 刚毕业的时候上班,做二次开发,明明后 ...
- Vue 爬坑之路(九)—— 用正确的姿势封装组件
迄今为止做的最大的 Vue 项目终于提交测试,天天加班的日子终于告一段落... 在开发过程中,结合 Vue 组件化的特性,开发通用组件是很基础且重要的工作 通用组件必须具备高性能.低耦合的特性 为了满 ...
随机推荐
- django配置一个网站建设
第一步: 安装数据库MySQL,也可以使用pycharm自带的数据库sqllite,大项目要使用数据库.安装请参考上篇. 数据库在pycharm中驱动设置,setting文件中修改驱动文件密码等信息. ...
- bzoj 2721
题解:首先推一发式子(见csdn https://blog.csdn.net/lleozhang/article/details/83415995) 因为x是整数,所以x的数量显然为能使取得整数的t的 ...
- IP的计算
IP的计算 时间限制: 1 Sec 内存限制: 32 MB 位无符号整数来表示,一般用点分方式来显示,点将IP地址分成4个部分,每个部分为8位,表示成一个无符号整数(因此不需要用正号出现),如192 ...
- 封装input 逐渐,且input插件必须带有默认值。
封装input 逐渐,且input插件必须带有默认值. 组件: <template> <div class="input-show"> <span c ...
- Coding配合git使用时遇到的问题
转载整理: https://www.jianshu.com/p/b23cd00cffa6 https://www.cnblogs.com/yidoucai/p/5228763.html https:/ ...
- Loadrunner11.0 录制手机App脚本的方法一
使用Loadrunner录制手机终端App脚本 1. 说明 目前手机APP上的功能日益丰富,对手机应用功能的性能测试需求也越来越多.公司比较抠门没有花钱买Loadrunner,可怜我们工作中一直用的破 ...
- bat 获取拖放文件路径或名称
获取路径: @echo offset path=%~dp1echo %path%pause 获取路径及名称: @echo offset path=%~dp1%~nx1echo %path%pause
- 优先选择nullptr而不是0和NULL
我们知道:0是一个int,而不是一个指针.如果C++在一个只有指针才能够使用的上下文中发现它只有一个0,那么它会勉强将0解释成空指针,但那时一种倒退行为.C++的主要方针是0就是一个int,而不是指针 ...
- Java+selenium之WebDriver页面元素的操作(三)
1. 输入框(text field or textarea) WebElement we = driver.findElement(By.id("id")); //将输入框清空 w ...
- python项目实战三个小实例
1. 让用户输入圆的半径,告诉用户圆的面积: import math while True: # 用户输入 r = input("请输入圆的半径:") ...