Vuex中状态管理器的使用详解

目录
  • 一、Vuex是什么?
  • 二、什么时候使用Vuex
  • 三、Vuex的核心概念和API
  • 四、应用举例
  • 五、vuex中各种辅助函数的用法,可以使我们更加方便的运用vuex

一、Vuex是什么?

Vuex在Vue项目开发时使用的状态管理工具简单来说,就是对Vue的应用中多个组件的共享状态进行集中式的管理(读/

Vuex实现了一个单向数据流,在全局拥有一个State存放数据,当组件要更改State中的数据时,必须通过Mutation进行,Mutation同时提供了订阅者模式供外部插件调用获取State数据的更新。

而当所有异步操作(常见于调用后端接口异步获取更新数据)或批量的同步操作需要走Action,但Action也是无法直接修改State的,还是需要通过Mutation来修改State的数据。最后,根据State的变化,渲染到视图上。

二、什么时候使用Vuex

不适用场景:小型简单应用,用 Vuex 是繁琐冗余的,更适合使用简单的store模式

适用场景:构建一个中大型单页应用,可能会考虑如何更好地在组件外部管理状态,即多个组件共享状态:

多个视图依赖于同一状态:此时传参的方法对于多层嵌套的组件将会非常繁琐,并且对于兄弟组件间的状态传递无能为力。

来自不同视图的行为需要变更同一状态此时采用父子组件直接引用或者通过事件来变更和同步状态的多份拷贝,通常会导致无法维护的代码

在这些情况下就适合用Vuex进行全局单例模式管理

三、Vuex的核心概念和API

流程:View -> Actions -> Mutations -> State -> View

1、state

1) vuex 管理的状态对象

2) 它应该是唯一的

const state = {
xxx: initValue
}

2、 mutations

1) 包含多个直接更新 state 的方法(回调函数)的对象

2) 谁来触发: action 中的 commit('mutation 名称')或者在组件中通过this.$store.commit(‘xxx’,params)使用。这个和组件中的自定义事件类似

3) 只能包含同步的代码, 不能写异步代码

const mutations = {
xxx(state, {data1}) {
// 更新 state 的某个属性
}
}

3、 actions

1) 提交 mutation,异步操作。包含多个事件回调函数的

2) 通过执行: commit()来触发 mutation 的调用, 间接更新 state

3) 谁来触发: 组件中通过this.$store.dispatch('action 名称', data1)

4) 可以包含异步代码(axios)

const actions ={
zzz ({commit, state}, data1){
commit('xxx', {data1})
}
}

4、 getters

1) 对数据获取之前的再次编译,可以理解为state的计算属性

2) 谁来读取: 组件中: this.$store.getters.xxx

const getters ={
xxx(state) {
return ...
}
}

5、 modules

1) 包含多个 module:store的子模块,为了开发大型项目,方便状态管理而使用的,即将store分割为模块,使store对象不会太臃肿。

2)一个 module 是一个 store 的配置对象

3) 与一个组件(包含有共享数据)对应

四、应用举例

1、安装:npm i vuex -S

2、创建store:src/store/index.js

import { createStore} from "vuex";
export default createStore({
    //vuex中的数据源,我们需要保存的数据就保存在这里,可以在组件通过 this.$store.state来获取我们定义的数据;
    state: {
        count: 0,
        age: 0
    },
    /*
      (1)Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算
      (2)通过属性访问Getter会暴露为 store.getters 对象,可以以属性的形式访问这些值:this.$store.getters.xxx
      (3)Getters 可以用于监听state中的值的变化,返回计算后的结果
    */
    getters: {
        getterAge(state){
            return state.age =25
        }
    },
    /*
       更改 Vuex 的 store 中的状态的唯一方法是提交 mutation,并且Mutation 必须是同步函数
       在sotre.js中定义mutations对象,该对象中有两个方法,mutations里面的参数,第一个默认为state,
       其中第二个参数obj在官方文档就是载荷(payload),可以传入参数及对象。
       在大多数情况下,载荷应该是一个对象,这样可以包含多个字段并且记录的 mutation 会更易读
     */
    mutations: {
        addCount(state,obj){
            return state.count += obj.num
        },
        subCount(state,obj){
            return state.count -= obj.num
        }
    },
    actions: {
        addCountAsyn(context){
            setTimeout(()=>{
                context.commit('addCount',{
                    num: 1
                })
            },3000)
        },
        subCountAsyn(context){
            setTimeout(()=> {
                context.commit('subCount',{
                    num: 1
                })
            },2000)
        }
    }
})

