vue数组刷新_Vue中数组更新后,页面没有动态刷新问题

最近使用vue开发时,在一个函数中使用for循环,改变了页面中的数组,在函数中查看是修改成功的,但是页面中没有动态刷新。

在Vue的官方文档有提到这样一个注意事项:

数组变更检测注意事项:

由于 JavaScript 的限制,Vue 不能检测以下数组的变动:

当你利用索引直接设置一个数组项时,例如:vm.items[indexOfItem] = newValue

当你修改数组的长度时,例如:vm.items.length = newLength

举个例子:

var vm = newVue({

data: {

items: ['a', 'b', 'c']

}

})

vm.items[1] = 'x' //不是响应性的

vm.items.length = 2 //不是响应性的

也就是说,直接设置数组的某一项的值,虽然改变了数组的值,但视图上显示的仍为数组之前的值,数据的响应失效了。出现这种现象的根本原因是什么呢?

首先我们先来了解vue数据响应的原理。官方文档的解释:

当你把一个普通的 JavaScript 对象传给 Vue 实例的 data 选项,Vue 将遍历此对象所有的属性,并使用 Object.defineProperty 把这些属性全部转为 getter/setter。

也就是说当改变data中属性的值时会触发其相应setter的调用,从而实现响应的操作。但getter和setter是有局限性的。我们先来看下面的这个例子:

var person ={};

Object.defineProperties( person, {

age: {

defaultValue:11,

get:function() {return this.defaultValue;

},

set:function(val) {this.defaultValue =val;

console.log("触发了set")

}

}

});//修改属性的值时能够触发set

person.age = 12 //触发了set

->触发了set->12person.age->12

//将属性的值设置为一个数组,当通过索引值修改数组的某一项或使用数组的某些方法修改数组时不能触发set

person.age = [2,3,4] //触发了set

->触发了set->(3) [2, 3, 4]

person.age[2] = 5 //未触发set

->5person.age->(3) [2, 3, 5]

person.age.push(5) //未触发set

->4person.age->(4) [2, 3, 4, 5]//将属性的值设置为一个对象,当修改对象中某属性的值时无法触发set

person.age = { first: 1}->触发了set->{first: 1}

person.age.first= 2 //未触发set

->2

通过上述例子可以观察得出:

当该属性的值为一个数组时,通过索引修改数组某一项的值或使用数组的某些方法修改数组并不能触发set;当属性的值为一对象时,直接修改对象中属性的值时也无法触发set。

为了解决当你利用索引直接设置一个数组项问题,以下两种方式都可以实现和 vm.items[indexOfItem] = newValue 相同的效果,同时也将在响应式系统内触发状态更新:

//Vue.set

Vue.set(vm.items, indexOfItem, newValue)

//Array.prototype.splice

vm.items.splice(indexOfItem, 1, newValue)

你也可以使用 vm.$set 实例方法,该方法是全局方法 Vue.set 的一个别名:

vm.$set(vm.items, indexOfItem, newValue)

为了解决当你修改数组的长度问题,你可以使用 splice:

vm.items.splice(newLength)

对象变更检测注意事项:

还是由于 JavaScript 的限制,Vue 不能检测对象属性的添加或删除:

var vm = newVue({

data: {

a:1}

})//`vm.a` 现在是响应式的

vm.b= 2

//`vm.b` 不是响应式的

对于已经创建的实例,Vue 不允许动态添加根级别的响应式属性。但是,可以使用 Vue.set(object, propertyName, value) 方法向嵌套对象添加响应式属性。例如,对于:

var vm = newVue({

data: {

userProfile: {

name:'Anika'}

}

})

当修改对象的属性或为对象添加属性时,应该使用以下方法:

Vue.set(vm.userProfile, 'age', 27)

或者

vm.$set(vm.userProfile, 'age', 27)

有时你可能需要为已有对象赋值多个新属性,比如使用 Object.assign() 或 _.extend()。在这种情况下,你应该用两个对象的属性创建一个新的对象。所以,如果你想添加新的响应式属性,不要像这样:

Object.assign(vm.userProfile, {

age:27,

favoriteColor:'Vue Green'})

你应该这样做:

vm.userProfile = Object.assign({}, vm.userProfile, {

age: 27,

favoriteColor: 'Vue Green'

})

由于数据响应原理机制, Vue 不允许动态添加根级响应式属性,所以你必须在初始化实例前声明所有可能用到的根级响应式属性,且为这些属性都设一个初值,哪怕只是一个空值。

