在vue项目里面使用vuex

在vue项目里面使用vuex

  1. 先下载vuex
    npm install vuex --save-dev
  2. 安装成功之后在 vue项目的目录建立store文件夹
    在这里插入图片描述
  3. 在main.js文件里面引入store.js文件
import Vue from 'vue'
import App from './App'
import router from './router'
import store from './store/store'

Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  store,
  components: { App },
  template: '<App/>'
})
  1. store.js

    结构

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const state = {
   
}

const  getters = {
   
}

const  mutations = {
   
}

const  actions = {
   
}

export default new Vuex.Store({
    state,
    getters,
    mutations,
    actions
})
  • state : 放数据的地方
  • getters : 用于对store中的数据进行加工处理形成新的数据,getter不会修改state里面的原数据
  • mutations: 用于变更state中的数据,只用于同步的操作
  • actions: 通过异步操作变更数据,而不能使用mutation,但是在action中还是要通过出发mutation的方式间接的变更数据

简单的例子

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const state = {
    count:0
}
// Getter 用于对store中的数据进行加工处理形成新的数据,getter不会修改state里面的原数据,
// ① Getter可以对Store中已有的数据加工处理之后形成新的数据,类似Vue的计算属性
// ② Store 中数据发生变化,Getter的数据也会跟着发生变化
const getters = {
    showNum(state){
        return '当前最新的数量是['+state.count +']'
    }
}

// 用于变更store中的数据
const mutations = {
    // 不能在mutations里面写异步操作
    changeAdd(state){
        state.count++
    },
    // step:外界传来的参数
    changeAddN(state,step){
        state.count += step
    },
    changeJian(state){
        state.count--
    },
    changeJianN(state,step){
        state.count -= step
    },
}
// 如果通过异步操作变更数据,不惜通过action 而不能使用mutation,
// 但是在action中还是要通过出发mutation的方式间接的变更数据
const actions = {
    changeAddAsync(context){
        setTimeout(() => {
            context.commit('changeAdd')
        },1000)
    },
    changeAddNAsync(context,step){
        context.commit('changeAddN', step)
    },
    changeJianAsync(context){
        setTimeout(() => {
            context.commit('changeJian')
        },1000)
    },
    changeJianNAsync(context,step){
        setTimeout(() => {
            context.commit('changeJianN',step)
        },1000)
    }
}

export default new Vuex.Store({
    state,
    getters,
    mutations,
    actions
})
  1. 使用
    a.vue
<template>
  <div class="hello">
    
    <p>当前最新的count值为:{{$store.state.count}}</p>
    <p>{{$store.getters.showNum}}</p>
    <button @click="add">+1</button>
    <button @click="add3">+1 Async</button>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  data () {
    return {
    }
  },
  created(){
  },
   // 触发mutation
  methods:{
     // 触发mutations的第一种方法
    add(){
      // this.$store.commit('changeAdd')
      // commit 的作用就是调用某个mutation的方法
      this.$store.commit('changeAddN',3)
    },
    // 异步的让count+1
    add3(){
      // dispatch专门触发action
      // this.$store.dispatch('changeAddsync')
      this.$store.dispatch('changeAddNAsync',2)
    }
  },
  computed:{
  }
}
</script>

<style scoped>

</style>

b.vue

<template>
  <div class="hello">
    
    <p>当前最新的count值为:{{count}}</p>
    <p>{{showNum}}</p>
    <button @click="jian">-1</button>
    <button @click="jianN">-n</button>
    <button @click="jianAsync">-1 Async</button>
    <button @click="jianNAsync">-n Async</button>

  </div>
</template>

<script>
// 1. 从vuex中暗血导入mapMutations函数
import { mapState, mapMutations, mapActions, mapGetters} from 'vuex'
export default {
  name: 'HelloWorld',
  data () {
    return {
    }
  },
  created(){
  },
  methods:{
    // 2. 将指定的mutations函数,映射为当前组建的methods函数
    ...mapMutations(['changeJian','changeJianN']),

    ...mapActions(['changeJianAsync','changeJianNAsync']),
    jian(){
      this.changeJian()
    },
    jianN(){
      this.changeJianN(3)
    },
    jianAsync(){
      this.changeJianAsync()
    },
    jianNAsync(){
      this.changeJianNAsync(4)
    }
  },
  computed:{
    ...mapState(['count']),
    ...mapGetters(['showNum'])
  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>

</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值