vuex

vue中。父与子,子与父通信好说。不过也有点麻烦,代码多

但是平级之间的组件通信,或者多组件之间通信,管理起来就相当复杂了

vuex就是干这个的

一个简单的demo

比如,我footer变了,我想让我的title也变化。

首先在main.js中创建一个vuex的stroe,并注入到全局,从此store就是全局的数据仓库。vuex就是通过这个store来管理全局通信大法了(有用的局部代码)

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const Store=Vuex.Store;
const store = new Store({
  state : {
    footTitle:''//我定义了‘footer标题’
  },
  mutations: {
    //底部导航变化事件:只要变化,我就讲传给我的值,赋值到state 的footTitle中
    footChange(state,param) {
      state.footTitle=param
    }
  }
})

其次我在底部导航组件myfoot.vue中触发该事件

<template>
  <div class="myfoot">
    <div class="myfootItem" v-for="(item,index) in foots" v-bind:class="{'active':item.active}" @click="go(index)">
      <i class="iconfont" :class="item.icon"></i>
      <div class="itemTitle">{{item.text}}</div>
    </div>
  </div>
</template>

<script>
    export default {
        name: "myfoot",
        data:function () {
          return{
            foots:[
              {text:'主页',hrf:'/',active:true,icon:'icon-home'},
              {text:'博客', hrf:'/about',active:false,icon:'icon-blog'},
              {text:'关于', hrf:'/about',active:false,icon:'icon-me'}
            ]
          }
        },
      methods:{
          go(index){
            this.foots.forEach(function (item) {
              item.active=false
            })
            this.foots[index].active=true;
            this.$router.push(this.foots[index].hrf)
            this.$store.commit('footChange',this.foots[index].text)//切换导航,顶部组件的标题也要更新,所以触发该事件
          }
      },
      created: function () {
          let vm=this;
      //初始化进入。底部导航默认选中的,也因该触发该vuex事件,进行标题更新
this.foots.forEach(function (item) { if(item.active){ vm.$store.commit('footChange',vm.foots[0].text) } }) } } </script>

最后就是顶部导航组件myhead.vue就能够实时更新store里的footTitle字段了

<template>
  <div class="myhead">
    {{this.$store.state.footTitle}}
  </div>
</template>

<script>
export default {
  name: 'myhead',
 
 //如果你想监听该属性的状态是否改变,你可以这样监听
 watch: {
     '$store.state.footTitle'(val) {
          console.log('底部导航切换了呦')
       }
   }
}
</script>

切不可这样,因为这样,组件显示的数据永远是你在store里的初始值,是不会更新的其它组件的视图里的,即使其它组件打印此属性的时候,已经是变化了的。但是不会触发其组件的视图更新

<template>
  <div class="myhead">
    {{title}}
  </div>
</template>

<script>
  export default {
    name: 'myhead',
    data () {
      return {
        title:this.$store.state.footTitle//切换底部导航的时候。this.title是变化的,但是对应上边的视图却不会更新
      }
    }
  }
</script>

效果图

原文地址:https://www.cnblogs.com/dshvv/p/9022583.html