回归正题,我项目中遇到的这个问题,解决方法:

1. 运用this.$forceUpdate()强制刷新。

2. 使用vm.$set(vm.items, indexOfItem, newValue)

eg.  vm.$set(vm.dataList[i],  picUrl, 'data:image/jpg;base64,' + response.data)

export default{

data() {return{

dataList:[],

};

},

methods: {

getData() {var _this = this;var dataList =[];

dataList=response.data.data;for(var i=0;i

_this.downloadBase64(dataList[i].fielID, i, dataList);

}

},

downloadBase64(fielID, i, dataList) {var vm = this;

$.ajax({

url: AppInter.downloadBase64,

asysc:true,

data: {

fileName:'1.jpg',

fileId: fielID

},

cache:!0,

timeout:2e4,

dataType:"json",

type:"POST",

xhrFields: {

withCredentials:!0},

crossDomain:!0,

contentType:"application/x-www-form-urlencoded;charset=UTF-8",

beforeSend:function() {

vm.loading=weui.loading();

},

success:function(response) {if (response.responseCode == '0') {

dataList[i].picUrl= 'data:image/jpg;base64,' + response.data;

vm.dataList =dataList;

vm.$forceUpdate();

}else{

weui.alert("请求错误,请稍候再试", function() {}, {

title:'温馨提示'});

}

},

error:function(xhr, msg, err) {

weui.alert("请求失败,请稍候再试", function() {}, {

title:'温馨提示'});

},

complete:function() {if(vm.loading.hide) {

vm.loading.hide();

}

}

})

}

},

created() {

},

mounted() {

}

};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/548002.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Exchange收件人管理

收件人分为三种 邮箱用户:AD用户,可登陆系统,有本地邮箱,可存储,可收,可发,适合公司内部办公人员邮件用户:AD用户,可登陆系统,无本地邮箱,有其他域…

如何解决在使用ElementUI时发现有些控件是英文的

如下图 解决 我们需要在入口文件 main.js 中将 ElementUI 的默认语言改为中文。 import locale from element-ui/lib/locale/lang/en // lang i18n 英文 import zhLocale from element-ui/lib/locale/lang/zh-CN // 中文// 选择elementUi 默认语言为中文 Vue.use(ElementUI, …

CentOS7 源码编译安装Python3 shell脚本

1,系统环境 操作系统 CentOS Linux release 7.6.1810 (Core) 64位 2,Linux的Python3安装后即集成了pip,无需重新独立安装pip,执行以下命令完成python3和pip3的安装 yum groupinstall -y "Development tools" # 安…

配置phoenix连接hbase_使用 Phoenix-4.11.0连接 Hbase 集群 ,并使用 JDBC 查询测试

什么是 Phoenix ?Apache Phoenix 是运行在Hbase之上的高性能关系型数据库,通过Phoenix可以像使用jdbc访问关系型数据库一样访问hbase。Phoenix,操作的表以及数据存储在hbase上。phoenix只需要和hbase进行表关联。然后在用工具进行一些读写操作…

[置顶] Z-STACK之OSAL_Nv非易失性存储解读上

本章解读Z-STACK中关于Nv操作的源码,以及z-stack中Nv的使用! 在Z-STACK中Nv存储器主要用于保存网络的配置参数,如网络地址,使 系统在掉电重启仍然能读取一些参数,自动加入到原来的网络中,这样其网络地址没有…

ElementUI+Java实现搜索提示列表

效果 实现流程 首先我们需要在后端获取数据,我们可以根据name属性去模糊查询,返回Map类型的列表 然后将它返回给前端。 controller ApiOperation("根据关键字查询讲师名列表")GetMapping("list/name/{key}")public ResultVo sele…

CentOS7 搭建Pulsar 消息队列环境,CentOS(Linux)部署Pulsar,亲测成功,以及Python操作Pulsar实例驱动

在 最佳开源数据库与数据分析平台奖 中,之前曾连续两年入选的 Kafka 意外滑铁卢落选,取而代之的是新兴项目 Pulsar,Bossie Awards中对 Pulsar 点评如下:“Pulsar 旨在取代 Apache Kafka 多年的主宰地位。Pulsar在很多情况下提供了…

为什么要学python语言、学完有什么好处_学编程为什么首选Python?学完Python的优势有哪些?...