3、在main.js文件中使用store

4、创建Home.vue组件

<template>
  <div>
    <h2>通过getter获得计算后的年龄:{{ getterAge }}</h2>
    <p>Count:{{ count }}</p>
    <button @click="handlerAdd()">加1</button>
    <button @click="handlerSub()">减1</button>
    <button @click="handlerAddAnys()">异步增加(2s后执行)</button>
    <button @click="handlerSubAnys()">异步减少(2s后执行)</button>
  </div>
</template>

<script>
export default {
  name: "Home",
  computed: {
    count(){
      return this.$store.state.count
    },
    getterAge(){
      return this.$store.getters.getterAge
    }
   },
  methods: {
    handlerAdd(){
      this.$store.commit("addCount",{
        num: 1
      })
    },
    handlerSub(){
      this.$store.commit("subCount",{
        num: 1
      })
    },
    handlerAddAnys(){
      this.$store.dispatch('addCountAsyn')
    },
    handlerSubAnys(){
      this.$store.dispatch('subCountAsyn')
    }
   }
}
</script>

6、在App.vue中导入Home.vue

7、运行效果:

五、vuex中各种辅助函数的用法,可以使我们更加方便的运用vuex

1、…mapState

count(){
     return this.$store.state.count
},

等价于

...mapState([
  'count'
]),

2、…mapGetters

getterAge(){
  return this.$store.getters.getterAge
}

等价于

...mapGetters(['getterAge'])    

3、…mapMutations:使用辅助函数后载荷的传参,直接在调用的地方进行传参便可

handlerAdd(){
  this.$store.commit("addCount",{
    num: 1
  })
},
handlerSub(){
  this.$store.commit("subCount",{
    num: 1
  })
},

等价于

...mapMutations({
  handlerAdd: 'addCount',
  handlerSub: 'subCount'
})

4、…mapActions

handlerAddAnys(){
  this.$store.dispatch('addCountAsyn')
},
handlerSubAnys(){
  this.$store.dispatch('subCountAsyn')
}

等价于

...mapActions({
  handlerAddAnys: 'addCountAsyn',
  handlerSubAnys: 'subCountAsyn'
})

修改上例中的Home.vue组件

到此这篇关于Vuex---状态管理器的使用的文章就介绍到这了,更多相关Vuex状态管理器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2022-06-22

Vue的Flux框架之Vuex状态管理器

学习vue之前,最重要是弄懂两个概念,一是"what",要理解vuex是什么:二是"why",要清楚为什么要用vuex. Vuex是什么? Vuex 类似 React 里面的 Redux 的状态管理器,用来管理Vue的所有组件状态. 为什么使用Vuex? 当你打算开发大型单页应用(SPA),会出现多个视图组件依赖同一个状态,来自不同视图的行为需要变更同一个状态. 遇到以上情况时候,你就应该考虑使用Vuex了,它能把组件的共享状态抽取出来,当做一个全局单例模式进行管理

详解vue组件化开发-vuex状态管理库

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化.Vuex 也集成到 Vue 的官方调试工具 devtools extension,提供了诸如零配置的 time-travel 调试.状态快照导入导出等高级调试功能. 以上是vuex的官方文档对vuex的介绍,官方文档对vuex的用法进行了详细的说明.这里就不再细讲vuex的各个用法,写这篇博客的目的只是帮助部分同学更快地理解并上手vuex.

一篇看懂vuejs的状态管理神器 vuex状态管理模式

