摘要:中的非常类似于事件每个都有一个字符串的事件类型和一个回调函数。这个回调函数就是我们实际进行状态更改的地方,并且它会接受作为第一个参数提交载荷你可以向传入额外的参数,即的载荷类似于,不同在于提交的是,而不是直接变更状态可以包含任意异步操作
Vuex 入门
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。说白了,vuex就是用来管理数据的。
直接下载或者CDN引入
https://unpkg.com/vuex
Vuex的核心就是store(仓库),其包含应用中的大部分状态。Vuex 和单纯的全局对象有以下两点不同:
Vuex的状态存储时响应式的
store中状态不能直接改变
现在我们来创建一个store:
new Vuex.Store({ state:{ //...... }, mutations:{ } })
在这个store里,包含了一个 state 对象和 mutations
state用来存储初始化的数据,读取数据使用 store.state.数据 。
修改数据使用 mutations ,调用 mutations 里的数据需要使用 commit()
现在来尝试使用以下vuex,做一个简单的计数程序:
HTML
javascript
var store = new Vuex.Store({ state:{ count:0 }, mutations:{ plus(state){ state.count++ }, less(state){ state.count-- } } }); var app=new Vue({ el:"#app", template:"#tpl", components:{ tip:{ template:"vuex的核心{{$store.state.count}}" }, btn:{ template:`` } }, store }}
State
Getters
Mutations
Actions
Modlues
State由于 Vuex 的状态存储是响应式的,从 store 实例中读取状态最简单的方法就是在计算属性中返回某个状态:
// 创建一个 Counter 组件 const Counter = { template: `{{ count }}`, computed: { count () { return store.state.count } } }
每当 store.state.count 变化的时候, 都会重新求取计算属性,并且触发更新相关联的 DOM。
mapState 辅助函数当一个组件需要获取多个状态时候,将这些状态都声明为计算属性会有些重复和冗余。为了解决这个问题,我们可以使用 mapState 辅助函数帮助我们生成计算属性,让你少按几次键:
// 在多带带构建的版本中辅助函数为 Vuex.mapState import { mapState } from "vuex" export default { // ... computed: mapState({ // 箭头函数可使代码更简练 count: state => state.count, // 传字符串参数 "count" 等同于 `state => state.count` countAlias: "count", // 为了能够使用 `this` 获取局部状态,必须使用常规函数 countPlusLocalState (state) { return state.count + this.localCount } }) }Getters
有时候我们需要从 store 中的 state 中派生出一些状态,例如对列表进行过滤并计数:
computed: { doneTodosCount () { return this.$store.state.todos.filter(todo => todo.done).length } }
如果有多个组件需要用到此属性,我们要么复制这个函数,或者抽取到一个共享函数然后在多处导入它 —— 无论哪种方式都不是很理想。
Vuex 允许我们在 store 中定义『getters』(可以认为是 store 的计算属性)。就像计算属性一样,getters的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。
Getters 接受 state 作为其第一个参数:
const store = new Vuex.Store({ state: { todos: [ { id: 1, text: "...", done: true }, { id: 2, text: "...", done: false } ] }, getters: { doneTodos: state => { return state.todos.filter(todo => todo.done) } } }) store.getters.doneTodes
Getters 也可以接受其他 getters 作为第二个参数:
getters: { // ... doneTodosCount: (state, getters) => { return getters.doneTodos.length } } store.getters.doneTodosCount
我们可以很容易地在任何组件中使用它:
computed: { doneTodosCount () { return this.$store.getters.doneTodosCount } }mapGetters 辅助函数
mapGetters 辅助函数仅仅是将 store 中的 getters 映射到局部计算属性:
computed:{ ...mapGetters([ // 使用对象展开运算符将 getters 混入 computed 对象中 "doneTodosCount", "anotherGetters" ]) }Mutations
更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex 中的 mutations 非常类似于事件:每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数:
const store = new Vuex.Store({ state:{ count:0 }, mutations:{ plus(state){ state.count++ }, less(state){ state.count-- } } });提交载荷(Paylaod)
你可以向 store.commit 传入额外的参数,即 mutation 的 载荷(payload):
const store = new Vuex.Store({ state:{ count:0 }, mutations:{ plus(state,n){ state.count+=n }, less(state,n){ state.count-=n } } }); this.$store.commit("plus",5) this.$store.commit("less",5)Actions
Action 类似于 mutation,不同在于:
Action 提交的是 mutation ,而不是直接变更状态
Action 可以包含任意异步操作
actions:{ plus(commit){ commit({type:"plus",n:5}) } }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/91804.html
摘要:写在前面本文旨在通过一个简单的例子,练习的几个常用方法,使初学者以最快的速度跑起来一个的示例。生成基于的项目基于脚手架生成一个项目常用命令项目名进入项目目录,使用先试着跑一下。子组件可以修改父组件和自己的数据。 写在前面 本文旨在通过一个简单的例子,练习vuex的几个常用方法,使初学者以最快的速度跑起来一个vue + vuex的示例。 学习vuex需要你知道vue的一些基础知识和用法。...
摘要:每一条被记录,都需要捕捉到前一状态和后一状态的快照。然而,在上面的例子中中的异步函数中的回调让这不可能完成因为当触发的时候,回调函数还没有被调用,不知道什么时候回调函数实际上被调用实质上任何在回调函数中进行的状态的改变都是不可追踪的。 前言 之前几个项目中,都多多少少碰到一些组件之间需要通信的地方,而因为种种原因,event bus 的成本反而比vuex还高, 所以技术选型上选用了 v...
摘要:每一条被记录,都需要捕捉到前一状态和后一状态的快照。然而,在上面的例子中中的异步函数中的回调让这不可能完成因为当触发的时候,回调函数还没有被调用,不知道什么时候回调函数实际上被调用实质上任何在回调函数中进行的状态的改变都是不可追踪的。 前言 之前几个项目中,都多多少少碰到一些组件之间需要通信的地方,而因为种种原因,event bus 的成本反而比vuex还高, 所以技术选型上选用了 v...
阅读 704·2021-11-22 13:54
阅读 3064·2021-09-26 10:16
阅读 3486·2021-09-08 09:35
阅读 1575·2019-08-30 15:55
阅读 3428·2019-08-30 15:54
阅读 2074·2019-08-30 10:57
阅读 496·2019-08-29 16:25
阅读 876·2019-08-29 16:15