原标题:学编程为什么首选Python?学完Python的优势有哪些?Python 是一门更注重可读性和效率的语言,尤其是相较于 Java,PHP 以及 C 这样的语言,它的这两个优势让其在开发者中大受欢迎。正是由于 Python 易于上…

SpringSecurity +Jwt 实现权限管理

目录标题原理架构图demo的项目结构JwtTokenUtilRestAuthenticationEntryPoint 和 RestfulAccessDeniedHandlerMyUserDetailsServiceJwtAuthenticationTokenFilterSecurityConfigControllerPostman 测试为了方便,未采用是从数据库读取的方式。工具类都是别人那偷的&a…

FreeMarker_模板引擎_代码自动生成器_源码下载

首先我们先来认识一下Freemarker 1.what is the FreeMarker? 你可以到freemarker的官网上去,那里有很详细的介绍:http://freemarker.org/ 这里大概说一下:FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。 …

CentOS7 搭建Kafka消息队列环境,以及Python3操作Kafka Demo

Kafka适合什么样的场景? 它可以用于两大类别的应用: 构造实时流数据管道,它可以在系统或应用之间可靠地获取数据。 (相当于message queue)构建实时流式应用程序,对这些流数据进行转换或者影响。 (就是流处理,通过kafka stream topic和topi…

hive序列生成_常见的序列化框架及Protobuf原理

享学课堂作者:逐梦々少年转载请声明出处!上次我们详细的学习了Java中的序列化机制,但是我们日常开发过程中,因为java的序列化机制的压缩效率问题,以及序列化大小带来的传输的效率问题,一般很少会使用原生的…

Linux(CentOS 7)安装docker

此文转载:https://www.cnblogs.com/qgc1995/p/9553572.html,感谢原作者写出了这么棒的Docker部署文章。 我是虚拟机装的Centos7,linux 3.10 内核,docker官方说至少3.8以上,建议3.10以上(ubuntu下要linux内…

decode语句不能再嵌套_自学C++基础教程【流程控制语句】(for、while 、do while 语句 )...

for语句for语句是C语言所提供的一种功能广泛的循环语句。下图为for语句的标准形式:表达式1:通常用于给循环变量赋初值,一般是赋值表达式。表达式2:通常用于设立循环条件,一般为关系表达式或逻辑表达式。表达式3&#x…

CentOS 7 利用Docker搭建禅道系统

1,系统环境 a,操作系统 CentOS Linux release 7.6.1810 (Core) 64位 b,确保Docker环境已经安装,具体教程请看 CentOS 安装docker 禅道系统一键安装说明文档:http://www.zentao.net/book/zentaopmshelp/90.html …

centos7 docker删除端口映射_centos7安装docker,结合docker安装mysql,学习简单使用

需要快速安装centos7的可以结合上一遍文章vagrant结合virtualbox让你直接在cmd窗口操作linux系统centos7地址:https://www.toutiao.com/i6858180977164812811/?group_id6858180977164812811Docker先说一下个人理解:docker其实就是一个工具,镜…

MongoDB中关于64位整型存储解决方案

为什么80%的码农都做不了架构师?>>> 社区内一哥们smcboy 提出关于php中操作MongoDB存储整数问题,找到点资料花点时间翻译过来,是个很好的学习方式。红薯 那篇讨论我的修改回复,仍然没有更新可恶啊~!&#…

滑动窗口--单调队列

给定一个大小为 n≤106 的数组。 有一个大小为 k 的滑动窗口,它从数组的最左边移动到最右边。 你只能在窗口中看到 k 个数字。 每次滑动窗口向右移动一个位置。 以下是一个例子: 该数组为 [1 3 -1 -3 5 3 6 7],k 为 3。 窗口位置 最小值…

CentOS7 源码编译安装MySQL8.0.15 shell脚本

使用MySQL8无需像MySQL5那样需要Boost依赖,和经过35-55分钟的等待编译完成,直接解压即可使用,方便快捷! 1,环境: 操作系统 CentOS Linux release 7.6.1810 (Core) 64位 服务器环境 “腾讯云”服务器…

切割图形_泉州泡沫景观字切割机厂家

泉州泡沫景观字切割机厂家 jz4rw0qv泉州泡沫景观字切割机厂家 巨源线条切割机同步带型结构合理、性能、精密度高、、操作简便、价格合理,比同行业同款机床更高,是原有同步带型泡沫切割机的替代产品。自动编程使用计算机利用配合切割机应用,只…