vue更改了数据但是视图却没有更新

今日总结:让钩子函数背锅的一上午,跪求原谅

需求:页面刷新时,保留当前页面的选中状态

解决思路:在data里设置一下初始值,保证首次进入有默认选中状态,其次再操作时,把选中的状态存sessionStorage。在created里为标记状态的变量赋值,优先sessionStorsge取,取不到就设置为默认值。

代码:

data() {
  return {
    thirdHidden: 2, // 二级菜单折叠还是隐藏 -1 折叠 order:显示
    isCheck: 1, // 二级菜单样式 1 选中状态 -1 不选中状态
    isactive: 2, // 一级菜单样式 1 选中状态 -1 不选中状态
    currenOpen: 2, // 二级菜单显示还是隐藏 -1 隐藏 值为对应order:显示
    isFold: false,
    secondIsFold: false
  }
},
created() {
    this.isactive = sessionStorage.getItem(‘isactive‘) || 2
    this.currenOpen = sessionStorage.getItem(‘currenOpen‘) || 2
    this.thirdHidden = sessionStorage.getItem(‘thirdHidden‘) || 2
    this.isCheck = sessionStorage.getItem(‘isCheck‘) || 1
}

  

后来发现一个很神奇的现象:刷新时,页面可以拿到缓存里的值,打印出来也是正确的。只是页面内容不根据拿到的状态值去渲染。。。怎么刷新都不变。以下是我的爬坑之路:

  • 以为是赋值的问题,把赋值后的变量打印出来看,还是正确的,就是找不到原因。。$set用于对象或数组,和现在的普通变量也没关系啊
  • 开始以为是钩子函数的问题,以为是加载顺序问题。所以挨个试:

beforecreated:el 和 data 并未初始化

created:完成了 data 数据的初始化,el没有

beforeMount:完成了 el 和 data 初始化

mounted :完成挂载

把这几个钩子函数全都试了一遍,无效!!!

  • 直到突然一下,冥冥之中感觉到---好像是sessionStorage里取的值的数据类型,所以赶紧打印,果然啊,好几个小时问题竟然是数据类型惹的祸,sessionStorage取到的是String,实际页面里做判断的是‘Number‘,对应不上,所以一直取得都是最开始的默认值

恍然大悟,就是一个简单的赋值,钩子函数也经常用,怎么能是钩子函数的问题,还让钩子函数背了一上午的锅

这件事也和上次的定时器一样,都是粗心惹的祸,没有什么技术含量,但是不够细心

终极解决办法:对取到的sessionStorage加了parseInt,变化为number类型

原文地址:https://www.cnblogs.com/lemoncool/p/9395386.html

时间: 2024-07-31 10:00:48

vue更改了数据但是视图却没有更新的相关文章

vue.js实现数据动态响应(Vue.set的应用)

在vue里面,我们操作最多的就是各种数据,在jquery里面,我们习惯通过下标定向找到数据,然后重新赋值 比如var a[0]=111;(希望上家公司原谅菜鸟的我写了不少这样的代码??) 下面上代码 <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="./js/vue.min.

解决vue中对象属性改变视图不更新的问题

在使用VUE的过程中,会遇到这样一种情况, vue data 中的数据更新后,视图没有自动更新. 这个情况一般分为两种, 一种是数组的值改变,在改变数组的值的是时候使用索引值去更改某一项,这样视图不会实时更新 第二种情况是改变了对象的某一项,但是其他依赖这个数据的视图没更新 第一种情况是因为直接通过索引去改变数组,vue 对象监听不到他的变化 所以没有更新. ----解决方法  1. Vue.set(example1.items[0], { childMsg: 'Changed!'}) 2.使用

利用object.defineProperty实现数据与视图绑定

如今比较火的mvvm框架,例如vue就是利用es5的defineProperty来实现数据与视图绑定的,下面我来介绍一下defineProperty的用法. var people= {} Object.defineProperty(people,"name",{ value: 'lin' }) console.log(people.name);//lin 可以看到defineProperty的基本用法就是给一个对象添加一个新属性.上面的代码就是给people对象添加了一个属性name,

SQL Server编程必知必会(插入/删除/更新数据,视图) -- (80-85 点总结)

------------------------插入数据------------------------- 80.1. 插入完整的行-- 各个列必须以他们在表定义中出现的次序填充INSERT INTO customersVALUES ('Pep E. LaPew','100 Main Street','LOS Angeles','CA','90046','USA',NULL,NULL) -- INSERT 语句的安全操作方法,指定列, INTO 关键字是可选的INSERT INTO custom

Vue之九数据劫持实现MVVM的数据双向绑定

vue是通过数据劫持的方式来做数据绑定的,其中最核心的方法便是通过Object.defineProperty()来实现对属性的劫持,达到监听数据变动的目的. 如果不熟悉defineProperty,猛戳这里 整理了一下,要实现mvvm的双向绑定,就必须要实现以下几点:1.实现一个数据监听器Observer,能够对数据对象的所有属性进行监听,如有变动可拿到最新值并通知订阅者2.实现一个指令解析器Compile,对每个元素节点的指令进行扫描和解析,根据指令模板替换数据,以及绑定相应的更新函数3.实现

vue的data数据用的是全局变量,变量是普通数据类型,变量改变,data未改变

如果vue的data数据用的是全局变量,变量是普通数据类型,那么当全局变量的值发生改变的的时候,那么data中用的这个值是不会发生改变的,也无法触发视图更新 ,因为是普通数据类型 解决: 全局的普通数据类型改为引用数据类型 Vue({ data:{ tabMouth: tabMouth, tabDay:tabDay, } }) var tabMouth = {value: false}; var tabDay = {value: false}; var tabEventCall = functi

0 到 1 掌握:Vue 核心之数据双向绑定

实现数据的双向绑定: 1.实现一个监听器 Observer ,用来劫持并监听所有属性,如果属性发生变化,就通知订阅者: 2.实现一个订阅器 Dep,用来收集订阅者,对监听器 Observer 和 订阅者 Watcher 进行统一管理: 3.实现一个订阅者 Watcher,可以收到属性的变化通知并执行相应的方法,从而更新视图: 4.实现一个解析器 Compile,可以解析每个节点的相关指令,对模板数据和订阅器进行初始化. Reference: 0 到 1 掌握:Vue 核心之数据双向绑定 http

数据绑定和数据网格视图(DataGridView)控件

数据绑定和数据网格视图(DataGridView)控件 数据网格视图控件,不像我们前面看到的控件,它可以显示多个列,但是,数据必须格式化,使数据网格知道要显示哪一列.有两种实现方法:一个是把数据网格视图绑定到数据表(DataTable),另一个是把网格到绑定对象列表,对象有许多属性,不同的属性就成为网格的列. 下面的例子是一种简单的解决方案,绑定到数据集(DataSet): open System open System.Collections.Generic open System.Confi

Object.defineproperty实现数据和视图的联动

Object.defineproperty语法 在一个对象上定义新的属性 var o = {}; // 创建一个新对象 // Example of an object property added with defineProperty with a data property descriptor Object.defineProperty(o, "a", {value : 37, writable : true, enumerable : true, configurable :