为什么要使用Vuex的介绍


Posted in Javascript onJanuary 19, 2019

单向数据流

以下是一个表示“单向数据流”理念的极简示意:

但是,当我们的应用遇到多个组件共享状态时,单向数据流的简洁性很容易被破坏:

  • - 多个视图依赖于同一状态。
  • - 来自不同视图的行为需要变更同一状态。

对于问题一,传参的方法对于多层嵌套的组件将会非常繁琐,并且对于兄弟组件间的状态传递无能为力。

对于问题二,我们经常会采用父子组件直接引用或者通过事件来变更和同步状态的多份拷贝。以上的这些模式非常脆弱,通常会导致无法维护的代码。

因此,我们为什么不把组件的共享状态抽取出来,以一个全局单例模式管理呢?在这种模式下,我们的组件树构成了一个巨大的“视图”,不管在树的哪个位置,任何组件都能获取状态或者触发行为!

另外,通过定义和隔离状态管理中的各种概念并强制遵守一定的规则,我们的代码将会变得更结构化且易维护。

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

什么情况下应该使用 Vuex?

虽然 Vuex 可以帮助我们管理共享状态,但也附带了更多的概念和框架。这需要对短期和长期效益进行权衡。

如果您不打算开发大型单页应用,使用 Vuex 可能是繁琐冗余的。确实是如此——如果您的应用够简单,您最好不要使用 Vuex。一个简单的 global event bus 就足够您所需了。但是,如果您需要构建是一个中大型单页应用,您很可能会考虑如何更好地在组件外部管理状态,Vuex 将会成为自然而然的选择。引用 Redux 的作者 Dan Abramov 的话说就是:

Flux 架构就像眼镜:您自会知道什么时候需要它。

如果没有使用Vuex

假设有这样的两个页面,数据一样,就是页面布局不一样:

为什么要使用Vuex的介绍

为什么要使用Vuex的介绍

代码

Page1.vue

<template>
  <div>
    <h2>我是第一个页面</h2>
    <ul class="ul_list">
      <li v-for="item in items">
        <p class="name">商品:{{item.name}}</p>
        <p class="price">价格:¥{{item.price}}</p>
      </li>
    </ul>
  </div>
</template>
<script>
 export default {
   data() {
    return {
        items: [
          {
            name: '赣州橙子',
            price: '8.8'
          },
          {
            name: '新疆哈密瓜',
            price: '2.0'
          },
          {
            name: '山东大枣',
            price: '3.2'
          },
          {
            name: '阳澄湖大闸蟹',
            price: '10.0'
          }
        ]
    }
   },
  }
</script>

Page2.vue

<template>
  <div>
    <h2>我是第二个页面</h2>
    <ul class="ul_list page2">
      <li v-for="item in items">
        <p class="name">商品:{{item.name}}</p>
        <p class="price">价格:¥{{item.price}}</p>
      </li>
    </ul>
  </div>
</template>
<script>
 export default {
   data() {
    return {
        items: [
          {
            name: '赣州橙子',
            price: '8.8'
          },
          {
            name: '新疆哈密瓜',
            price: '2.0'
          },
          {
            name: '山东大枣',
            price: '3.2'
          },
          {
            name: '阳澄湖大闸蟹',
            price: '10.0'
          }
        ]
    }
   },
  }
</script>

现在我们可以看见上面两个页面里面的数据是一样的。同一份数据,我们在两个页面里面操作两次感觉还行,如果有10个,20个 ……页面需要这样,那么这就是一个让人奔溃的事情,而且数据的同步刷新也很痛苦。所以就需要Vuex了。简言之:vuex就是将数据共享给多个组件共同使用,同时也将这个数据的状态进行了共享(一个组件改变这个数据的状态其它组件也跟着改变)。

Vue官网对Vuex的解释:

每一个 Vuex 应用的核心就是 store(仓库)。“store”基本上就是一个容器,它包含着你的应用中大部分的状态 (state)。Vuex 和单纯的全局对象有以下两点不同:

  1. Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。
  2. 你不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化,从而让我们能够实现一些工具帮助我们更好地了解我们的应用。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Javascript 相关文章推荐
