≡
  • 网络编程
  • 数据库
  • CMS技巧
  • 软件编程
  • PHP笔记
  • JavaScript
  • MySQL
位置:首页 > 网络编程 > vue.js

分析Vue中状态管理Vuex

人气:379 时间:2019-04-07

这篇文章主要为大家详细介绍了分析Vue中状态管理Vuex,具有一定的参考价值,可以用来参考一下。

感兴趣的小伙伴,下面一起跟随四海网的小编两巴掌来看看吧!

vuex是一个专门为vue.js设计的状态管理模式,并且也可以使用devtools进行调试。

在vuex出现之前,vue里面的状态是属于‘单向数据流'。举个官网的例子:

代码如下:


new Vue({
  // state
  data () {
    return {
      count: 0
    }
  },
  // view
  template: `<div>{{ count }} </div`,
  // actions
  methods: {
    increment () {
      this.count++
    }
  }
})

其中

  1. state是一个数据源
  2. view以声明的方式将state映射到视图
  3. actions 响应在view上的用户输入导致的状态变化

【图片暂缺】

但是解决不了 多个组件共享状态

所以vuex应运而生

【图片暂缺】

简单来说,就是共享的状态用state来存放,用mutations来操作state,但是需要用store.commit来主动式的操作mutations。

下面来单独介绍 state,getters,mutations,actions,modules

 

State

 

单一状态树

vuex使用单一状态树,那么就可以用一个对象来包含全部的应用层级状态。所以state就作为数据源。

 

如何在组件中获得vuex状态?

 

 

由于vuex的状态存储是响应式的,所以从store实例中读取状态的最简单方法就是使用计算属性来返回某个状态:

这个是store/state.js中声明的数据源

【图片暂缺】

这个是在组件中进行的引用

【图片暂缺】

不过需要注意的是,在组件中进行引用之前,需要先在入门文件中进行注入
即:

【图片暂缺】

如果不在根实例中注册store选项的话,那么需要在每一个使用state的组件中都要导入。

注册之后,子组件只需要this.$store即可调用vuex。

 

Getters

 

有时候我们需要从state中派生出一些状态,比如筛选一组列表,并且这个筛选后的数据是有其他组件要用的。那么我们就需要把这个结果进行包装,形成共享状态。

例如:

代码如下:


computed:{
  doneTodosCount () {
    return this.$store.state.todos.filter(todo => todo.done).length
  }
}

如果说这个length是其他组件用的话,那么如何做呢?

Getter就这样应运而生了。

代码如下:


getters: {
  doneTodosCount: state => {
    return state.todos.filter(todo => todo.done).length
  }
}

Getter 会暴露为store.getters对象

所以很容易在任何组件中使用它:

代码如下:


computed: {
  doneTodosCount () {
    return this.$store.getters.doneTodosCount
  }
}

这是getters.js

【图片暂缺】

这是组件中的引用

【图片暂缺】

 

Mutations

 

更改Vuex的store中的状态的唯一方法就是提交mutations。

Vuex中的mutations就像一个事件:每个mutations都有一个字符串的事件类型(type)和一个回调函数(handler)。这个回调函数接受state作为第一个参数。

但是我们又不能直接来调用一个mutations的handler。要唤醒一个mutations handler,需要以相应的type来调用store.commit方法。

这个是在mutations.js中注册的一些的事件

【图片暂缺】

这是在组件中来触发这个事件

【图片暂缺】

当然,我们注意到,mutations中可以传递额外的参数,这个参数就叫做mutations的载荷。
在更多的情况下,载荷应该是一个对象。这样可以包含更多的字段。

但是mutations必须是同步函数。

那我们如何来异步的更新State呢?

答案是: Actions

 

Actions

 

Actions类似于 mutations 不同的是:

  1. Actions 提交的是mutations,而不是直接变更状态。
  2. Actions 可以包含任意异步操作。

这也就形成了 actions —— mutations —— state 的过程

Actions函数接受一个与store实例具有相同方法和属性的context对象,因此可以通过context.commit来提交一个mutations。但是如何触发呢?

答案: store.dispatch

【图片暂缺】

【图片暂缺】 

【图片暂缺】

 

Modules

 

使用单一状态树,导致应用的所有状态都集中到了一个很大的对象。所以,store对象容易变得臃肿。

为了解决这个问题, Vuex允许咱们把store进行一个功能拆分,分割成不同的模块(module)。每个模块都拥有自己的store,mutations,action,getters。

项目结构

代码如下:


├── index.html
├── main.js
├── api
│  └── ... # 抽取出API请求
├── components
│  ├── App.vue
│  └── ...
└── store
  ├── index.js     # 我们组装模块并导出 store 的地方
  ├── actions.js    # 根级别的 action
  ├── mutations.js   # 根级别的 mutation
  └── modules
    ├── cart.js    # 购物车模块
    └── products.js  # 产品模块

 

总结:

 

vuex可以用在单页面上的组件间共享状态。不适合用于跨页面的通信。

另外,对于一些跨页面的数据或者关键性的数据,可以通过localStorage,sessionStorage

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持四海网。

本文来自:http://www.q1010.com/184/3566-0.html

注:关于分析Vue中状态管理Vuex的内容就先介绍到这里,更多相关文章的可以留意四海网的其他信息。

关键词:vue.js

您可能感兴趣的文章

  • 浅谈在vue项目中如何定义全局变量和全局函数
  • 分析vue + vuex + directives实现权限按钮的思路
  • 分析Vue用axios发送post请求自动set cookie
  • Vue 2.5 Level E 发布了: 新功能特性一览
  • vue 数组和对象不能直接赋值情况和解决方法(推荐)
  • 浅谈Vue.nextTick 的实现方法
  • vue路由跳转时判断用户是否登录功能的实现
  • vue2.0实现导航菜单切换效果
  • Vue.js tab实现选项卡切换
  • vue2的todolist入门小项目的详细解析
上一篇:Vue声明式渲染分析
下一篇:Vue.js tab实现选项卡切换
热门文章
  • Vue 报错TypeError: this.$set is not a function 的解决方法
  • vue实现动态添加数据滚动条自动滚动到底部的示例代码
  • vue项目设置scrollTop不起作用(总结)
  • vue项目中使用vue-i18n报错的解决方法
  • iview实现select tree树形下拉框的示例代码
  • 分析关于element级联选择器数据回显问题
  • vue项目打包后打开页面空白解决办法
  • 解决element ui select下拉框不回显数据问题的解决
  • element-ui table span-method(行合并)的实现代码
  • element-ui 设置菜单栏展开的方法
  • 最新文章
    • 理解vue ssr原理并自己搭建简单的ssr框架
    • vue favicon设置以及动态修改favicon的方法
    • vue-router启用history模式下的开发及非根目录部署方法
    • 从零开始在NPM上发布一个Vue组件的方法步骤
    • Element input树型下拉框的实现代码
    • Vue 报错TypeError: this.$set is not a function 的解决方法
    • Vue.js组件高级特性实例分析
    • 浅谈VueJS SSR 后端绘制内存泄漏的相关解决经验
    • 分析Vue.js自定义tipOnce指令用法实例
    • 浅谈vuex actions和mutation的异曲同工

四海网收集整理一些常用的php代码,JS代码,数据库mysql等技术文章。