首页 > 其他分享 >Vue学习计划-Vue2--VueCLi(八)vuex统一状态管理实现数据共享

Vue学习计划-Vue2--VueCLi(八)vuex统一状态管理实现数据共享

时间:2023-12-23 10:06:09浏览次数:41  
标签:VueCLi ... Vue 数据共享 state 组件 vuex bigSum store

1. vuex是什么

概念:专门在Vue中实现集中式状态(数据)管理的一个Vue插件,对Vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信。这个怎么理解呢?可以暂时理解成全局事件总线、消息订阅与发布一样的道理,把vuex当成是外部的一个储存空间,内部储存着方法和状态。看一下图: image.png 其中呢: state:是一个对象,目的是保存具体的数据 actions对象,目的是响应组件中用户的动作,可以理解成里面储存的是方法,里面可以写同步方法也可以写异步方法 mutations对象,目的是修改state中的数据,是同步的

2. 什么时候使用vuex

  1. 多个组件依赖于同一状态
  2. 来自不同组件的行为需要变更同一状态

3. 搭建环境

  1. 创建文件: src/store/index.js
// 引入 Vue 核心库
import Vue from 'vue'
// 引入vuex
import Vuex from 'vuex'
// 引用 vuex
Vue.use(Vuex)

// 创建并暴露store
export default new Vuex.Store({
// 准备state对象 —— 保存具体的数据
state: {
    num: 0
},
// 准备actions对象 —— 响应组件中用户的动作
actions: {},
// 准备mutations对象 —— 修改state中的数据
mutations: {}
})
  1. main.js中创建vm时传入store配置项
// 引入 store
import store from './store'
...
// 创建vm
new Vue({
   router,
   store,
   render: h => h(App)
}).$mount('#app')

4. 基本使用

  1. 初始化数据、配置actions、配置mutations、操作文件store.js
// 引入 Vue 核心库
 import Vue from 'vue'
 // 引入vuex
 import Vuex from 'vuex'
 // 引用 vuex
 Vue.use(Vuex)

 // 创建并暴露store
 export default new Vuex.Store({
     // 初始化数据
     state: {
         num: 0
     },
     actions: {
         // 响应组件中加的动作
         jia (context, value) {
         // console.log('action中的jia被调用了‘,context, value)
         context.commit('JIA', value)
         }
     },
     mutations: {
         // 执行JIA
         JIA (state, value) {
         // console.log('mutations中的JIA被调用了', state, value)
         state.sum += value
         }
     }
 })
  1. 组件中读取vuex中的数据:$store.state.sum
  2. 组件中修改vuex中的数据:$store.dispatch('action中的方法名', 数据)或者$store.commit('mutations中的方法名', 数据)

5. getters的使用

  1. 概念:当state中的数据需要经过加工后再使用时,可以使用getters加工,类似于计算属性computed
  2. store.js中追加getters配置
   getters: {
       bigSum (state) {
       return state.sum * 10
       }
   },
  1. 在组件中读取数据: $store.getters.bigSum

6. 四个辅助函数map方法的使用

  1. mapState方法:用于帮助我们映射state中的数据为计算属性

组件内,我们可以写作computed: mapState({sum: 'sum', school: 'school'}) 但是由于组件内除了state的数据,我们可能还有其他计算属性,所以我们利用·ES6·语法进行解构,下方mapGetters同理

computed:{
   // 借助mapState生成计算属性,sum,school(对象写法)
    ...mapState({sum: 'sum', school: 'school'})
  // 借助mapState生成计算属性,sum,school(数组写法)
   ...mapState(['sum', 'school'])
}
  1. mapGetters方法:用于帮助我们映射getters中的数据为计算属性
computed:{
    // 借助mapGetters生成计算属性,bigSum(对象写法)
    ...mapGetters({bigSum: 'bigSum'})
    // 借助mapGetters生成计算属性,bigSum(数组写法)
    ...mapGetters(['bigSum'])
}
  1. mapActions方法:用于帮助我们生成与actions对话的方法,即:包含$store.dispatch(xxx)的函数
