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


Posted in Javascript onApril 20, 2017

关于vuex类的新闻最近很多,看到眼热就去查了下资料,然后扯出来一堆flux、redux、state、state之类的概念,以及大型工程必要性之类的。看官方手册也是昏昏然。

然而,我还是弄懂了!我准备从demo出发,以同样的一个最简单的demo,演示两种情况下的代码编写情况:

  • 单纯依赖于vue.js
  • 依赖vue.js,也使用了vuex技术

目的是通过对比引出vuex的概念、优势和劣势。也许这是目前最接地气的vuex的介绍吧:)。所以无论如何在了解vuex之前,你必须懂得vue.js(好像废话:)。现在开始。

假设一个微小的应用,有一个标签显示数字,两个按钮分别做数字的加一和减一的操作。用户界面看起来是这样的:

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

使用vue的话,就是这样:

<script src="https://unpkg.com/vue/dist/vue.js"></script>
<div id="app">
 <p>{{count}}
 <button @click="inc">+</button>
 <button @click="dec">-</button>
 </p>
</div>
<script>
new Vue({
 el:'#app',
 data () {
 return {
  count: 0
 }
 },
 methods: {
 inc () {
  this.count++
 },
 dec () {
  this.count--
 }
 }
})
</script>

我写的代码代码可以直接拷贝到你的html内并且打开执行,你可以不费多余的劲儿,就把应用跑起来,按按按钮,看看界面上的反应是否如你预期。

整个代码结构非常清晰,代码是代码,数据是数据,这也是我一直以来非常喜欢vue.js的重要原因。代码就是放在methods数组内的两个函数inc、dec,被指令@click关联到button上。而data内返回一个属性count,此属性通过{{count}}绑定到标签p内。

现在来看看,同样的demo app,使用vuex完成的代码的样子,再一次,如下代码不是代码片段,是可以贴入到你的html文件内,并且直接使用浏览器打开运行的。

<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vuex@next"></script>
<div id="app">
 <p>{{count}}
 <button @click="inc">+</button>
 <button @click="dec">-</button>
 </p>
</div>
<script>

const store = new Vuex.Store({
 state: {
 count: 0
 },
 mutations: {
  inc: state => state.count++,
 dec: state => state.count--
 }
})

const app = new Vue({
 el: '#app',
 computed: {
 count () {
  return store.state.count
 }
 },
 methods: {
 inc () {
  store.commit('inc')
 },
 dec () {
  store.commit('dec')
 }
 }
})
</script>

我们先看到有哪些重要的变化:

  • 新的代码添加了对vuex@next脚本的依赖。这是当然的,因为你需要使用vuex的技术,当然需要引用它
  • methods数组还是这两个方法,这和demo1是一样的;但是方法内的计算逻辑,不再是在函数内进行,而是提交给store对象!这是一个新的对象!
  • count数据也不再是一个data函数返回的对象的属性;而是通过计算字段来返回,并且在计算字段内的代码也不是自己算的,而是转发给store对象。再一次store对象!

就是说,之前在vue实例内做的操作和数据的计算现在都不再自己做了,而是交由对象store来做了。这突然让我想到就先餐厅现在都不在洗碗了,都交给政府认证的机构来洗了。

说回正题。store对象是Vuex.Store的实例。在store内有分为state对象和mutations对象,其中的state放置状态,mutations则是一个会引发状态改变的所有方法。正如我们看到的,目前的state对象,其中的状态就只有一个count。而mutations有两个成员,它们参数为state,在函数体内对state内的count成员做加1和减1的操作。

活还是那些活,现在引入了一个store对象,把数据更新的活给揽过去,不再需要vue实例自己计算了,代价是引入了新的概念和层次。那么好处是什么(一个土耳其古老的发问)?

vuex解决了组件之间共享同一状态的麻烦问题。当我们的应用遇到多个组件共享状态时,会需要:

  • 多个组件依赖于同一状态。传参的方法对于多层嵌套的组件将会非常繁琐,并且对于兄弟组件间的状态传递无能为力。这需要你去学习下,vue编码中多个组件之间的通讯的做法。
  • 来自不同组件的行为需要变更同一状态。我们经常会采用父子组件直接引用或者通过事件来变更和同步状态的多份拷贝。

以上的这些模式非常脆弱,通常会导致无法维护的代码。来自官网的一句话:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态。这里的关键在于集中式存储管理。这意味着本来需要共享状态的更新是需要组件之间通讯的,而现在有了vuex,就组件就都和store通讯了。问题就自然解决了。

这就是为什么官网再次会提到Vuex构建大型应用的价值。如果您不打算开发大型单页应用,使用 Vuex 可能是繁琐冗余的。确实是如此——如果您的应用够简单,您最好不要使用 Vuex。

