• Vuex学习笔记


    目录

    1.概念

    2.何时使用?

    3.vuex的工作原理:

    官方流程图:

    4.搭建vuex环境

    (1)配置环境

    (2)创建文件:src/store/index.js

    (3).在main.js中创建vm时传入store配置项

    5.基本使用

    (1)组件使用:

    (2)index核心配置:

    (3)store的getters配置:

    (4)四个map方法的使用

    mapState方法:

    实例:

    配置index

    模块引入:


    1.概念

    在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信。

    2.何时使用?

    多个组件需要共享数据时

    3.vuex的工作原理:

    官方流程图:

    state:主要是store的储存位置,用于数据的存储;

    Vue Components:是在index文件中配置的vuex生成的vc属性,方便连接使用store

    Action:dispatch方法的调用,主要是对参数精选判断,判断要传的具体参数后给下一步进行处理(api调用);

    Mutations:commit方法的调用,对传来的数据进行最终的处理,修改state里的数据,方便最终的展示;

    4.搭建vuex环境

    (1)配置环境

    先下载:npm:npm i vuex@3

    注意:在vue2中要vuex3,在vue3中要vuex4。

    注意:在main.js中引入:

    import vuex from 'vuex';

    Vue.use(vuex)

    (2)创建文件:src/store/index.js

    1. //引入Vue核心库
    2. import Vue from 'vue'
    3. //引入Vuex
    4. import Vuex from 'vuex'
    5. //应用Vuex插件
    6. Vue.use(Vuex)
    7. //准备actions对象——响应组件中用户的动作
    8. const actions = {}
    9. //准备mutations对象——修改state中的数据
    10. const mutations = {}
    11. //准备state对象——保存具体的数据
    12. const state = {}
    13. //创建并暴露store
    14. export default new Vuex.Store({
    15. actions,
    16. mutations,
    17. state
    18. })

    (3).在main.js中创建vm时传入store配置项

    1. ......
    2. //引入store
    3. import store from './store'
    4. ......
    5. //创建vm
    6. new Vue({
    7. el:'#app',
    8. render: h => h(App),
    9. store
    10. })

    5.基本使用

    • 初始化数据、配置actions、配置mutations,操作文件store.js

    (1)组件使用:

    1. 模板引入数据:
    2. {{$store.state.sum}}
    3. 方法:
    4. increment(){
    5. this.$store.commit('JIA',this.n)
    6. },
    7. decrement(){
    8. this.$store.commit('JIAN',this.n)
    9. },
    10. incrementOdd(){
    11. this.$store.dispatch('jiaOdd',this.n)
    12. },
    13. incrementWait(){
    14. this.$store.dispatch('jiaWait',this.n)
    15. },

    (2)index核心配置:

    actions和mutations中的两个传参,第一个是上下文,方便去取上面的数据或者进行下一步操作

    1. //引入Vue核心库
    2. import Vue from 'vue'
    3. //引入Vuex
    4. import Vuex from 'vuex'
    5. //引用Vuex
    6. Vue.use(Vuex)
    7. const actions = {
    8. //响应组件中加的动作
    9. jia(context,value){
    10. // console.log('actions中的jia被调用了',miniStore,value)
    11. context.commit('JIA',value)
    12. },
    13. }
    14. const mutations = {
    15. //执行加
    16. JIA(state,value){
    17. // console.log('mutations中的JIA被调用了',state,value)
    18. state.sum += value
    19. }
    20. }
    21. //初始化数据
    22. const state = {
    23. sum:0
    24. }
    25. //创建并暴露store
    26. export default new Vuex.Store({
    27. actions,
    28. mutations,
    29. state,
    30. })
    • 组件中读取vuex中的数据:$store.state.sum
    • 组件中修改vuex中的数据:$store.dispatch('action中的方法名',数据)$store.commit('mutations中的方法名',数据)

    备注:若没有网络请求或其他业务逻辑,组件中也可以越过actions,即不写dispatch,直接编写commit

    (3)store的getters配置:

    1. 概念:当state中的数据需要经过加工后再使用时,可以使用getters加工。
    2. store.js中追加getters配置
    3. 组件中读取数据:$store.getters.bigSum
    1. ......
    2. const getters = {
    3. bigSum(state){
    4. return state.sum * 10
    5. }
    6. }
    7. //创建并暴露store
    8. export default new Vuex.Store({
    9. ......
    10. getters
    11. })

    (4)四个map方法的使用

    帮助引入store的方法到组件里,方便使用;

    注意:使用前都要先引入:

    import {mapState,mapGetters,mapMutations,mapActions} from 'vuex'

    mapState方法:

    用于帮助我们映射state中的数据为计算属性

    1. computed: {
    2. //借助mapState生成计算属性:sum、school、subject(对象写法)
    3. ...mapState({sum:'sum',school:'school',subject:'subject'}),
    4. //借助mapState生成计算属性:sum、school、subject(数组写法)
    5. ...mapState(['sum','school','subject']),
    6. },

    mapGetters方法:

    用于帮助我们映射getters中的数据为计算属性

    1. computed: {
    2. //借助mapGetters生成计算属性:bigSum(对象写法)
    3. ...mapGetters({bigSum:'bigSum'}),
    4. //借助mapGetters生成计算属性:bigSum(数组写法)
    5. ...mapGetters(['bigSum'])
    6. },

     mapActions方法:

    用于帮助我们生成与actions对话的方法,即:包含

    ​​​​​​​$store.dispatch(xxx)的函数

    1. methods:{
    2. //靠mapActions生成:incrementOdd、incrementWait(对象形式)
    3. ...mapActions({incrementOdd:'jiaOdd',incrementWait:'jiaWait'})
    4. //靠mapActions生成:incrementOdd、incrementWait(数组形式)
    5. ...mapActions(['jiaOdd','jiaWait'])
    6. }

    使用时注意传参:可在模板里面加上括号,如:

    其中的参数n是该模板data中的数据

    mapMutations方法:

    用于帮助我们生成与mutations对话的方法,即:包含$store.commit(xxx)的函数

    1. methods:{
    2. //靠mapActions生成:increment、decrement(对象形式)
    3. ...mapMutations({increment:'JIA',decrement:'JIAN'}),
    4. //靠mapMutations生成:JIA、JIAN(对象形式)
    5. ...mapMutations(['JIA','JIAN']),
    6. }

    备注:mapActions与mapMutations使用时,若需要传递参数需要:在模板中绑定事件时传递好参数,否则参数是事件对象。

    实例:

    配置index

    1. //该文件用于创建Vuex中最为核心的store
    2. import Vue from 'vue'
    3. //引入Vuex
    4. import Vuex from 'vuex'
    5. import countOptions from './count'
    6. import personOptions from './person'
    7. //应用Vuex插件
    8. Vue.use(Vuex)
    9. //创建并暴露store
    10. export default new Vuex.Store({
    11. modules:{
    12. countAbout:countOptions,
    13. personAbout:personOptions
    14. }
    15. })

    模块引入:

    person:

    1. //人员管理相关的配置
    2. import axios from 'axios'
    3. import { nanoid } from 'nanoid'
    4. export default {
    5. namespaced:true,
    6. actions:{
    7. addPersonWang(context,value){
    8. if(value.name.indexOf('王') === 0){
    9. context.commit('ADD_PERSON',value)
    10. }else{
    11. alert('添加的人必须姓王!')
    12. }
    13. },
    14. addPersonServer(context){
    15. axios.get('https://api.uixsj.cn/hitokoto/get?type=social').then(
    16. response => {
    17. context.commit('ADD_PERSON',{id:nanoid(),name:response.data})
    18. },
    19. error => {
    20. alert(error.message)
    21. }
    22. )
    23. }
    24. },
    25. mutations:{
    26. ADD_PERSON(state,value){
    27. console.log('mutations中的ADD_PERSON被调用了')
    28. state.personList.unshift(value)
    29. }
    30. },
    31. state:{
    32. personList:[
    33. {id:'001',name:'张三'}
    34. ]
    35. },
    36. getters:{
    37. firstPersonName(state){
    38. return state.personList[0].name
    39. }
    40. },
    41. }

     count:

    1. //求和相关的配置
    2. export default {
    3. namespaced:true,
    4. actions:{
    5. jiaOdd(context,value){
    6. console.log('actions中的jiaOdd被调用了')
    7. if(context.state.sum % 2){
    8. context.commit('JIA',value)
    9. }
    10. },
    11. jiaWait(context,value){
    12. console.log('actions中的jiaWait被调用了')
    13. setTimeout(()=>{
    14. context.commit('JIA',value)
    15. },500)
    16. }
    17. },
    18. mutations:{
    19. JIA(state,value){
    20. console.log('mutations中的JIA被调用了')
    21. state.sum += value
    22. },
    23. JIAN(state,value){
    24. console.log('mutations中的JIAN被调用了')
    25. state.sum -= value
    26. },
    27. },
    28. state:{
    29. sum:0, //当前的和
    30. school:'阳光小学',
    31. subject:'前端',
    32. },
    33. getters:{
    34. bigSum(state){
    35. return state.sum*10
    36. }
    37. },
    38. }

     参考:105_尚硅谷Vue技术_Vuex简介_哔哩哔哩_bilibili

  • 相关阅读:
    Rockland一抗丨B-藻红蛋白抗体解决方案
    STM32HAL库CRC学习及测试记录
    Codeforces Round #835 (Div. 4) A~G
    golang select 机制
    UnityShader数学基础篇
    十五、ROS的launch文件标签(一)
    计算机网络——码元、波特、速率、带宽
    docker mysql主从搭建
    docker发布dubbo服务 外部程序访问不到问题处理
    Python装饰器进阶:深入理解与最佳实践
  • 原文地址:https://blog.csdn.net/Azbtt/article/details/127705857