methods:{
    // 靠mapActions生成方法,bigSum(对象写法)
    ...mapActions({bigSum: 'bigSum'})
    // 靠mapActions生成方法,bigSum(数组写法)
    ...mapActions(['bigSum'])
}
  1. mapMutations方法:用于帮助我们生成与mutations对话的方法,即:包含$store.commit(xxx)的函数
methods:{
    // 靠mapMutations生成方法,bigSum(对象写法)
    ...mapMutations({bigSum: 'bigSum'})
    // 靠mapMutations生成方法,bigSum(数组写法)
    ...mapMutations(['bigSum'])
}

一个不错的示例:准备父组件App.vue、vuex的store.js、子组件MySchool.vue、MyStuden.vue 1. App.vue中:引入一个动态组件的概念: 09515f2b6b824132964120c71f52d29b.png 2. store.js文件中: 09515f2b6b824132964120c71f52d29b.png 3. myschool.vue组件内: 09515f2b6b824132964120c71f52d29b.png 4. MyStudent.vue组件: 09515f2b6b824132964120c71f52d29b.png 疑问:对于上述不错的案例,我们能体会到vuex帮我们共享数据的方便,但上述案例还有个不足,是什么呢?

  1. 学校状态数据和一些与学校无关的数据状态(count、price)都在一个state中设置
  2. 假若学生的数据状态也需要共享,是不是也要放在state,``
  3. 上述中目前只有一个action,若在有一个操作学生组件的方法呢?是不是也要放在action中呢?
  4. mutationsgetters同样的问题,那么针对这几个问题我们就形成了如下的形式: 09515f2b6b824132964120c71f52d29b.png actions、mutations、getters同理,这就造成了混乱与臃肿,不利于开发和维护,所以我们最好将他们拆解为单独的模块,每一个模块控制数据自己模块的数据与方法,这就需要vuex的模块化

