Vue.js之vuex(状态管理)

2017-09-10  本文已影响19人  壹点微尘

vuex是一个状态管理工具,类似于redux.

安装vuex

npm install vuex --save

如上图,Vuex为Vue Components建立起了一个完整的生态圈,包括开发中的API调用一环。围绕这个生态圈,简要介绍一下各模块在核心流程中的主要功能:

举例说明:

vuex

main.js文件中代码如下

import Vue from 'vue'
import App from './App.vue'
import 'jquery'
import VRouter from 'vue-router'
//导入vuex
import Vuex from 'vuex'
import Apple from './components/apple.vue'
import Banana from './components/banana.vue'
// 全局使用路由
Vue.use(VRouter)
// 设置全局
Vue.use(Vuex)

// 实例化Vuex
let store = new Vuex.Store({
  state: {
    totalPrice: 0
  },
  getters: {
    getTotal (state) {
      return state.totalPrice
    }
  },
  mutations: {
    increment (state, price) {
      state.totalPrice += price
    },
    decrement (state, price) {
      state.totalPrice -= price
    }
  },
  // actions是在mutations之前的动作,只能调用mutations,不能调用state
  // 其实actions也可以理解为中介
  // actions 和  mutations的区别:
  // actions: 是异步的操作,再去触发mutations
  // mutations: 是同步的操作

  actions: {
    increase (context, price) {
      context.commit('increment', price)
    }
  }
})

// 实例化router
let router = new VRouter({
......
})

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  store,//设置全局
  template: '<App/>',
  components: { App }
})

apple.vue中代码如下:

<template>
  <div class="hello">
    <h1>{{msg}}</h1>
    <button @click="addOne">add one</button>
    <button @click="minusOne">minus one</button>
  </div>
</template>

<script>
  export default {
    data () {
      return {
        msg: 'I am apple',
        price: 5
      }
    },
    methods: {
      addOne () {
        //使用了vuex的actions
        this.$store.dispatch('increase', this.price)
      },
      minusOne () {
        //未使用vuex的actions
        this.$store.commit('decrement', this.price)
      }
    }
  }
</script>

banana.vue中代码如下:

<template>
  <div class="hello">
    <h1>{{msg}}</h1>
    <button @click="addOne">add one</button>
    <button @click="minusOne">minus one</button>
  </div>
</template>

<script>
  export default {
    data () {
      return {
        msg: 'I am banana',
        price: 15
      }
    },
    methods: {
      addOne () {
        //未使用vuex的actions
        this.$store.commit('increment', this.price)
      },
      minusOne () {
        //未使用vuex的actions
        this.$store.commit('decrement', this.price)
      }
    }
  }
</script>

在显示界面 App.vue文件中

<template>
  <div id="app">
    ![](./assets/logo.png)
    {{ totalPrice }}
    <apple></apple>
    <banana></banana>
  </div>
</template>

<script>
  import Apple from './components/apple.vue'
  import Banana from './components/banana.vue'
  export default {
    components: {
      Apple,
      Banana
    },
    //计算属性
    computed: {
      totalPrice () {
//        return this.$store.state.totalPrice
        return this.$store.getters.getTotal
      }
    }
  }
</script>
上一篇下一篇

猜你喜欢

热点阅读