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的第一次邂逅的更多相关文章

  1. Vue 爬坑之路(四)—— 与 Vuex 的第一次接触

    在 Vue.js 的项目中,如果项目结构简单, 父子组件之间的数据传递可以使用  props 或者 $emit 等方式 http://www.cnblogs.com/wisewrong/p/62660 ...

  2. 与python的第一次邂逅

    python简介 一.什么是python python是一种面向对象.直译式的计算机程序语言,所以有了武老师的那句名言:一切皆为对象 python的设计哲学是:“优雅”,“明确”,“简单” pytho ...

  3. Vuex的第一次接触

    前言:最近在做Vue实现去哪网,想要实现在城市列表页面,点击某个城市的时候,主页的头部的城市会随着改变,就是首页和城市页面有共用的数据要分享,这里使用Vuex 1. Vuex是什么? 是Vue官方推荐 ...

  4. (转)Vue 爬坑之路(四)—— 与 Vuex 的第一次接触

    在 Vue.js 的项目中,如果项目结构简单, 父子组件之间的数据传递可以使用  props 或者 $emit 等方式 http://www.cnblogs.com/wisewrong/p/62660 ...

  5. Vue ---- Vuex 的第一次接触

    在 Vue.js 的项目中,如果项目结构简单, 父子组件之间的数据传递可以使用  props 或者 $emit 等方式 http://www.cnblogs.com/wisewrong/p/62660 ...

  6. Vue 爬坑之路(六)—— 使用 Vuex + axios 发送请求

    Vue 原本有一个官方推荐的 ajax 插件 vue-resource,但是自从 Vue 更新到 2.0 之后,官方就不再更新 vue-resource 目前主流的 Vue 项目,都选择 axios ...

  7. vuex状态管理工具

    父子组件之间的通信  props传递  父 向子单向传递:且每次 父组件更新时  子组件的props会跟着更新: 如果需要 子组件把数据传递给父组件,就需要在子组件上绑定自定事件 在子组件使用this ...

  8. session和cookie

    第一次听到cookie这个词的时候着实兴奋了一段时间,以为是小饼干呢~快喝一杯82年的java压压惊!哈哈~ 与cookie的第一次邂逅——清缓存和清cookie 刚毕业的时候上班,做二次开发,明明后 ...

  9. Vue 爬坑之路(九)—— 用正确的姿势封装组件

    迄今为止做的最大的 Vue 项目终于提交测试,天天加班的日子终于告一段落... 在开发过程中,结合 Vue 组件化的特性,开发通用组件是很基础且重要的工作 通用组件必须具备高性能.低耦合的特性 为了满 ...

随机推荐

  1. jenkins自动发布java代码

    注:本文来源于<KaliArch> jenkins笔记 一.相关概念 1.1 Jenkins概念: Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台. ...

  2. Java 银联支付官网demo测试及项目整合代码

    注:原文来源与 < Java 银联支付官网demo测试及项目整合代码  > 银联支付(网关支付B2C) 一.测试官网demo a)下载官网开发包,导入eclipse等待修改(下载的开发包没 ...

  3. js原生回到顶部,并平滑过渡---- 记录

    window.scrollTo({ top: 0, behavior: 'smooth', });

  4. NHibernate入门

    这里是官方的Demo,可以看看,因为我也是通过官方的demo学习的.   https://github.com/nhibernate/nhibernate-core/tree/master/src/N ...

  5. centos7安装laravel

    一. 安装前准备1. 安装screenyum install screen 2. 安装wgetyum install wget 3. 更新yumyum update 4. 安装额外资源库yum ins ...

  6. Allegro PCB Design GXL (legacy) 从dxf文件中导入板框

    Allegro PCB Design GXL (legacy) version 16.6-2015 新建brd文件,并设置好相应的参数之后,点击菜单:File > Import > DXF ...

  7. MAC 调用GCC 提示xcrun: error: invalid active developer path

    xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: ...

  8. 泛微云桥e-Bridge安装手册

    有时候不看官方文档进行配置,可能会出现奇奇怪怪的问题,SO转载一下官方文档,顺带学习. 想超长体验此软件,请搜索本博客内容,有破解方法,仅用来学习使用,顺带进行二次开发,请勿使用在商业用途,谢谢. 泛 ...

  9. Redis 学习手册

    一:Redis的简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,和Memcached类似,它支持存储的value类型相对更多,包 ...

  10. python---数学表达式的分析树实现

    先走一遍, 前面很多知道点,都串起来了. # coding = utf-8 # 使用列表实现栈的功能 class Stack: def __init__(self): self.items = [] ...