7. 模块化 + 命名空间(namespaced

  1. 目的: 让代码更好维护,让多种数据分类更加明确,模块独立,自己掌控自己的状态与方法
  2. 修改store.js
const aboutModule = {
    namespaced: true, // 开启命名空间
    state: {...},
    mutations: {...},
    actions: {...},
    getters: {...}
},
 const userModule = {
    namespaced: true, // 开启命名空间
    state: {...},
    mutations: {...},
    actions: {...},
    getters: {...}
},
const store = new Vuex.Store({
    modules: {
       aboutModule,
       userModule 
    }
})
  1. 开启命名空间后,组件中读取state数据:
// 方式一:直接自己读取
this.$store.state.aboutModule.list
// 方式二:借助`mapState`读取
...mapState('aboutModule',['list', 'name'])
  1. 开启命名空间后,组件中读取getters数据:
// 方式一:直接自己读取
this.$store.getters['aboutModule/list']
// 方式二:借助`mapGetters`读取
...mapGetters('aboutModule',['list', 'name'])
  1. 开启命名空间后,组件中调用dispatch
// 方式一:直接自己读取
this.$store.dispatch('aboutModule/getList', params)
// 方式二:借助`mapActions`读取
...mapActions('aboutModule',{getList, getData})
  1. 开启命名空间后,组件中调用commit
// 方式一:直接自己读取
this.$store.commit('aboutModule/getList', params)
// 方式二:借助`mapMutations`读取
...mapMutations('aboutModule',{getList, getData})

标签:VueCLi,...,Vue,数据共享,state,组件,vuex,bigSum,store
From: https://blog.51cto.com/Itstars/8943895

相关文章

  • java云HIS源码:云端部署,支持多医院、多门诊、多机构、实现医疗数据共享与交换
    系统概述云HIS是针对中小医疗机构推出的一套基于云端的云HIS服务平台,借助云his,将医院业务流程化,大大提高医院的服务效率和服务质量,为客户提供医院一体化的信息解决方案。云his系统是用计算机网络将医院内各个环节(门诊计价收费、门诊药房、住院信息、临床科室、医技、财务等)全部连......
  • ThreadLocal和InheritableThreadLocal详解,基本原理及注意项 父子线程数据共享
    一、ThreadLocal介绍在多线程环境下访问同一个线程的时候会出现并发问题,特别是多个线程同时对一个变量进行写入操作时,为了保证线程的安全,通常会进行加锁来保证线程的安全,但是加锁又会造成效率的降低;ThreadLocal是jdk提供的除了加锁之外保证线程安全的方法,其实现原理是在Thread类......
  • 记录--Vue3问题:如何实现组件拖拽实时预览功能?
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助1.需求分析实现一个CMS内容管理系统,在后台进行内容编辑,在官网更新展示内容。关于后台的编辑功能,大致分为两部分:组件拖拽预览、组件内容编辑实时预览。对于组件拖拽预览,用户可以在含有各种功能组件的列表中,选择......
  • 探究vue的diff算法
    1.diff算法是什么?diff算法是一种通过**同层的树节点**进行比较的高效算法Diff算法探讨的就是虚拟DOM树发生变化后,生成DOM树更新补丁的方式。对比新旧两株虚拟DOM树的变更差异,将更新补丁作用于真实DOM,以最小成本完成视图更新。1.1特点策略:深度优先,同层比较1.2原理分析......
  • vue项目中使用的移动端的签名组件,纯 js 写的
    <template><section><divclass="sign-wrap"><divclass="main"><divclass="box"style="width:100%;height:100%"><!--<vue-esignref="esign&qu......
  • vue中使用Vue.extend方法仿写一个loading加载中效果
    需求描述本文我们使用vue的extend方法实现一个全屏loading加载效果,需求如下:通过命令就可以让弹框开启或关闭,比如this.$showDialog()开启,this.$hideDialog()关闭方法可以传参更改loading中的文字也可以传参更改loading背景色当然这里除了文字,背景色什么的,也可以传递更多的参......
  • Vue中的$refs 用法
    Vue中的$refs原理涉及到Vue实例的生命周期、虚拟DOM以及一些底层的JavaScript原理。Vue实例的生命周期:当Vue实例被创建时,它会经历一系列的生命周期钩子,包括beforeCreate、created、beforeMount、mounted等。在mounted生命周期钩子中,Vue实例的模板已经渲染到真实的DOM上,此时$refs会......
  • Vue中的$refs 用法
    Vue中的$refs用法Vue中的$refs原理涉及到Vue实例的生命周期、虚拟DOM以及一些底层的JavaScript原理。Vue实例的生命周期:当Vue实例被创建时,它会经历一系列的生命周期钩子,包括beforeCreate、created、beforeMount、mounted等。在mounted生命周期钩子中,Vue实例的模板已经渲染到......
  • [VUE] WebPack 打包后自动修改 dist 中 package.json 版本号
    我们在开发npm包时,开发期的package.json通常并不一定是发布到npm仓库的package.json。这种情况下每次改版本号需要改两个地方,比较麻烦。我一般使用webpack进行打包,所以有了下面这个小插件。插件源码modify.version.plugin.js/**修改版本号webpack插件*/functi......
  • 巧妙使用Vue.extend继承组件实现el-table双击可编辑(不使用v-if和v-else)
    问题描述有一个简单的表格,产品要求实现双击可编辑看了一下网上的帖子,大多数都是搞两部分dom,一块是输入框,用于编辑状态填写;另一块是普通标签,用于在不编辑显示状态下呈现单元格文字内容。再加上一个flag标识搭配v-if和v-else去控制编辑状态、还是显示状态。大致代码如下:<el-t......