如何确保JavaScript的执行顺序 之实战篇
Mar 03 Javascript
js 函数的副作用分析
Aug 23 Javascript
JS获取图片高度宽度的方法分享
Apr 17 Javascript
jQuery弹簧插件编写基础之“又见弹窗”
Dec 11 Javascript
JS+HTML5实现的前端购物车功能插件实例【附demo源码下载】
Oct 17 Javascript
js手机号批量滚动抽奖实现代码
Apr 17 Javascript
详解JavaScript中的数组合并方法和对象合并方法
May 11 Javascript
jQuery阻止事件冒泡实例分析
Jul 03 jQuery
vue + typescript + 极验登录验证的实现方法
Jun 27 Javascript
Servlet返回的数据js解析2种方法
Dec 12 Javascript
vue自定义插件封装,实现简易的elementUi的Message和MessageBox的示例
Nov 20 Vue.js
JS实现简单的九宫格抽奖
Jun 28 Javascript
Vue核心概念Getter的使用方法
Jan 18 #Javascript
Vue唯一可以更改vuex实例中state数据状态的属性对象Mutation的讲解
Jan 18 #Javascript
JavaScript数据结构之栈实例用法
Jan 18 #Javascript
Vue核心概念Action的总结
Jan 18 #Javascript
js取小数点后两位四种方法
Jan 18 #Javascript
jQuery移动端跑马灯抽奖特效升级版(抽奖概率固定)实现方法
Jan 18 #jQuery
jquery获取file表单选择文件的路径、名字、大小、类型
Jan 18 #jQuery
You might like
简单的PHP多图上传小程序代码
2011/07/17 PHP
PHP命名空间用法实例分析
2019/09/04 PHP
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
node.js中的fs.truncateSync方法使用说明
2014/12/15 Javascript
ECMAScript6函数剩余参数(Rest Parameters)
2015/06/12 Javascript
jquery validate demo 基础
2015/10/29 Javascript
通过JS获取Request.QueryString()参数的值实现方法
2016/09/27 Javascript
bootstrap datepicker插件默认英文修改为中文
2017/07/28 Javascript
安装vue-cli的简易过程
2018/05/22 Javascript
使用post方法实现json往返传输数据的方法
2019/03/30 Javascript
JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析
2020/02/12 Javascript
python实用代码片段收集贴
2015/06/03 Python
详解Python中的相对导入和绝对导入
2017/01/06 Python
浅析Python中的赋值和深浅拷贝
2017/08/15 Python
Python学习小技巧总结
2018/06/10 Python
Python重新加载模块的实现方法
2018/10/16 Python
python生成以及打开json、csv和txt文件的实例
2018/11/16 Python
python web框架Flask实现图形验证码及验证码的动态刷新实例
2019/10/14 Python
python异常处理、自定义异常、断言原理与用法分析
2020/03/23 Python
Python3爬虫中Selenium的用法详解
2020/07/10 Python
瑞士领先的网上超市:LeShop.ch
2018/11/14 全球购物
波兰最大的电商平台:Allegro.pl
2021/02/06 全球购物
个人求职信范文分享
2013/12/13 职场文书
《燕子》教学反思
2014/02/18 职场文书
房屋委托书范本
2014/04/04 职场文书
白血病募捐倡议书
2014/05/14 职场文书
演讲稿格式范文
2014/05/19 职场文书
党支部组织生活会整改方案
2014/09/30 职场文书
普通党员个人剖析材料
2014/10/08 职场文书
党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
政协委员个人总结
2015/03/03 职场文书
2015清明节祭奠英烈寄语大全
2015/03/04 职场文书
青涩记忆观后感
2015/06/18 职场文书
教你快速构建一个基于nginx的web集群项目
2021/11/27 Servers
星际争霸:毕姥爷vs解冻03
2022/04/01 星际争霸
Python可变与不可变数据和深拷贝与浅拷贝
2022/04/06 Python