关于vuex类的新闻最近很多,看到眼热就去查了下资料,然后扯出来一堆flux.redux.state.state之类的概念,以及大型工程必要性之类的.看官方手册也是昏昏然. 然而,我还是弄懂了!我准备从demo出发,以同样的一个最简单的demo,演示两种情况下的代码编写情况: 单纯依赖于vue.js 依赖vue.js,也使用了vuex技术 目的是通过对比引出vuex的概念.优势和劣势.也许这是目前最接地气的vuex的介绍吧:).所以无论如何在了解vuex之前,你必须懂得vue.js(好像废话:)

详解vuex状态管理模式

一.前言 本次接受一个BI系统,要求是能够接入数据源-得到数据集-对数据集进行处理-展现为数据的可视化,这一个系统为了接入公司自身的产品,后端技术采用spring boot,前端采用vue+vuex+axios的项目架构方式,vuex作为vue的状态管理,是尤为重要的部分.这里,我将vuex如何运作和使用做一次总结,有错的地方,望多多提点. 二.vuex简单使用 安装vuex cnpm install vuex --save 在src目录下建立文件夹,命名为store,建立index.js 如图

jQuery Ajax请求状态管理器打包

然而,无论有多么接近,通过客户端与服务端的一来一回,必定会有等待加载数据的时间.所以,大多数网站都通过一个Gif动态图标或'Loading...'等字样来告知用户数据还在加载中.但有时候这个问题会非常繁琐和麻烦,要么将这个'Loading'显示在ajax请求之前,然后在ajax成功后隐藏它,或者将它写在jquery的ajax的全局事件jQuery.ajaxStart()和jQuery.ajaxStop()中来控制整个页面的ajax状态.前者方法使用起来太琐碎,每个请求都要写一遍这个'Loadin

详解Python的Twisted框架中reactor事件管理器的用法

铺垫 在大量的实践中,似乎我们总是通过类似的方式来使用异步编程: 监听事件 事件发生执行对应的回调函数 回调完成(可能产生新的事件添加进监听队列) 回到1,监听事件 因此我们将这样的异步模式称为Reactor模式,例如在iOS开发中的Run Loop概念,实际上非常类似于Reactor loop,主线程的Run Loop监听屏幕UI事件,一旦发生UI事件则执行对应的事件处理代码,还可以通过GCD等方式产生事件至主线程执行. 上图是boost对Reactor模式的描绘,Twisted的设计就是基于

Vue的状态管理vuex使用方法详解

引入vuex 当访问数据对象时,一个 Vue 实例只是简单的代理访问.所以,如果有一处需要被多个实例间共享的状态,可以简单地通过维护一份数据来实现共享 const sourceOfTruth = {} const vmA = new Vue({ data: sourceOfTruth }) const vmB = new Vue({ data: sourceOfTruth }) 现在当 sourceOfTruth 发生变化,vmA 和 vmB 都将自动的更新引用它们的视图.子组件们的每个实例也会

vue的状态管理模式vuex

vuex是一个专门为vue.js设计的状态管理模式,并且也可以使用devtools进行调试. 备注:本文的示例等代码将会采用es6的语法. 链接 vuex官方中文网站 使用vue和vuex实现的简易商城,仅供参考 vuex是什么? 先引用vuex官网的话: Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 状态管理模式.集中式存储管理 一听就很高大上,蛮吓人的.在我看来 vuex 就是把需

简述vue状态管理模式之vuex

了解vuex核心概念请移步 https://vuex.vuejs.org/zh/ 一.初始vuex 1.1 vuex是什么 那么先来看看这两个问题: 什么是vuex?官网说:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式. 按个人通俗理解来说就是:vuex就是用来管理各个组件之间的一些状态,可以理解为这些状态就是公共(共享)部分.此时任何组件都能从中获取状态或者触发一些行为事件. 什么情况下用到vuex?官网说:如果您不打算开发大型单页应用,使用 Vuex 可能是繁琐冗余的.确实

vue.js的状态管理vuex中store的使用详解

一.状态管理(vuex)简介 vuex是专为vue.js应用程序开发的状态管理模式.它采用集中存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化.vuex也集成刀vue的官方调试工具devtools extension,提供了诸如零配置的time-travel调试.状态快照导入导出等高级调试功能. 二.状态管理核心 状态管理有5个核心,分别是state.getter.mutation.action以及module.分别简单的介绍一下它们: 1.state state为