一篇看懂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 相关文章推荐
IE和firefox浏览器的event事件兼容性汇总
Dec 06 Javascript
跨浏览器开发经验总结(三)   警惕“IE依赖综合症”
May 13 Javascript
js实现兼容IE、Firefox的图片缩放代码
Dec 08 Javascript
jQuery+canvas实现简单的球体斜抛及颜色动态变换效果
Jan 28 Javascript
Vue.js 和 MVVM 的注意事项
Nov 07 Javascript
详解javascript获取url信息的常见方法
Dec 19 Javascript
JavaScript中数组的各种操作的总结(必看篇)
Feb 13 Javascript
vue中eslintrc.js配置最详细介绍
Dec 21 Javascript
基于vue手写tree插件的那点事儿
Aug 20 Javascript
vue 取出v-for循环中的index值实例
Nov 09 Javascript
Vue为什么要谨慎使用$attrs与$listeners
Aug 27 Javascript
vue使用require.context实现动态注册路由
Dec 25 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
ThinkPHP 防止表单重复提交的方法
2011/08/08 PHP
php堆排序(heapsort)练习
2013/11/13 PHP
一个严格的PHP Session会话超时时间设置方法
2014/06/10 PHP
php实现带读写分离功能的MySQL类完整实例
2016/07/28 PHP
PHP实现发送微博消息功能完整示例
2019/12/04 PHP
解读JavaScript中 For, While与递归的用法
2013/05/07 Javascript
javascript中typeof的使用示例
2013/12/19 Javascript
浅谈javascript 函数属性和方法
2015/01/21 Javascript
JS+CSS实现仿触屏手机拨号盘界面及功能模拟完整实例
2015/05/16 Javascript
JS实现带提示的星级评分效果完整实例
2015/10/30 Javascript
详解Jquery实现ready和bind事件
2016/04/14 Javascript
JS实现动态增加和删除li标签行的实例代码
2016/10/16 Javascript
最常用的jQuery表单验证(简单)
2017/05/23 jQuery
javascript input输入框模糊提示功能的实现
2017/09/25 Javascript
微信小程序 POST请求的实例详解
2017/09/29 Javascript
JS动态添加元素及绑定事件造成程序重复执行解决
2017/12/07 Javascript
详解angular应用容器化部署
2018/08/14 Javascript
Vue实现简易计算器
2020/02/25 Javascript
python Opencv将图片转为字符画
2021/02/19 Python
Django如何配置mysql数据库
2018/05/04 Python
关于python之字典的嵌套,递归调用方法
2019/01/21 Python
Python中按键来获取指定的值
2019/03/02 Python
学习python分支结构
2019/05/17 Python
完美解决pycharm 不显示代码提示问题
2020/06/02 Python
5分钟让你掌握css3阴影、倒影、渐变小技巧(小编推荐)
2016/08/15 HTML / CSS
Onzie官网:美国时尚瑜伽品牌
2019/08/21 全球购物
联片教研活动总结
2014/07/01 职场文书
社区护士演讲稿
2014/08/27 职场文书
鲁迅故里导游词
2015/02/05 职场文书
家长会感言
2015/08/01 职场文书
公司晚宴祝酒词
2015/08/11 职场文书
年终奖金发放管理制度,中小企业适用,拿去救急吧!
2019/07/12 职场文书
超级实用的公文标题大全!
2019/07/19 职场文书
六年级作文之家庭作文
2019/12/12 职场文书
详解RedisTemplate下Redis分布式锁引发的系列问题
2021/04/27 Redis
用php如何解决大文件分片上传问题
2021/07/07 PHP