关于

作者:刘传君

创建过产品,创过业。好读书,求甚解。 可以通过 1000copy#gmail.com 联系到我

出品

bootstrap小书 https://www.gitbook.com/book/1000copy/bootstrap/details
http小书 http://www.ituring.com.cn/book/1791
Git小书 http://www.ituring.com.cn/book/1870

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery 表单进行客户端验证demo
Aug 24 Javascript
jquery实用代码片段集合
Aug 12 Javascript
用Javascript实现Windows任务管理器的代码
Mar 27 Javascript
Jquery幻灯片特效代码分享--打开页面随机选择切换方式(3)
Aug 15 Javascript
jQuery插件jquery-barcode实现条码打印的方法
Nov 25 Javascript
Angular中自定义Debounce Click指令防止重复点击
Jul 26 Javascript
基于Vue2x的图片预览插件的示例代码
May 14 Javascript
JS获取浏览器地址栏的多个参数值的任意值实例代码
Jul 24 Javascript
Vue3.0 响应式系统源码逐行分析讲解
Oct 14 Javascript
vue请求服务器数据后绑定不上的解决方法
Oct 30 Javascript
JavaScript进制转换实现方法解析
Jan 18 Javascript
vue中watch的用法汇总
Dec 28 Vue.js
addEventListener()与removeEventListener()解析
Apr 20 #Javascript
详解用vue-cli来搭建vue项目和webpack
Apr 20 #Javascript
js禁止浏览器的回退事件
Apr 20 #Javascript
vue-cli入门之项目结构分析
Apr 20 #Javascript
JS+HTML5实现上传图片预览效果完整实例【测试可用】
Apr 20 #Javascript
详解Vue使用 vue-cli 搭建项目
Apr 20 #Javascript
解决AngualrJS页面刷新导致异常显示问题
Apr 20 #Javascript
You might like
显示youtube视频缩略图和Vimeo视频缩略图代码分享
2014/02/13 PHP
php连接odbc数据源并保存与查询数据的方法
2014/12/24 PHP
手把手编写PHP框架 深入了解MVC运行流程
2016/09/19 PHP
PHP页面输出时js设置input框的选中值
2016/09/30 PHP
Yii框架结合sphinx,Ajax实现搜索分页功能示例
2016/10/18 PHP
js 文件引入实现代码
2010/04/23 Javascript
文本框(input)获取焦点(onfocus)时样式改变的示例代码
2014/01/10 Javascript
jquery+php实现滚动的数字特效
2015/11/29 Javascript
Jquery1.9.1源码分析系列(十五)动画处理之外篇
2015/12/04 Javascript
基于jQuery实现页面搜索功能
2020/03/26 Javascript
使用ionic切换页面卡顿的解决方法
2016/12/16 Javascript
详解在WebStorm中添加Vue.js单文件组件的高亮及语法支持
2017/10/21 Javascript
详解使用React.memo()来优化函数组件的性能
2019/03/19 Javascript
9个JavaScript日常开发小技巧
2020/10/06 Javascript
node使用async_hooks模块进行请求追踪
2021/01/28 Javascript
javascript实现倒计时关闭广告
2021/02/09 Javascript
[04:19]完美世界携手游戏风云打造 卡尔工作室模型介绍篇
2013/04/24 DOTA
[00:39]DOTA2上海特级锦标赛 Liquid战队宣传片
2016/03/04 DOTA
[53:10]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs VG 第一场
2018/04/11 DOTA
python中的代码编码格式转换问题
2015/06/10 Python
python itchat实现微信自动回复的示例代码
2017/08/14 Python
Django rest framework基本介绍与代码示例
2018/01/26 Python
Python绘制KS曲线的实现方法
2018/08/13 Python
Python定时发送消息的脚本:每天跟你女朋友说晚安
2018/10/21 Python
python3.x+pyqt5实现主窗口状态栏里(嵌入)显示进度条功能
2019/07/04 Python
Django中使用CORS实现跨域请求过程解析
2019/08/05 Python
python 实现Harris角点检测算法
2020/12/11 Python
美国批发零售网站:GearXS
2016/07/26 全球购物
中国最大的潮流商品购物网站:YOHO!BUY有货
2017/01/07 全球购物
linux面试题参考答案(7)
2012/10/29 面试题
个人安全生产承诺书
2014/05/22 职场文书
如何签定毕业生就业协议书
2014/09/28 职场文书
审计局班子四风对照检查材料思想汇报
2014/10/07 职场文书
《自然之道》读后感3篇
2019/12/17 职场文书
MySQL获取所有分类的前N条记录
2021/05/07 MySQL
Vue鼠标滚轮滚动切换路由效果的实现方法
2021/08/04 Vue.js