zoukankan      html  css  js  c++  java
  • vuex的基本使用

    1、步骤

    1.1、安装vuex

      在控制台执行命令:npm install --save vuex

    1.2、在src下创建vuex的核心管理模块store.js

    /**
     * vuex的核心管理模块
     */
    import Vue from 'vue'
    import Vuex from 'vuex'
    // 声明使用vuex插件
    Vue.use(Vuex)
    
    // 定义state状态对象
    const state = {
      count: 0
    }
    
    // 包含多个更新state的函数对象,由actions内的函数触发调用
    const mutations = {
      addFunc(state) {
        state.count++
      },
      minusFunc(state) {
        state.count--
      }
    }
    
    // 包含多个间接更新state的函数对象(由vue组件触发调用)
    const actions = {
      add({commit}) {
        // 触发调用mutations的addFunc函数
        commit('addFunc')
      },
      minus({commit}) {
        // 触发调用mutations的minusFunc函数
        commit('minusFunc')
      },
      // {commit, state},这种写法表示函数的入参是对象,且其中有commit和state属性
      addIfCountOdd({commit, state}) {
        if (state.count % 2 !== 0) {
          commit('addFunc')
        }
      },
      addByAsync({commit}) {
        setTimeout(() => {
          // 触发调用mutations的addFunc函数
          commit('addFunc')
        }, 1000)
      }
    }
    
    // 包含多个计算属性函数的对象
    const getters = {
      countType(state) {
        return state.count % 2 === 0 ? '偶数' : '奇数'
      }
    }
    // 向外暴露对象
    export default new Vuex.Store({
      state, // 状态对象
      mutations, // 包含多个更新state的函数对象
      actions, // 包含多个间接更新state的函数对象(由vue组件调用)
      getters // 包含多个计算属性函数的对象
    })

    1.3、在vue入口main.js中引入vuex的核心管理模块

    // The Vue build version to load with the `import` command
    // (runtime-only or standalone) has been set in webpack.base.conf with an alias.
    import Vue from 'vue'
    import App from './App'
    import router from './router'
    // 引入vuex的核心管理模块
    import store from './store'
    
    Vue.config.productionTip = false
    
    /* eslint-disable no-new */
    new Vue({
      el: '#app',
      router,
      components: { App },
      template: '<App/>',
      store // 所有的vue组件实例中会增加一个$store属性
    })

    1.4、在vue组件中使用

    <template>
      <div>
        <p>count is:{{$store.state.count}},countType is {{countType}}</p>
        <button @click="add">add</button>
        <button @click="minus">minus</button>
        <button @click="addIfCountOdd">addIfCountOdd</button>
        <button @click="addByAsync">addByAsync</button>
      </div>
    </template>
    <script>
    export default {
      methods: {
        add() {
          // 触发调用vuex的核心管理模块中actions的add函数
          this.$store.dispatch('add')
        },
        minus() {
          // 触发调用vuex的核心管理模块中actions的minus函数
          this.$store.dispatch('minus')
        },
        addIfCountOdd() {
          // 触发调用vuex的核心管理模块中actions的addIfCountOdd函数
          this.$store.dispatch('addIfCountOdd')
        },
        addByAsync() {
          // 触发调用vuex的核心管理模块中actions的addByAsync函数
          this.$store.dispatch('addByAsync')
        }
      },
      computed: {
        countType() {
          // 读取vuex的核心管理模块中计算属性countType的值
          return this.$store.getters.countType
        }
      }
    }
    </script>
    <style scoped>
    </style>

    2、改进

    2.1、对vue组件改进1

    <template>
      <div>
        <p>count is:{{count}},countType is {{countType}}</p>
        <button @click="add">add</button>
        <button @click="minus">minus</button>
        <button @click="addIfCountOdd">addIfCountOdd</button>
        <button @click="addByAsync">addByAsync</button>
      </div>
    </template>
    <script>
    // 引入vuex的mapState, mapGetters, mapActions映射
    import {mapState, mapGetters, mapActions} from 'vuex'
    export default {
      methods: {
        // vue组件中的方法和vuex核心管理模块的actions中的函数名一致时的写法
        ...mapActions(['add', 'minus', 'addIfCountOdd', 'addByAsync'])
      },
      computed: {
        // vue组件中的变量名和vuex核心管理模块的state中的属性名一致时的写法
        ...mapState(['count']),
        // vue组件中的变量名和vuex核心管理模块的getters中的函数名一致时的写法
        ...mapGetters(['countType'])
      }
    }
    </script>
    <style scoped>
    </style>

    2.2、对vue组件改进2

    <template>
      <div>
        <p>count is:{{mycount}},countType is {{mycountType}}</p>
        <button @click="myadd">add</button>
        <button @click="myminus">minus</button>
        <button @click="myaddIfCountOdd">addIfCountOdd</button>
        <button @click="myaddByAsync">addByAsync</button>
      </div>
    </template>
    <script>
    // 引入vuex的mapState, mapGetters, mapActions映射
    import { mapState, mapGetters, mapActions } from 'vuex'
    export default {
      methods: {
        // vue组件中的方法和vuex核心管理模块的actions中的函数名不一致时的写法
        // 用对象的方式指定映射关系
        ...mapActions({
          myadd: 'add',
          myminus: 'minus',
          myaddIfCountOdd: 'addIfCountOdd',
          myaddByAsync: 'addByAsync'
        })
      },
      computed: {
        // vue组件中的变量名和vuex核心管理模块的state中的属性名不一致时的写法
        // 用对象的方式指定映射关系
        ...mapState({mycount: 'count'}),
        // vue组件中的变量名和vuex核心管理模块的getters中的函数名不一致时的写法
        // 用对象的方式指定映射关系
        ...mapGetters({mycountType: 'countType'})
      }
    }
    </script>
    <style scoped>
    </style>
  • 相关阅读:
    007 Android 单击事件、toast使用
    AdminService数据访问层
    DBHelper
    兄弟2820技术
    左右两侧采用绝对定位 中间同样采用margin-left margin-right方法:
    三层架构保存,更新,查询等一些列方法
    DropDownList的使用
    兄弟2820
    三层架构
    treevew
  • 原文地址:https://www.cnblogs.com/liuyang-520/p/13472569.html
Copyright © 2011-2022 走看看