zoukankan      html  css  js  c++  java
  • 多组件共享-vuex

    1、解决多个组件共享同一状态数据问题
    1)多个视图共享同一状态
    2)来自不同视图的触发事件需要变更同一状态
    文档API:https://vuex.vuejs.org/zh/api/

    2、组件与store连接桥梁
    new Vue({
      el: '#app',
      router,
      components: { App },
      template: '<App/>',
      store // 所有的组件多了一个 $store属性
    })
    1)模板显示 $store.state.xxx
    2)计算属性 this.$store.getters.yyy
    3)触发事件 this.$store.dispatch('') 来调用actions中函数

    actions:

    1、存放触发事件函数的对象
    2、通过执行commit('') 调用mutations中函数间接更新state
    mutations:存放更新状态函数的对象
    state: 存放状态的对象
    getters: 存放计算属性函数的对象

    1、store.js文件
    import Vuex from 'vuex'
    import Vue from 'vue'
    Vue.use(Vuex)
    const state = {
      num: 0
    }
    const mutations = {
      addNums: function (state) {
        state.num++
      },
      releaseNums: function (state) {
        state.num--
        if (state.num < 0 ){
          state.num = 0
        }
      }
    }
    const actions = {
      addNum: function ({commit}) {
        commit('addNums')
      },
      releaseNum: function ({commit}) {
        commit('releaseNums')
      }
    }
    const getters = {
      reverseonum: function (state) {
        return state.num * 2
      }
    }
    export default new Vuex.Store({
       state, 
       mutations,
       actions,
       getters
    })
    2、组件
    <template>
      <div>
        <div>
          <button @click="release">减少</button>
          <input type="text" v-model="$store.state.num"/>
          <button @click="add">增加</button>
        </div>
        <div>
           {{ reversedMessage }}
        </div>
      </div>
    </template>
    <script>
    export default {
      computed: {
        reversedMessage: function () {
          return this.$store.getters.reverseonum
        }
      },
      methods: {
        add: function () {
          this.$store.dispatch('addNum')
        },
        release: function () {
          this.$store.dispatch('releaseNum')
        }
      }
    }
    </script>
    【简化方式】
    <template>
      <div>
        <div>
          <button @click="releaseNum">减少</button>
          <input type="text" v-model="num"/>
          <button @click="addNum">增加</button>
        </div>
        <div>
           {{ reverseonum }}
        </div>
      </div>
    </template>
    <script>
    import { mapState, mapGetters, mapActions } from 'vuex'
    export default {
      computed: {
        ...mapState(['num']), //返回值{ num(){ return this.$store.state['num']}}
        ...mapGetters(['reverseonum']) 
    //返回值{ reverseonum(){ return this.$store.state['reverseonum']}}
    //这里等同于 ...mapGetters({reversedMessage: 'reverseonum'}) ,所以上面只是前后方法名需相同
      },
      methods: {
        ...mapActions(['addNum', 'releaseNum'])
      }
    }
    </script>
  • 相关阅读:
    linux运维工程师工作中的一些常见问题解决方法 风行天下
    64位win10系统无法安装.Net framework3.5的两种解决方法 风行天下
    vsphere使用笔记 风行天下
    kvm安装及使用 风行天下
    Linux 安装MySql 5.7.21 操作步骤 风行天下
    去掉mapxtreme for java 的水印
    在MapXtreme for Java 4.8.0 中发布新制作的电子地图
    NetBeans中Tomcat服务器中的manager 为什么不能浏览呢?
    VS2008简体中文正式版序列号及破解方法
    MAPXTREME FOR JAVA中中文显示问题
  • 原文地址:https://www.cnblogs.com/yuyedaocao/p/11981840.html
Copyright © 2011-2022 走看看