这篇文章主要介绍了Vuex的初探与实战小结,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下。如有不足之处,欢迎批评指正。
  
  1.背景
  
  最近在做一个单页面的管理后台项目,为了提高开发效率,使用了Vue框架来开发。为了使各个部分的功能,独立结构更加清晰,于是就拆分了很多组件,但是组件与组件之间数据共享成了一个问题,父子组件实现起来相对简单,prop,$emit,$on就能搞定。除此之外,有很多兄弟组件和跨多级组件,实现起来过程繁琐,在多人协同开发上,不利于统一管理,于是,开始了Vue的生态之一的Vux实践之旅。
  
  2.概述
  
  每一个 Vuex 应用的核心就是 store(仓库)。“store”基本上就是一个容器,它包含着你的应用中大部分的状态 (state)。 Vuex 和单纯的全局对象有以下两点不同: 1.Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新; 2.你不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化,从而让我们能够实现一些工具帮助我们更好地了解我们的应用
  
  3.安装使用
  
  3.1.使用Vue-cli开发安装vue包
  
  cnpm install vuex --save
  
  3.2.在src目录下创建store文件夹并创建index.js如下(src/store/index.js)
  
  import Vue from 'vue'
  
  import Vuex from 'vuex'
  
  Vue.use(Vuex);
  
  export default new Vuex.Store({
  
  state: {
  
  },
  
  getters: {
  
  },
  
  mutations: {
  
  },
  
  actions: {
  
  }//欢迎加入前端全栈开发交流圈一起学习交流:864305860
  
  });
  
  然后在src文件下的main.js中使用
  
  import Vue from 'vue'
  
  import App from './App'
  
  import store from './store'
  
  Vue.config.productionTip = false
  
  new Vue({
  
  el: '#app',
  
  store,
  
  components: { App },
  
  template: '<App/>'
  
  })
  
  4.用法简介
  
  4.1.state state是保存共享数据的,现在改store/index.js如下:
  
  state: {
  
  count:0
  
  },
  
  在components目录下创建Index.vue如:
  
  <template>
  
  <div class="index">
  
  {{count}}
  
  </div>
  
  </template>
  
  <script>
  
  export default {
  
  name: "index",
  
  computed:{
  
  count(){
  
  return this.$store.state.count;
  
  }
  
  }
  
  }
  
  </script>
  
  结果如下:
  
  通过组件的计算属性来保存state里面的值,那么问题来了,如果store太多的话,我们组件里面的计算属性岂不是成了这个样子:
  
  computed:{
  
  count(){
  
  return this.$store.state.count;
  
  },
  
  stateA(){
  
  return this.$store.state.stateA;
  
  },
  
  stateB(){
  
  return this.$store.state.stateB;
  
  }
  
  }
  
  这样获取共享状态的数据也没有什么问题不过看起来还是有大量的重复冗余代码,我们可以使用 mapState 辅助函数帮助我们生成计算属性,让你少按几次键: 当映射的计算属性的名称与 state 的子节点名称相同时,我们也可以给 mapState 传一个字符串数组。
  
  import {mapState} from 'vuex'
  
  export default {
  
  name: "index",
  
  computed:{
  
  ...mapState(['count']),
  
  }//欢迎加入前端全栈开发交流圈一起学习交流:864305860
  
  }
  
  使用 Vuex 并不意味着你需要将所有的状态放入 Vuex。虽然将所有的状态放到 Vuex 会使状态变化更显式和易调试,但也会使代码变得冗长和不直观。如果有些状态严格属于单个组件,最好还是作为组件的局部状态。
  
  4.2.getter
  
  有的时候我们需要对共享状态里面的某一个属性做一些处理后再使用,我们可以把数据获取后再在组件的计算属性中处理,举个例子如下:
  
  // store/index.js
  
  state: {
  
  count:0,
  
  numbers:[0,1,2,3,4,5,6,7,8]
  
  },
  
  // Index组件
  
  <template>
  
  <div class="index">
  
  {{count}}
  
  <br>
  
  {{numbers.join()}}
  
  </div>
  
  </template>
  
  <script>
  
  import {mapState} from 'vuex'
  
  export default {
  
  name: "index",
  
  computed:{
  
  ...mapState([www.quwanyule157.com'count']),
  
  numbers(www.dasheng178.com/ ){
  
  return this.$store.www.mcyllpt.com/ state.numbers.filter((item)=>{
  
  return item>3;
  
  })
  
  }
  
  }
  
  }
  
  </script>
  
  结果如下:
  
  那么问题来了,如果多个组件都要做同样的处理,我们就需要把一份代码复制到多个地方,显然是不大合理的,于是有了getter,可以理解为组件里面的计算属性。示例如下:
  
  / store/index.js
  
  getters: {
  
  filterNumbers(state){
  
  return state.numbers.filter((item)=>{
  
  return item>3;
  
  })
  
  }
  
  },
  
  // Index组件
  
  <template>
  
  <div class="www".michenggw.com"index">
  
  {{count}}
  
  <br>
  
  {{filterNumbers.join()}}
  
  </div>
  
  </template>
  
  <script>
  
  import {mapState} from 'vuex'
  
  export default {
  
  name: "index",
  
  computed:{
  
  ...mapState(['count']),
  
  filterNumbers(){
  
  return this.$store.getters.filterNumbers;
  
  }//欢迎加入前端全栈开发交流圈一起学习交流:864305860
  
  }
  
  }
  
  </script>
  
  结果完全一样,我们可以根据this.$store.getters.属性名来获取getters,也可以通过 mapGetters 辅助函数将 store 中的 getter 映射到局部计算属性: 具体实现方式如下:
  
  <template>
  
  <div class="index">
  
  {{count}}
  
  <br>
  
  {{filterNumbers.join()}}
  
  <br>
  
  {{antherNumbers.join()}}
  
  </div>
  
  </template>
  
  <script>
  
  import {mapState,mapGetters} from 'vuex'
  
  export default {
  
  name: "index",
  
  computed:{
  
  ...mapState(['count']),6
  
  ...mapGetters(['filterNumbers']),
  
  ...mapGetters({
  
  antherNumbers:'filterNumbers'
  
  })//欢迎加入前端全栈开发交流圈一起学习交流:864305860
  
  }
  
  }
  
  </script>
  
  如果用同一名字直接把数组作为参数,如果想改一个名字,可以传入一个对象作为参数,结果如下:
  
  4.3.mutation
  
  在组件内,来自store的数据只能读取,不能手动改变,改变store中数据唯一的途径就是显示的提交mutations。Vuex 中的 mutation 非常类似于事件:每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数。改变代码如下:
  
  // store/index.js
  
  mutations: {
  
  add(state){
  
  state.count++;
  
  }//欢迎加入前端全栈开发交流圈一起学习交流:864305860
  
  },
  
  // Index组件
  
  **
  
  <button @click="add">+</button>
  
  **
  
  methods:{
  
  add(){
  
  this.$store.commit('add');
  
  console.log(this.count);
  
  }//欢迎加入前端全栈开发交流圈一起学习交流:864305860
  
  **
  
  连续点击5次增加按钮,发现count的值也改变了。当然,我们也可以传参进去
  
  // store/index.js
  
  mutations: {
  
  add(state,n){
  
  state.count+=n;
  
  }//欢迎加入前端全栈开发交流圈一起学习交流:864305860
  
  },
  
  // Index组件
  
  **
  
  <button @click="add">+</button>
  
  **
  
  methods:{
  
  add(){
  
  this.$store.commit('add',10);
  
  console.log(this.count);
  
  }//欢迎加入前端全栈开发交流圈一起学习交流:864305860
  
  **
  
  触发方法语句为:this.$store.commit(方法名);也可以使用辅助函数mapMutations代替:
  
  methods:{
  
  ...mapMutations(['add']),
  
  }
  
  4.4.action
  
  前面我们讲过,mutation有必须同步执行这个限制,我们在业务需求中有时候需要在获取ajax请求数据之后再操作或定时器操作数据,这些都属于异步请求,要用actions来实现。具体实现如下:
  
  // store/index.js
  
  mutations: {
  
  changeCount(state){
  
  state.count=3000;
  
  },//欢迎加入前端全栈开发交流圈一起学习交流:864305860
  
  },
  
  actions: {
  
  changeCount3000s(context){
  
  setTimeout(()=>{
  
  context.commit('changeCount')
  
  },3000)
  
  // Index组件
  
  <button @click="changeCount3000s">点击按钮3s后count的值改变</button>
  
  methods:{
  
  ...mapMutations(['add']),
  
  changeCount3000s(){
  
  this.$store.dispatch('changeCount3000s');
  
  
  }
  
  我们在点击按钮3s后count的值改变为3000,我们可以通过this.$store.dispatch(方法名)来触发事件,也可以通过辅助函数mapActions来触发。
  
  import {mapState,mapGetters,mapMutations,mapActions} from 'vuex'
  
  methods:{
  
  ...mapMutations(['add']),
  
  ...mapActions(['changeCount3000s'])
  
  }//欢迎加入前端全栈开发交流圈一起学习交流:864305860
  
  学会以上几个属性的使用基本就可以满足平时业务中的需求了,但使用Vuex会有一定的门槛和复杂性,它的主要使用场景是大型单页面应用,如果你的项目不是很复杂,用一个bus也可以实现数据的共享,但是它在数据管理,维护,还只是一个简单的组件,而Vuex可以更优雅高效地完成状态管理,所以,是否使用Vuex取决于你的团队和技术储备。

深入解析Vuex实战总结的更多相关文章

  1. Vue 入门之 Vuex 实战

    Vue 入门之 Vuex 实战 引言 Vue 组件化做的确实非常彻底,它独有的 vue 单文件组件也是做的非常有特色.组件化的同时带来的是:组件之间的数据共享和通信的难题. 尤其 Vue 组件设计的就 ...

  2. 学习TF:《TensorFlow技术解析与实战》PDF+代码

    TensorFlow 是谷歌公司开发的深度学习框架,也是目前深度学习的主流框架之一.<TensorFlow技术解析与实战>从深度学习的基础讲起,深入TensorFlow框架原理.模型构建. ...

  3. Elasticsearch技术解析与实战 PDF (内含目录)

    Elasticsearch技术解析与实战                                  介绍: Elasticsearch是一个强[0大0]的搜索引擎,提供了近实时的索引.搜索.分 ...

  4. Web安全测试中常见逻辑漏洞解析(实战篇)

    Web安全测试中常见逻辑漏洞解析(实战篇) 简要: 越权漏洞是比较常见的漏洞类型,越权漏洞可以理解为,一个正常的用户A通常只能够对自己的一些信息进行增删改查,但是由于程序员的一时疏忽,对信息进行增删改 ...

  5. elasticsearch技术解析与实战ES

    elasticsearch技术解析与实战ES 下载地址: https://pan.baidu.com/s/1NpPX05C0xKx_w9gBYaMJ5w 扫码下面二维码关注公众号回复100008 获取 ...

  6. vue+vue-router+vuex实战

    shopping vue + vue-router + vuex实现电商网站 效果展示 install 下载代码: git clone https://github.com/chenchangyuan ...

  7. Docker小白到实战之Dockerfile解析及实战演示,果然顺手

    前言 使用第三方镜像肯定不是学习Docker的最终目的,最想要的还是自己构建镜像:将自己的程序.文件.环境等构建成自己想要的应用镜像,方便后续部署.启动和维护:而Dockerfile就是专门做这个事的 ...

  8. 深度解析vuex

    1.什么是vuex? vuex 是一个专为 Vue.js 应用程序开发的状态管理模式(通俗一点的说Vuex就是存储数据的工具,类似于cookie.sessionStorage.localStorage ...

  9. 《Android源代码设计模式解析与实战》读书笔记(十七)

    第十七章.中介者模式 中介者模式也称为调解者模式或调停者模式,是一种行为型模式. 1.定义 中介者模式包装了一系列对象相互作用的方式.使得这些对象不必相互明显作用.从而使它们能够松散耦合.当某些对象之 ...

随机推荐

  1. 深入浅出:了解jsonp跨域的九种方式

    什么是“”跨域”: 跨域访问,简单来说就是 A 网站的 javascript 代码试图访问 B 网站,包括提交内容和获取内容.由于安全原因,跨域访问是被各大浏览器所默认禁止的.当一个域与其他域建立了信 ...

  2. Java打印金字塔问题

    Java打印金字塔问题 public class 金字塔问题 { // //普通金字塔 // public static void main(String[] args) { // //先打印4层 / ...

  3. mysql 自增主键为什么不是连续的?

    由于自增主键可以让主键索引尽量地保持递增顺序插入,避免了页分裂,因此索引更紧凑 MyISAM 引擎的自增值保存在数据文件中 nnoDB 引擎的自增值,其实是保存在了内存里,并且到了 MySQL 8.0 ...

  4. oracle下表空间、用户创建以及用户授权流程

    Oracle,表空间的建立.用户创建以及用户授权 主要是以下几步,挑选需要的指令即可: # 首先以scott用户作为sysdba登陆 conn scott/tiger as sysdba #创建用户 ...

  5. 还在使用pdf、word简历?简单五步实现github托管个人逼格简历

    写在前面: 什么是git.github? git 版本控制工具 github 通过git工具做的版本控制的项目托管平台 项目开发肯定不止一个程序猿,多个程序猿针对同一个文件进行代码读写操作时,是先保存 ...

  6. scrapy--Cookies

    大家好,之前看到的关于cookies的应用,由于有段时间没看,再看的时候花了一些时间,来给大家总结下.本文是根据:"http://www.bubuko.com/infodetail-2233 ...

  7. HTML+CSS : 笔记整理(3 移动端布局简单了解)

    流体布局:宽度用百分比,计算真实宽度用函数 : width: calc(25% - 4px); box-sizing: 1.content-box:默认计算方式 ,宽度和高度分别应用到元素的内容框.在 ...

  8. tp5简单构造

    application 应用目录 网站核心index前台目录 controller 控制器admin 后台目录 model 数据模型view 视图extend 静态类库目录public 静态资源和入口 ...

  9. PHP 二维数组按某一个键值排序

    一.前言 在某个项目中,需要读取某个文件夹下的所有文件,在本地的 Windows 环境下时,读取出来的二维数组的文件名称和在 Windows 文件夹的文件排序一致, 但是项目上线后,环境为 Linux ...

  10. Android内购订单验证 --- nodejs实现

    主代码: function AndroidPlayVerify(inappPurchaseData, inappDataSignature) { let verify = crypto.createV ...