Vuex轻松入门级(简单易懂篇)

Vuex学习

组件之间共享数据方式
  • 父向子传值:v-bind 属性绑定
  • 子向父:v-on事件绑定
  • 兄弟组件共享数据: $on接收 $emit发送

在以前数据传递总是很复杂,有时不需要用到也要帮忙传递,有vuex就方便多啦,现在让我们看看这到底是啥吧

Vuex是什么

实现组件全局状态管理的一种机制,可以方便实现组件之间数据共享,将需要共享的数据放在一个专门的容器,需要数据就直接在容器中取,不需要两两联系

  • 能够集中管理共享的数据,易于开发维护
  • 高效实现组件共享数据
  • 存储在vuex数据是响应式的,数据改变时页面结构会自动刷新

共享数据存储在Vuex中,私有数据一般还是存储在组件自身的data中

Vuex基本使用

把大象放进冰箱需要三步,把vuex装入vue使用只需5步

  1. 安装vuex依赖包

npm install vuex --save

  1. 导入vuex
 import Vuex form 'vuex'  
Vue.use(Vuex) //调用Vuex中install方法,将vuex安装到vue上
  1. 创建store对象
 const store =new Vuex.Store({
  //state 中存放全局共享的数据
  state:{count:0}
})
  1. 将store对象挂载到vue实例上

在vue初始化时写入,类似router

new Vue({
  store,
  render: h => h(App)
}).$mount('#app')

vuex核心

State

提供唯一公共数据源,所有共享的数据都统一放到store中的state存储

const store=new Vue.store({
    state:{
        count:0
    }
})
使用方式
  1. this.$store.state.数据名称,在template中可以省略this
  2. 从vuex中按需导入mapState函数,通过导入的函数,将当前组件需要的数据映射为当前组件的computed计算属性,页面调用直接使用{{}}将数据名称引用

import { mapState } from ‘vuex’

computed:{
        ...mapState(['count'])
    }

Mutation

用于变更Store中的数据

  • 只能通过mutation修改数据,不可以直接操作state
  • 可以集中变更共享的数据
使用方式
  1. 在mutation定义事件函数
mutations:{
    add(state){
        state.count++
    }
}
  1. 在对应组件的处理函数中,使用this.$store.commit(‘add’)调用add函数
handle(){
//调用mutation中的add方法
    this.$store.commit('add')
}
传递参数

mutation中事件第一个函数是自身state,第二个参数为外界传入的参数

addStep(state,step){
    state.count+=step
}

在this.$store.commit()第一个参数为事件名,第二个参数为可传入的值

触发mutations的方式
  1. 使用this.$store.commit()调用mutations中的事件函数
  2. 从vuex中按需导入mapMutations函数,直接用全局方法调用
import { mapMutations } from 'vuex'
//将mutations函数映射为当前组件的methods
methods:{
    ...mapMutation:(['add','addN','sub'])
}

如果我想让数据延迟执行呢,这时候我们会想到定时器,但是这样数据在后台不能正常更新!使用异步就要用下面的Action啦!
不要在mutations中执行异步操作!!!

Action处理异步任务

如果通过异步操作变更数据,必须使用Action,而不能使用Mutation,但是在Action中还是通过触发Mutation的方式间接变更数据

即事件函数还是定义在mutations中,但是需要异步操作的接到Action,再进行调用

actions:{
    addAsync(context){
        setTimeout(()=>{
            context.commit('add')
        },1000)
    }
}
//触发actions中异步操作
handle(){
    this.$store.dispatch('addAsync');
}

小结:commit函数触发mutations里的函数,dispatch函数触发actions中异步函数,actions中不能直接变更数据

  • 内部事件函数第一个参数为store实例,第二个参数为可以传入的参数,再在内部通过commit第二个参数调用mutations中函数并接受该参数变更数据
addAsync(context,step){
    setTimeout(()=>{
    //使用commit调用mutations修改数据
            context.commit('addN',step)
        },1000)
}
使用方式
  1. 使用this.$store.dispatch()调用actions中函数
  2. 按需导入mapActions,类似mutations映射到当前组件的methods
import { mapActions } from 'vuex'
methods:{
//在页面点击触发的事件函数可以直接使用‘add’
    ...mapActions(['add'])
}

Getter

对store的数据进行加工处理形成新的数据,不会修改store中的原数据

  • 可以对已有数据加工后形成新数据,类似Vue计算属性
  • Store中数据变化,Getter也随之变化
new Vuex.Store({
    getters:{
        showNum:state=>{
            return 'the num is ['+state.count+']';
        }
    }
})
使用方式
  1. this.$store.getters.名称–可以在页面中使用{{}}显示
  2. 按需导入mapGetters 映射为当前组件的计算属性
import { mapGetters } from 'vuex'
computed:{
    ...mapGetters(['showNum'])
}

总结

  • Vuex是实现组件全局状态管理,集中管理全局共享的数据
  • State存放共享数据
  • mutation修改数据,注意只能在这里修改
  • Action处理异步任务,最后修改还是需要调用mutations
  • Getter对数据进行包装,不修改数据,可以作为computed计算属性
  • 每种都有两种使用方式,一种是使用组件$store属性进行调用,另一种是按需导入,其中State和Getter是映射到计算属性,Mutation和Action映射到methods方法中,使用按需导入后可以在调用时直接使用全局名称
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值