vuex

本文详细介绍了Vuex在Vue应用中的状态管理机制,包括其安装步骤、基本使用(state、getter、action和mutation),以及核心特性的概述,重点讲解了如何实现组件间数据共享、响应式更新和异步操作的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.概述

Vuex是实现组件全局状态(数据)管理的一种机制,可以方便的实现组件之间的数据共享

优点:

  • 能够在vuex中集中管理共享的数据,便于开发和后期进行维护
  • 能够高效的实现组件之间的数据共享,提高开发效率
  • 存储在vuex中的数据是响应式的,当数据发生改变时,页面中的数据也会同步更新

2.Vuex的基本使用步骤

  1. 安装 npm i vuex --save

  2. 在src文件目录下新建store>index.js文件

    import Vue from 'vue';
    import Vuex from 'vuex';
    Vue.use(Vuex);
    const store = new Vuex.Store();
     
    export default store;
    
  3. 入口文件里面引入store,然后再全局注入

    import store from './store'//引入store
     
    new Vue({
     el: '#app',
     router,
     store,//使用store
     template: '<App/>',
     components: { App }
    })
    
  4. 使用
    4.1 在state中定义数据

    Vue.use(Vuex)
    const store = new Vuex.Store({
      state:{
        count:1
      }
    })
    

    4.2 Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,Getters 可以用于监听、state中的值的变化,返回计算后的结果

     getters:{
        getCount:state=>{
          return state.count+1
        }
    

    4.3 给action注册事件处理函数,当这个函数被触发时候,将状态提交到mutations中处理。actions里面自定义的函数接收一个context参数和要变化的形参

    actions:{
              addFun(context,n){
              context.commit('add',n)
           }removeFun(context){
             context.commit("remove")
           }
        }
    

    4.4 mutations是一个对象里。面的方法 都是同步事务,是更改state初始状态的唯一合法方法,具体的用法就是给里面的方法传入参数state或额外的参数

    mutations:{
        add(state,n){
        state.count = state.count+n
      },
      remove(){
        state.count=state.count-1
      }
      },
    

    4.5 dispatch:含有异步操作,例如向后台提交数据,写法: this.$store.dispatch(‘action方法名’,值)
    commit:同步操作,写法:this.$store.commit(‘mutations方法名’,值)

    export defult{
      data(){
        return{
          mag:'aaa'
        }
      },
        methods:{
          addCount(){
            this.$store.commit('add')
          },
            reoveCount:function(){
              this.$store.commit('remove')
            },
             addFun(){
                let n =2;
               this.$store.dispatch('addFun',n)
              },
                removeFun(){
                   this.$store.dispatch('removeFun')
                }
        }
    }
    

3. Vuex中的核心特性

3.1 State

概述:
State提供唯一的公共数据源,所有共享的数据都要统一放到Store中的State中存储

在组件中访问State的方式:
方式一:

this.$store.state.全局数据名称  如:this.$store.state.count

方式二:

先按需导入mapState函数: import { mapState } from 'vuex'
然后数据映射为计算属性: computed:{ ...mapState(['全局数据名称']) }

3.2. Mutation

概述:
Mutation用于修改变更$store中的数据

使用方式第一种:
打开store.js文件,在mutations中添加代码如下

mutations: {
    add(state,step){
      //第一个形参永远都是state也就是$state对象
      //第二个形参是调用add时传递的参数
      state.count+=step;
    }
  }

然后在Addition.vue中给按钮添加事件代码如下:

<button @click="Add">+1</button>

methods:{
  Add(){
    //使用commit函数调用mutations中的对应函数,
    //第一个参数就是我们要调用的mutations中的函数名
    //第二个参数就是传递给add函数的参数
    this.$store.commit('add',10)
  }
}

使用mutations的第二种方式:

import { mapMutations } from 'vuex'

methods:{
  ...mapMutations(['add'])
}

import { mapState,mapMutations } from 'vuex'

export default {
  data() {
    return {}
  },
  methods:{
      //获得mapMutations映射的sub函数
      ...mapMutations(['sub']),
      //当点击按钮时触发Sub函数
      Sub(){
          //调用sub函数完成对数据的操作
          this.sub(10);
      }
  },
  computed:{
      ...mapState(['count'])
      
  }
}

3.3 Action

概述:
在mutations中不能编写异步的代码,会导致vue调试器的显示出错。
在vuex中我们可以使用Action来执行异步操作。

操作步骤如下:
打开store.js文件,修改Action,如下:

actions: {
  addAsync(context,step){
    setTimeout(()=>{
      context.commit('add',step);
    },2000)
  }
}

然后在Addition.vue中给按钮添加事件代码如下

<button @click="AddAsync">...+1</button>

methods:{
  AddAsync(){
    this.$store.dispatch('addAsync',5)
  }
}

第二种方式:

import { mapActions } from 'vuex'

methods:{
  ...mapMutations(['subAsync'])
}

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

export default {
  data() {
    return {}
  },
  methods:{
      //获得mapMutations映射的sub函数
      ...mapMutations(['sub']),
      //当点击按钮时触发Sub函数
      Sub(){
          //调用sub函数完成对数据的操作
          this.sub(10);
      },
      //获得mapActions映射的addAsync函数
      ...mapActions(['subAsync']),
      asyncSub(){
          this.subAsync(5);
      }
  },
  computed:{
      ...mapState(['count'])
      
  }
}

3.4 Getter

概述:
Getter用于对Store中的数据进行加工处理形成新的数据
它只会包装Store中保存的数据,并不会修改Store中保存的数据,当Store中的数据发生变化时,Getter生成的内容也会随之变化

打开store.js文件,添加getters,如下:

export default new Vuex.Store({
  .......
  getters:{
    //添加了一个showNum的属性
    showNum : state =>{
      return '最新的count值为:'+state.count;
    }
  }
})

然后打开Addition.vue中,添加插值表达式使用getters

或者也可以在Addition.vue中,导入mapGetters,并将之映射为计算属性

import { mapGetters } from 'vuex'
computed:{
  ...mapGetters(['showNum'])
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值