一、介绍Vuex

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化,适合于构建中大型单页应用。

1、什么是状态管理模式?

看个简单的例子:

<!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width"><title>Vuex Demo 01</title><script src="http://cdn.bootcss.com/vue/1.0.26/vue.min.js"></script><script src="http://cdn.bootcss.com/vuex/0.8.2/vuex.min.js"></script></head><body><!-- 2、view,映射到视图的数据counterValue; --><h3>Count is {{ counterValue }}</h3><div><button @click="increment">Increment +1</button><button @click="decrement">Decrement -1</button></div></body><script>var app = new Vue({el: 'body',store: new Vuex.Store({    // 1、state,驱动应用的数据源;    state: {count: 0},mutations: {INCREMENT: function(state, amount) {state.count = state.count + amount},DECREMENT: function(state, amount) {state.count = state.count - amount}}}),vuex: {getters: {counterValue: function(state) {        return state.count}},    // 3、actions,响应在view上的用户输入导致的状态变化。    actions: {increment: function({ dispatch, state }){dispatch('INCREMENT', 1)},decrement: function({ dispatch, state }){dispatch('DECREMENT', 1)}}}
})</script></html>

代码中标识了:

1、state,驱动应用的数据源;
2、view,映射到视图的数据counterValue;
3、actions,响应在view上的用户输入导致的状态变化。

用简单示意图表示他们之间的关系:

我们知道,中大型的应用一般会遇到多个组件共享同一状态的情况:

1、多个视图依赖于同一状态

2、来自不同视图的行为需要变更同一状态

于是需要把组件的共享状态抽取出来,以一个全局单例模式管理,另外,需要定义和隔离状态管理中的各种概念并强制遵守一定的规则。

这就是 Vuex 背后的基本思想,借鉴了 Flux、Redux、和 The Elm Architecture。与其他模式不同的是,Vuex 是专门为 Vue.js 设计的状态管理库,以利用 Vue.js 的细粒度数据响应机制来进行高效的状态更新。

2、Vuex的核心概念

1、State: 单一状态树,用一个对象包含了全部的应用层级状态,作为一个『唯一数据源(SSOT)』而存在,每个应用将仅仅包含一个 store 实例。

2、Getters: Vuex 允许我们在 store 中定义『getters』(可以认为是 store 的计算属性)。

3、Mutations: Vuex 中的 mutations 非常类似于事件:每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数。

4、Actions: 类似于 mutation,不同在于:①Action 提交的是 mutation,而不是直接变更状态;②Action 可以包含任意异步操作。

5、Modules: 为解决单一状态树导致应用的所有状态集中在一个store对象的臃肿问题,Vuex将store分割到模块(module)。每个模块拥有自己的 state、mutation、action、getters、甚至是嵌套子模块——从上至下进行类似的分割。

接着我们开始构建备忘录应用,在以下构建过程的介绍中,再加深理解上述概念。

二、环境安装

1.安装 vue-cli

2.初始化应用

vue init webpack vue-notes-demo
cd vue-notes-demo
npm install // 安装依赖包
npm run dev // 启动服务

结果为:

目录结构为:

三、功能模块

先看下我们要做的demo的效果为:

主要功能模块为:

  • 新增计划,新增一个计划,编辑区显示空的计划内容。

  • 移除计划,删除一个计划之后,计划列表少了该计划。

  • 所有计划的总时长,将所有的计划时间加起来。

四、项目组件划分

在原来的目录结构的调整下,最终的目录结构为:

下面详细介绍下:

1、组件部分

1.首页组件:Home.vue

<template><div class="jumbotron"><h1>我的备忘录</h1><p><strong><router-link to="/time-entries">创建一个计划</router-link></strong></p></div></template>

2.计算计划总时长组件:Sidebar.vue

 View Code

3.计划列表组件:TimeEntries.vue

 View Code

4.新增计划组件:LogTime.vue

 View Code

2、vuex中用来存储数据的划分为:

1.初始化vuex.Store: index.js

import Vue from 'vue'
import Vuex from 'vuex'
import mutations from './mutations'
import actions from './actions'Vue.use(Vuex);const state = {totalTime: 0,list: []
};export default new Vuex.Store({state,mutations,actions
})

State: 单一状态树,用一个state对象包含了全部的应用层级状态,代码中只new 了一次store实例 Vuex.Store。

2.负责触发事件和传入参数:actions.js

 View Code

实践中,我们会经常会用到 ES2015 的 参数解构 来简化代码(特别是我们需要调用 commit 很多次的时候):

actions: {increment ({ commit }) {commit('increment')}
}

3.注册各种数据变化的方法: mutations.js

 View Code

使用常量替代 mutation 事件类型在各种 Flux 实现中是很常见的模式。这样可以使 linter 之类的工具发挥作用,同时把这些常量放在单独的文件中可以让你的代码合作者对整个 app 包含的 mutation 一目了然:

