一、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的使用的更多相关文章

  1. Vue 2.0 + Vue Router + Vuex

    用 Vue.js 2.x 与相配套的 Vue Router.Vuex 搭建了一个最基本的后台管理系统的骨架. 当然先要安装 node.js(包括了 npm).vue-cli 项目结构如图所示: ass ...

  2. Vue之Vuex

    一.什么是vuex Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化.简单来说就是一个数据统一 ...

  3. requirejs、vue、vuex、vue-route的结合使用,您认为可行吗?

    在五一节之前和一网友讨论前端技术时,对方提到vue.vue-route如果配合requirejs应用.当时的我没有想得很明白,也没能这位网友一个准确的回复,但我许诺于他五一研究后给他一个回复.本是一天 ...

  4. Vue中Vuex的详解与使用(简洁易懂的入门小实例)

    怎么安装 Vuex 我就不介绍了,官网上有 就是 npm install xxx 之类的.(其实就是懒~~~哈哈) 那么现在就开始正文部分了 众所周知 Vuex 是什么呢?是用来干嘛的呢? Vuex ...

  5. vue:vuex中mapState、mapGetters、mapActions辅助函数及Module的使用

    一.普通store中使用mapState.mapGetters辅助函数: 在src目录下建立store文件夹: ​ index.js如下: import Vue from 'vue'; import ...

  6. vue+vue-router+vuex实战

    shopping vue + vue-router + vuex实现电商网站 效果展示 install 下载代码: git clone https://github.com/chenchangyuan ...

  7. 15.vue动画& vuex

    Vue.config.productionTip = false; ==是否显示提示信息== ==import/export== export xxx 必须跟跟对象或者和定义一起 对象: export ...

  8. Vue、Vuex+Cookie 实现自动登陆 。

    概述 1.自动登陆实现思路. 2.vuex + cookie 多标签页状态保持. 自动登陆的需求: 1.登陆时勾选自动登陆,退出登陆或登陆到期后再次登陆后自动填写表单(记住密码)或访问登陆页自动登陆. ...

  9. 深入浅出的webpack4构建工具--webpack4+vue+route+vuex项目构建(十七)

    阅读目录 一:vue传值方式有哪些? 二:理解使用Vuex 三:webpack4+vue+route+vuex 项目架构 回到顶部 一:vue传值方式有哪些? 在vue项目开发过程中,经常会使用组件来 ...

  10. vue:vuex详解

    一.什么是Vuex? https://vuex.vuejs.org/zh-cn 官方说法:Vuex 是一个专为 Vue.js应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相 ...

随机推荐

  1. osi七层模型&tcp/udp

    1.TCP/UDP协议 1.1 TCP协议 可靠,速度慢,全双工通信 建立连接三次握手,断开连接四次挥手 建立起链接之后,发送每条消息都有回执,为了保证数据的完整性,还有重传机制 数据传输:有收必有发 ...

  2. 学习DNS(一)

    DNS(Domain Name System,域名系统)因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户方便的访问互联网,而不用去记住能够被机器读取的IP数串.通过主机名,最终得到该主 ...

  3. BMZCTF phar???

    pchar??? 补充知识点 开始这题之前我们先补充一个知识点 phar 的文件包含 和上面类似先创建一个phar 标准包,使用 PharData 来创建,然后添加文件进去phar里面. 然后在文件包 ...

  4. carsim2016事件如何设置

    #carsim2016事件设置# 完成以下功能:车速低于60km/h时,加速,设置节气门开度为0.8,制动主斜体样式缸压力设为0:车速高于120km/h时,制动,设置节气门开度为0,制动主缸压力设置为 ...

  5. 《深入理解ES6》笔记——块级作用域绑定(1)

    本章涉及3个知识点,var.let.const,现在让我们了解3个关键字的特性和使用方法. var JavaScript中,我们通常说的作用域是函数作用域,使用var声明的变量,无论是在代码的哪个地方 ...

  6. spring框架常见的10个问题

    一.找不到配置文件的异常org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML ...

  7. Java中JSONArray转换成int[]的办法

    今天写项目的时候要做一个MyBatis的带IN子句的删除,于是用一个整型数组来保存待删除数据的ID 从前端将JSON字符串搞过来之后如何将JSONArray转换成int类型数组就成了个问题 下面是我的 ...

  8. Python实现简单用户注册信息管理系统

    运行效果: 注意:运行前请在同一目录下创建一个userdata.bin用于保存用户数据 源代码: 1 # coding:utf-8 2 ''' 3 用户注册信息管理系统 4 功能包括: 5 1.查看全 ...

  9. spring总览

    Spring 概述 1. 什么是spring? Spring 是个java企业级应用的开源开发框架.Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用.Spring  ...

  10. shiro之第一个程序认证

    有关shiro的介绍请访问https://blog.csdn.net/Kevinnsm/article/details/111823268 三个核心组件:Subject, SecurityManage ...