范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

SpringBootVue(十三)VueX状态管理库

  对于组件化开发来说,大型应用的状态往往跨越多个组件。在多层嵌套的父子组件之间传递状态十分麻烦,而Vue更是没有为兄弟组件提供直接共享数据的方法。
  基于这个问题,许多框架提供了解决方案:使用全局的状态管理器,将所有分散的共享数据交由状态管理器保管,Vue也不例外。
  VueX 是专为Vue.js 应用程序开发的状态管理库,采用集中式存储来管理应用的所有组件状态。
  VueX 用于管理分散在Vue各个组件中的数据。兄弟组件间的数据传递。
  vuex有两个版本,分别vuex3对应vue2 ; vuex4对应vue3
  两种版本安装方式:
  vuex3安装:npm install vuex@3
  vuex4安装:npm install vuex
  官方网站: https://v3.vuex.vuejs.org/zh/
  关于状态管理:
  一般在复杂应用中才会用到VueX ,并非必须的。
  每一个VueX应用的核心都是一个store (仓库) 全局对象,与普通的全局对象不同,基于Vue数据与视图绑定的特点,当store中的状态(数据)发生变化时,与之绑定的视图也会被重新渲染。
  store中的状态不允许被直接修改,改变store中的状态的唯一途径就是显式提交(commit)mutation,这可以方便地跟踪每一个状态的变化。
  在大型复杂应用中,如果无法有效跟踪到状态的变化,将会对理解和维护代码带来极大困扰
  VueX中有5个重要概念:State、Getter、Mutation、Action、Module
  下面进行演示
  创建一个基于 Vue2 的新项目:具体创建方式详见笔记(九)
  vue create vuex-demo
  将刚刚创建的项目 vuex-demo 拖入 Visual Studio Code 中
  vuex3安装:npm install vuex@3
  在src目录下新建一个 store 文件夹,新建一个 index.js 文件,提供一个初始 state 对象和一些 mutation ,文件代码如下:import Vue from "vue" import Vuex from "vuex" Vue.use(Vuex)  const store = new Vuex.Store({  state: {  count: 0  },  mutations: {  increment (state) {  state.count++  }  } })
  说明:建立了一个store(仓库),默认count初始值为: 0 ;以后state 是状态就是给各个组件调用的。
  不能直接改state的状态,如需要修改要调用 mutations 方法(该方法是用于 +1 操作)。
  然后将store 导出,这样就可以在main.js中使用了export default store
  现在希望在组件中调用 count 的值,具体操作如下:
  1.由于我们是在main.js创建Vue的,因此在main.js 中就可以导入刚刚创建的 index.jsimport store from "./store/index.js"
  由于是以index.js作为文件名,也可以简写省略import store from "./store"
  然后用Vuex 提供的一个从根组件向所有子组件,以 store 选项的方式"注入"该 store 的机制:new Vue({  render: h => h(App),  store:store }).$mount("#app") 做完这些就可以在任意组件中利用store对象去取值。 2.新建一个Test.vue 组件,代码如下: 
  在根组件App.vue中进行注册
  在这个Test.vue 中将 count 的值取出来。{{ this.$store.state.count }}
  运行项目后,浏览器就可以显示出 count 的初始值 :"0"。这个时候Test.vue 组件就成功调用了全局状态值。
  如何修改状态码?增加一个按钮,进行加1操作。
  定义add方法:methods:{  add(){  this.$store.commit("increment")  }  }
  再次强调,我们通过提交 mutation 的方式,而非直接改变 store.state.count,是因为我们想要更明确地追踪到状态的变化。
  这里调用的是index.js 中 store里面的 increment 方法来进行修改操作,而不是用 this.$store.state.count = this.$store.state.count +1
  在浏览器中点击 +1 按钮就可以改变状态了
  优化1:可以通过设置一个方法,然后就可以直接调用 {{ count }}computed: {  count () {  return this.$store.state.count  }  },
  优化2:mapState 辅助函数生成计算属性
  当一个组件需要获取多个状态的时候,将这些状态都声明为计算属性会有些重复和冗余。为了解决这个问题,我们可以使用 mapState 辅助函数帮助我们生成计算属性,让你少按几次键。
  当映射的计算属性的名称与 state 的子节点名称相同时,我们也可以给 mapState 传一个字符串数组。// 在单独构建的版本中辅助函数为 Vuex.mapState import { mapState } from "vuex" computed: mapState([  // 映射 this.count 为 store.state.count  "count" ])
  Getter
  有时候我们需要从 store 中的 state 中派生出一些状态,例如对state 数据进行过滤并进行计数等处理。
  下面进行演示,在state 中再增加一个 todos 待办事项列表。其中,吃饭已经完成;睡觉尚未完成。 todos: [  { id: 1, text: "吃饭", done: true },  { id: 2, text: ".睡觉", done: false }  ]
  假设要显示到 Test.vue 组件上,现将 todos 映射过来,然后就可以使用。
  现在假设只是想显示已经完成的动作,该怎样操作?
  这就需要对 todos 进行过滤。在 index.js 中增加一个 getters 方法(注意:两个方法之间要加逗号 " , ") getters: {  doneTodos: state => {  return state.todos.filter(todo => todo.done)  }  }
  然后就可以在Test.vue 组件中使用 mapGetters 辅助函数来映射。
  由于我们原来已经使用了  mapState ,现在又要同时用另外一个方法 mapGetters 就需要对代码进行一些修改: computed:{  ...mapState([  "count","todos"  ]),  ...mapGetters([  "doneTodos"  ])  },
  这时浏览器就过滤出 done 状态为 true 的数据
  下面的Mutation、Action、Module 后面的实例讲解中才能更好理解,在此仅作为了解。 Mutation
  更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。
  组件中提交 Mutation的方法,代码如下。不再此进行演示,有兴趣可以自己试一下。import { mapMutations } from "vuex"  export default {  // ...  methods: {  ...mapMutations([  "increment", // 将 `this.increment()` 映射为 `this.$store.commit("increment")`    // `mapMutations` 也支持载荷:  "incrementBy" // 将 `this.incrementBy(amount)` 映射为 `this.$store.commit("incrementBy", amount)`  ]),  ...mapMutations({  add: "increment" // 将 `this.add()` 映射为 `this.$store.commit("increment")`  })  }}
  Action
  在 mutation 中处理混合异步调用时就要用到  Action 。( 在 Vuex 中, mutation 都是同步事务 : )
  先注册一个简单的 action: const store = new Vuex.Store({  state: {  count: 0  },  mutations: {  increment (state) {  state.count++  }  },  actions: {  increment (context) {  context.commit("increment")  }  }})
  在组件中分发 Action ,与前面类似:methods 中使用 mapActionsimport { mapActions } from "vuex"  export default {  // ...  methods: {  ...mapActions([  "increment", // 将 `this.increment()` 映射为 `this.$store.dispatch("increment")`   // `mapActions` 也支持载荷:  "incrementBy" // 将 `this.incrementBy(amount)` 映射为 `this.$store.dispatch("incrementBy", amount)`  ]),  ...mapActions({  add: "increment" // 将 `this.add()` 映射为 `this.$store.dispatch("increment")`  })  }} Modules
  由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。
  为了解决以上问题,Vuex 允许我们将 store 分割成 模块(module) 。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分割。 const moduleA = {  state: () => ({ ... }),  mutations: { ... },  actions: { ... },  getters: { ... }}  const moduleB = {  state: () => ({ ... }),  mutations: { ... },  actions: { ... }}  const store = new Vuex.Store({  modules: {  a: moduleA,  b: moduleB  }})  store.state.a // -> moduleA 的状态 store.state.b // -> moduleB 的状态
  最终所有模块都要和到一起。当我们创建 Vuex.Store 时,通过 modules 参数给模块起名字,比如:给 moduleA 取名为 a 。
  需要访问的模块的时候就加上 a 。store.state.a // -> moduleA 的状态。
  其实就是对模块进行分割管理,比如:用户模块的状态,订单模块的状态等分别设置。
  上述仅为 Vuex 的基本概念,具体使用到后面的综合案例再具体演示。

杜锋也无奈,广东失去争冠希望,球员变化是内因,汤杰被点名在过去的三个赛季里,广东宏远队都取得了最后的胜利,三连冠的广东队成为了联赛最多的十一冠王。在这三连冠期间,广东队遭遇了很多的问题,从开始选择两小外开始,到易建联的受伤球队改打快打旋厉害!国乒17岁小将世界排名暴涨156位,大满贯首战砍瓜切菜30在最新一期国际乒联公布的世界排名中,中国女队17岁的小将蒯曼凭借阿曼挑战赛一飞冲天女单夺冠的成绩,让个人世界排名提升了156位,目前排在第131位,在中国女单选手中位居第12位。新詹姆斯首次领跑得分榜,感谢威少北京时间3月12日,湖人主场迎战奇才。到第三节结束,詹姆斯已经砍下了36分,可惜领先的还是奇才。直到第四节前段,奇才还有领先优势。詹姆斯展现出极强的效率,一次次用精准的投篮磨灭奇才孙悦娇妻近况在美国带娃生活很滋润,与外国帅哥关系不一般有媒体关注到CBA名宿孙悦的最新情况,作为一位非常出色的篮球巨星,孙悦在上赛季结束之后第2次选择退役,如今已经远离赛场,令球迷们非常遗憾,而孙悦的妻子是一位非常优秀的女性,她的颜值东数西算工程来了!模组厂商如何助力打造5GAIoT数智世界?2021年,中国5GAIoT取得了长足的发展。根据工业和信息化部统计显示,截止2021年底,我国累计建成并开通的5G基站已达142。5万个,5G基站总量占全球的60以上。另一方面,那辆2018年被发射到太空的特斯拉汽车,现在怎么样了?2018年2月,埃隆马斯克用SpaceX猎鹰重型火箭将他的个人特斯拉跑车向太阳轨道进行发射。到现在,这辆跑车已经在太空旅行4年了。那么它现在怎么样了呢?在当时的背景下,由于猎鹰火箭那些正被遗忘的软件从国内网络时代开始发展到如今,出现了众多家喻户晓的软件,但随着时间的变迁,它们有的再壮大,有的被合并,有的被淘汰,被遗忘。那么都有哪些知名老软件正在被人逐渐遗忘呢?杀毒软件当时有金新纪录贝壳视频排名抖音MCN2月机构榜第15名近日,抖音发布了抖音MCN2月机构榜,贝壳视频综合指数评分85。3分,排名榜单第15名!这是目前贝壳视频在抖音MCN机构榜单的最好排名。该榜单的综合指数评分根据投稿播放互动涨粉等纬2022年最新约会交友软件排行与攻略,即识app上榜第二提起陌生人社交,大部分人的第一印象是看脸约。尤其是在陌陌收购了探探之后,LBS定位看脸社交似乎已经垄断了陌生人社交市场。这类市场几乎成为了选妃和骗子盛行的地方。与此同时,越来越多的更大规模的救市,已不可避免2022年3月11日,中国央行公布了2月金融统计数据,这个数据将决定中国房地产3月份的政策走势。所以我们非常有必要针对这个2月份金融统计数据进行详细分析。其实自从去年12月份以来,意大利叫停中企收购案,理由是违反当地法规,声称没有让他们知情在美国的多次施压下,欧洲国家已经很难保持中立,不得不向美国做出妥协。据环球网报道,当地时间3月11日,意大利政府叫停了中企收购案,阻止中企收购该国军用无人机企业,理由是这笔交易不符
10个月孩子竟然出现肠坏死?原因竟是每天吃的辅食有问题8个月孩子出现肠坏死。如果孩子不到一岁,这3种辅食不能碰。辅食添加是对家长们的一次大考验。可以给孩子提供充足的营养物质,但是缺乏育儿经验,一不小心就坑了娃了。有个8个月大的孩子出现3位年轻人凑了20万开店,日营业额仅79元当事人想落泪4月10日据白鹿视频报道近日,河南郑州的蔡先生发视频称他与2个朋友合伙投资20多万开店然而开店一个月一天营业额却只有79。2元引发关注当事人蔡先生称,自己很想落泪,基本每天卖不到1社保关系跨省转移,要换卡吗?人社部明确社保卡由各地人社部门组织实施发行和应用工作技术标准全国统一社会保障号码姓名等关键信息可以实现全国通读在2016年启动的全国跨省异地就医持卡直接结算应用中,已实现社保卡全国通用。20给孩子立规矩,要在6岁之前很多父母存在这样的思维误区认为给孩子立规矩太早是一种束缚,会约束孩子自由发展。或者觉得孩子太小立规矩没有用,因为他们听不懂,也不会遵守,等长大自然就懂了,所以就放任孩子撒泼胡闹。结幸亏你们及时帮助,孩子才能平安出生!对于准爸爸准妈妈来说最期待的事情莫过于迎接新生命的到来可要是宝宝突然打个措手不及还真会让人乱了阵脚4月8日凌晨2时许,佛山110接到事主报警,称他与妻子原本打算自驾前往贵州,到达高为便携生产力进一步升级,爱魔蓝牙键盘UAG晶透保护壳体验前言去年入手了IPadAir5,搭载的M1处理器在性能上确实提升不少,当时就有些种草官方的秒控键盘,但仅支持Pro系列,所以一直有些遗憾,最近因为工作的缘故需要经常处理文档类的文件遏制特雷杨的关键是什么?斯玛特让他所做的一切都尽可能困难直播吧4月16日讯今日NBA季后赛首轮G1,凯尔特人主场11299战胜老鹰,大比分10领先。赛后,绿军后卫斯玛特在接受采访时谈到防守特雷杨的策略就是让他所做的一切都尽可能困难,他是印度产量翻2倍!咖喱味的iPhone还香吗?人民网给小米11撑腰截止到2023年3月,短短3个月,印度组装生产的iPhone手机产量,就已经翻了2倍!很显然,苹果是铁了心要将iPhone的生产线全面迁移到印度,那么问题来了,咖喱味的iPhone东南亚诈骗走到尽头?诈骗园区或将外逃,铲除妙瓦底武装是关键这一路就像是在撒钱,为何不为难欧美人,偏偏要收中国人的小费,这就是明抢吧,知名冒险旅游博主雷探长在乌干达机场被边检勒索200美元后发出感叹。他不明白,为何这些国家不为难欧美人,偏偏魅族对主流品牌的反击战,已经正式打响,性能并非关键所在!看文章听音乐是种享受,想听什么留言告知(都是付费无损包)首先介绍一下品牌。魅族虽然是手机行业看上去很主流的品牌,为什么说看上去很主流?其实原因很简单,那就是因为在目前手机行业大环境向华为看齐!小米13Ultra多项黑科技加持,国产自研起来确实香去年,华为Mate50系列用昆仑玻璃卫星通讯等众多黑科技,直接拉满了用户的期待。而且华为也完全不带怂的,直接选择了跟iPhone14系列同期发布,目的就是为了正面硬刚。让人值得欣慰