深入解析Vuex实战总结

  这篇文章主要介绍了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取决于你的团队和技术储备。

原文地址:https://www.cnblogs.com/qwangxiao/p/10105464.html

时间: 2024-10-29 12:29:07

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

Linux01-企业核心技术之逻辑卷LVM深入解析和实战36

一.扩展逻辑卷 1.lvextend-L [+]# /PATH/TO/LV,[+]表示扩展到:#表示扩展至: a)扩展逻辑卷的风险较小,可在线扩展: 2.resize2fs:扩展到和物理边界一样大 a)命令格式:resize2fs -p /PATH/TO/LV 如:lvcreate -L 2G -n testlv myvg mke2fs -j /dev/myvg/testlv mkdir users mount /dev/myvg/testlv /users mount lvextend -L

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

第十三章.备忘录模式 备忘录模式是一种行为模式,该模式用于保存对象当前的状态,并且在之后可以再次恢复到此状态,有点像是我们平常说的"后悔药". 1.定义 在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样,以后就可将该对象恢复到原先保存的状态. 2.使用场景 (1)需要保存一个对象在某一个时刻的状态或部分状态. (2)如果用一个接口来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性,一个对象不希望外界直接访问其内部状态,通过中间对象可以间接访

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

Web安全测试中常见逻辑漏洞解析(实战篇) 简要: 越权漏洞是比较常见的漏洞类型,越权漏洞可以理解为,一个正常的用户A通常只能够对自己的一些信息进行增删改查,但是由于程序员的一时疏忽,对信息进行增删改查的时候没有进行一个判断,判断所需要操作的信息是否属于对应的用户,导致用户A可以操作其他人的信息.? 逻辑漏洞挖掘一直是安全测试中"经久不衰"的话题.相比SQL注入.XSS漏洞等传统安全漏洞,现在的攻击者更倾向于利用业务逻辑层的应用安全问题,这类问题往往危害巨大,可能造成了企业的资产损失和

Activiti6.0工作流引擎深度解析与实战|activiti6视频教程

Activiti6.0工作流引擎深度解析与实战网盘地址:https://pan.baidu.com/s/1aqGADN23lUKzcwkbTaV90g 密码: xmj5备用地址(腾讯微云):https://share.weiyun.com/5Z7sAqb 密码:8pwrkb 工作流引擎驱动业务正在互联网公司中盛行,越来越多的互联网公司开始采用工作流引擎的方式来适应业务的快速变化. 本课程将系统且深入源码讲解Activiti6.0工作流引擎的使用.配置.核心api以及BPMN2.0规范.数据库设计

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

Elasticsearch技术解析与实战 下载地址:https://pan.baidu.com/s/1q46lwAqzbUMs0qbKyBNBqg 关注微信公众号获取提取码: 输入:esjs     获取提取码.                                   介绍: Elasticsearch是一个强[0大0]的搜索引擎,提供了近实时的索引.搜索.分析功能.本书作者根据自己多年的开发经验,总结了使用和开发Elasticsearch的实战经验.本书全面介绍Elasticsea

分享《TensorFlow技术解析与实战》高清中文PDF+源代码

下载:https://pan.baidu.com/s/1jdZ9eSrZ7xnsbbMIUO17qQ <TensorFlow技术解析与实战>高清中文PDF+源代码 高清中文PDF,311页,带目录和书签,文字可以复制粘贴,彩色配图.配套源代码.经典书籍.本书从深度学习的基础讲起,深入TensorFlow框架原理.模型构建.源代码分析和网络实现等各个方面.全书分为基础篇.实战篇和提高篇三部分. 其中,高清中文版如图: 原文地址:http://blog.51cto.com/3215120/2311

机器学习深度学习领域参考书 《TensorFlow技术解析与实战》PDF下载

<TensorFlow技术解析与实战> 机器学习深度学习领域参考书 包揽TensorFlow1.1的新特性 人脸识别 语音识别 图像和语音相结合等热点一应俱全 李航 余凯等人工智能领域专家倾力推荐目录第一篇 基础篇下载地址:https://pan.baidu.com/s/1iKDExWOgCuvxyqsF12abFg备用地址:https://u1593575.ctfile.com/fs/1593575-330753940 TensorFlow?是谷歌公司开发的深度学习框架,也是目前深度学习的主

Google官方架构MVP解析与实战进阶必学系列

1 前言 当然对于MVP的解说也是使用也是层出不穷,我也网络上也能看到各种版本的解说,之前博客也有文章的更新,里面有MVP的详细说明和项目代码--->Android中的MVP模式,带实例. 本篇文章将参考 google官方android MVP架构项目的实现,来实现自己的项目.或许看了这篇文章之后,你再去梳理一下google官方架构项目,会让你收获更多.官方的实例肯定具有更好的权威性. 推荐关注安卓各种架构相关文章合集github地址:AndroidArchitectureCollection

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

TensorFlow 是谷歌公司开发的深度学习框架,也是目前深度学习的主流框架之一.<TensorFlow技术解析与实战>从深度学习的基础讲起,深入TensorFlow框架原理.模型构建.源代码分析和网络实现等各个方面.分为基础篇.实战篇和提高篇三部分.基础篇讲解人工智能的入门知识,深度学习的方法,TensorFlow的基础原理.系统架构.设计理念.编程模型.常用API.批标准化.模型的存储与加载.队列与线程,实现一个自定义操作,并进行TensorFlow源代码解析,介绍卷积神经网络(CNN)