zoukankan      html  css  js  c++  java
  • vuex中更新对象或数组的值页面不更新的问题

    在Vuex中,如果store中数据是数组或者是对象,操作之后,vuex 数值已经改变了,但页面展示的对应数值却没有改变。

    类似的情况,大部分出现在这几个场景

    state: {
            obj: {
                a:1,
            }, 
            arr: [0,1,2]
    }
    
    
    1. 改变数组的某一项
    
    state.arr[0] = 1;
    
    2. 对象赋值新属性
    
    state.obj.b = 2;
    
    3.修改数组长度时
    
    state.arr.length = 1;
    
    ...

    导致原因

    Vue2 Object.defineProperty的本身的机制问题,拓展https://cn.vuejs.org/v2/guide/reactivity.html#%E5%A6%82%E4%BD%95%E8%BF%BD%E8%B8%AA%E5%8F%98%E5%8C%96

    Vue.js是基于Object.defineProperty对对象实现“响应式化”,而对于数组,Vue.js提供的方法是重写push、pop、shift、unshift、splice、sort、reverse这七个数组方法。修改数组原型方法的代码可以参考observer/array.js以及observer/index.js

    参考Vue官网

    解决方案

    优先使用Vue.set,使用JSON.parse(JSON.stringify(state.obj)触发对象更新 或者 state.arr.push() 触发数组更新 也可以;
    import Vue from 'vue'
    import Vuex from 'vuex'
    Vue.use(Vuex)
    
    export default new Vuex.Store({
         state: {
            obj: {
                a:1,
            }, 
            arr: [0,1,2]
        },
        mutations: {
            SET_STATE_DATA(state){
                // state.obj.b= '233'; // 错误 页面不会更新 
                // JSON.parse(JSON.stringify(state.obj) //不推荐此方法触发更新 显得很LOWB
                Vue.set(state.obj,'b','233') // 正确的方法
    
                // state.arr[0] = 233; // 错误 页面不会更新
                // state.arr.push() //不推荐此方法触发更新
                Vue.set(state.arr,0,233) // 正确的方法
            }
        },
        actions: {
            
        }
    })
     
  • 相关阅读:
    [CTF]ROT5/13/18/47位移密码
    [CTF]维吉尼亚密码(维基利亚密码)
    [CTF]ACSII码
    kxtj2-1009驱动总结
    DC/DCLT1767EMS8E-5芯片
    485通信总结
    安装pymssql报错
    安装mysqlclient报错
    ERROR 1878
    Win10安装gopls
  • 原文地址:https://www.cnblogs.com/tianmiaogongzuoshi/p/14833737.html
Copyright © 2011-2022 走看看