zoukankan      html  css  js  c++  java
  • 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>

    效果图

  • 相关阅读:
    matlab读取不规则txt文件
    ImportError: No module named python_util.util
    Check failed: error == cudaSuccess (2 vs. 0) out of memory
    Check failed: error == cudaSuccess (10 vs. 0) invalid device ordinal
    求助 一个很简单的ACM题 java代码 自己电脑上测都是正确的 但提交总是wrong answer 先谢谢了
    1151Word Reversal ACM题答案 java版
    1051A New Growth Industry ACM题答案 java版
    1115Digital Roots ACM题答案 java版
    1049 I Think I Need a Houseboat ACM题答案 java版
    java.sql.SQLException:Access denied for user 'root'@'localhost' (using password:YES) mysql开发
  • 原文地址:https://www.cnblogs.com/dshvv/p/9022583.html
Copyright © 2011-2022 走看看