// mutation-types.js
export const SOME_MUTATION = 'SOME_MUTATION'mutations: {// 我们可以使用 ES2015 风格的计算属性命名功能来使用一个常量作为函数名[SOME_MUTATION] (state) {// mutate state}}

4.记录所有的事件名: mutation-types.js

 View Code

配合上面常量替代 mutation 事件类型的使用

3、初始化部分

入口文件渲染的模版index.html比较简单:

<!DOCTYPE html><html><head><meta charset="utf-8"><title>vue-notes-demo</title></head><body><div id="app"><router-view></router-view></div></body></html>

入口文件main.js的代码:

 View Code

代码中 ...App 相当于 render:h => h(App)

初始化组件App.vue为:

 View Code

至此,实践结束,一些原理性的东西我还需要多去理解^_^

源代码:【vuex2.0实践】

转载于:https://blog.51cto.com/12883930/1923792

Vuex2.0+Vue2.0构建备忘录应用实践相关推荐

  1. grunt 0.4.1构建工具入门实践(转)

    由于最近的食美特项目需要对css文件和js文件进行压缩,各种比较之后,选择了grunt进行构建.google一下,几乎都是grunt0.3的使用说明,按照说明,几乎无法使用.查看gruntjs的入门  ...

  2. webpack2.0+ vue2.0

    一 webpack 2.0 及用到的插件安装(默认已经有node环境) 1. package.json文件 (插件安装及插件的功能不详解) {"private": true,&qu ...

  3. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之八 || API项目整体搭建 6.3 异步泛型仓储+依赖注入初探...

    代码已上传Github+Gitee,文末有地址 番外:在上文中,也是遇到了大家见仁见智的评论和反对,嗯~说实话,积极性稍微受到了一丢丢的打击,不过还好,还是有很多很多很多人的赞同的,所以会一直坚持下去 ...

  4. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十一 || AOP自定义筛选,Redis入门 11.1...

    大神留步 先说下一个窝心的问题,求大神帮忙,如何在Task异步编程中,使用Redis存.取Task<List<T>>泛型,有偿帮助,这里谢谢,文末有详细问题说明,可以留言或者私 ...

  5. vue2.0,vue3.0 v-model数据双向绑定

    vue2.0,vue3.0 v-model数据双向绑定 vue.2.0 vue2.0 vue-property-decorator vue3.0 vue.2.0 <base-checkbox v ...

  6. vue项目中,兼容vue3.0 1.0 2.0 宫格拖拽排序,特殊五小一大六宫格拖拽

    前端时间写了标准宫格拖拽排序的文章       1.  2.4.9.12等等标准宫格拖拽,基于vue-grid-layout 拖拽换位无刷新 vue项目中 基于vue-grid-layout开发的拖拽 ...

  7. 构建Koa2 + Vue2.0 前后端分离的多页应用

    换了家公司,技术栈由之前的 React 变成了现在的 Vue.之前也没怎么接触过 Vue,但现在需要搭建一个基于 Vue 的多页面应用,于是就网上搜了一番,顺便记录一下过程. client 配置 Vu ...

  8. vue2实践揭秘pdf_《Vue2.0 实践揭秘》终于出版啦!

    不知不觉间在园子开博都两年多了,最近一些园友问最近去哪了为何都没有新的文章了.最近确实发生了很多的事,一是忙工作二就是忙着写书.这还得多些园子的小编,自两年前发表的"架构师修炼"系 ...

  9. 基于vue2.0打造移动商城页面实践 vue实现商城购物车功能 基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果...

    基于vue2.0打造移动商城页面实践 地址:https://www.jianshu.com/p/2129bc4d40e9 vue实现商城购物车功能 地址:http://www.jb51.net/art ...

最新文章

  1. emoji 乱码_这个自制emoji的网站,让你成为永远不输的斗图王者
  2. 3 事务隔离:为什么你改了我还看不见?
  3. 利用 MySQL bin-log 恢复数据表
  4. springboot+mybatis集成自定义缓存ehcache用法笔记
  5. netty并发量一般多少_Netty框架简介
  6. 关于API和SDK的理解
  7. CKEditor 实例
  8. 斜齿轮重合度计算公式_斜齿齿轮传动中重合度计算的探讨
  9. appium自动化测试
  10. 第四节 二维连续型随机变量及分布、条件概率密度
  11. bash: yum:未找到命令
  12. el-form表单对象内还嵌套对象,绑定的prop规则校验会失效
  13. Promise基础知识
  14. 水滴筹创始人:除中国以外不推行996;字节跳动2021年净亏损6041亿!
  15. js 滚动显示获奖名单
  16. 腾讯云服务器绑定域名
  17. Linux 各种top命令
  18. matlab藻类细胞结构,藻类细胞生物学实验室
  19. 04---法拉第电磁感应定律
  20. 根据信道号计算2G,3G,4G上行和下行频率

热门文章

  1. DS博客作业07--查找
  2. Oracle Enterprise Manager 11g: Empowering IT to Drive Business Value
  3. ssm 使用中的一些问题
  4. 备份oracle中的大表
  5. ehcache_缓存基础
  6. 推荐系统--基于用户的协同过滤算法
  7. C语言 字符串转换成int、long和double型
  8. android toast通知关闭,屏蔽系统通知,Toast无法显示的解决方案 v2.0.0
  9. linux下安装apache tomcat,Linux CentOS 7下 Apache Tomcat 7 安装与配置
  10. matlab的日期当循环量,R语言与matlab循环时间对比