在Vuex和组件内的视图更新问题

由于js的限制,vue无法进行监听数组;

  • 当你利用索引直接设置一个项时,例如: vm.items[indexOfItem] = newValue
  • 当你修改数组的长度时,例如: vm.items.length = newLength
  • 直接给对象赋值新属性

解决方式:
Vue.set( target, key, value )

测试代码:

Store的代码:

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({
  state: {
    TestArr: [1,2,5],
    TestObj:{   name:'YK'  }
  },
  getters: {
    TestArr_getters: state => {
      return state.TestArr
    }
  },
  mutations: {
    changeTestArr(state, obj) {
       //state.TestArr[2]=3 
        //上面是错误演示,会改变值,但视图不会更新,在组件内同理
        Vue.set(state.TestArr,2,3) //正确演示

        // state.TestObj.age=11 
       //上面是错误演示,会改变值,但视图不会更新,在组件内同理
        Vue.set(state.TestObj,'age',11)//正确演示
    }
  },
  actions: {
    changeTestArr_action(context){
      setTimeout(function () {
        context.commit('changeTestArr')
      }, 1000)
    }
  }
});

组件内的代码:

<template>
    <div>
              <p>state的值:{{$store.state.TestArr}}</p>
              <p>getterste的值:{{TestArr_getters}}</p>
            <p>TestObj的值:{{TestObj}}</p>
            <button @click="fun1">改变</button>
    </div>
</template>
<script>
  import {mapGetters,mapState} from 'vuex'
    export default {
      name: '',
      computed:{
        ...mapState(['TestObj']),
        ...mapGetters(['TestArr_getters']),
      },
      methods:{
        fun1(){
              this.$store.dispatch('changeTestArr_action')
        }
      }
    };
</script>
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 10,452评论 0 29
  • 主要还是自己看的,所有内容来自官方文档。 介绍 Vue.js 是什么 Vue (读音 /vjuː/,类似于 vie...
    Leonzai阅读 8,653评论 0 25
  • 以下内容是我在学习和研究Vue时,对Vue的特性、重点和注意事项的提取、精练和总结,可以做为Vue特性的字典; 1...
    科研者阅读 14,769评论 3 24
  • 一条路不能选择!那就是放弃的道路,一条道路不能拒绝!那就是成长的道路,每一次的失败,都是成功的开始!每一次的提升都...
    苏帆先森阅读 2,812评论 1 2
  • 对于南京的记忆始于六朝古都,止于南京大屠杀。印象里,几乎没有一个城市拥有如此厚重的历史的同时还经历过一场声势浩大的...
    劷咩咩阅读 2,622评论 0 7