首页 > 其他分享 >Vue修改数组、对象并且触发视图更新的方法以及原理

Vue修改数组、对象并且触发视图更新的方法以及原理

时间:2023-06-02 15:33:18浏览次数:63  
标签:触发 Vue title selected 视图 数组 msg true id

一、数组

 

items: ['a', 'b', 'c'];//一个普通的数组 
this.items[1] = 'x' ;//修改已有项
this.items[3] = 'd' ;//新增一项
this.item.length = 2;//修改数组的长度
//一个对象数组
msg: [{id: 1,selected: true, title: 'aaa',},
      {id: 2,selected: false, title: 'bbb'},
      {id: 3,selected: true, title: 'ccc'}]

this.msg[0] = { id : 1,selected : true, title : 'AAA'} //修改已有项
this.msg[3] = { id : 4,selected : true, title : 'DDD'} //新增一项
this.msg[0].child = "Child";//给数组的某一项新增属性

像上面这样,直接通过数组的下标去新增、修改数组的某一项、修改数组的长度,这些操作都不会被vue检测到 —— 数组的值虽然发生了变化,但是页面不会更新

解决方案:

 

方法详解

Array.splice(index,num,newItem)

  • Array 要操作的数组

  • index 要删除元素的下标

  • num 要删除元素的个数(num=0则不删除)

  • newItem 删除元素后想要在原位置替换的值(可以是0个或者多个)

this.$set(Array,index,newItem)

  • Array 要操作的数组

  • index 要修改元素的下标

  • newItem 修改之后的新值

items: ['a', 'b', 'c'];//一个普通的数组 

this.$set(items,1,'x');//修改已有项
this.items.splice(1,1,'x');//修改已有项

this.$set(items,3,'d');//新增一项
this.items.splice(3,1,'d');//新增一项

this.items.splice(2);//修改数组的长度


//一个对象数组
msg: [{id: 1,selected: true, title: 'aaa',},
      {id: 2,selected: false, title: 'bbb'},
      {id: 3,selected: true, title: 'ccc'}]
      
this.$set(msg,0,{ id : 1,selected : true, title : 'AAA' }); //修改已有项
this.msg.splice(0,1,{ id : 1,selected : true, title : 'AAA' }); //修改已有项

this.$set(msg,3,{ id : 4,selected : true, title : 'DDD' }); //新增一项
this.msg.splice(3,0,{ id : 4,selected : true, title : 'DDD' }); //新增一项

Vue提供了如下的数组的变异方法,可以触发视图更新:

注意:以下方法都会改变原数组!

 

push() - 往数组最后面添加一个元素,成功返回当前数组的长度
pop() - 删除数组的最后一个元素,成功返回删除元素的值
shift() - 删除数组的第一个元素,成功返回删除元素的值
unshift() - 往数组最前面添加一个元素,成功返回当前数组的长度
splice() - 向/从数组中添加/删除项目,然后返回被删除的项目
sort() - 使数组按照字符编码默认从小到大排序,成功返回排序后的数组
reverse() - 将数组倒序,成功返回倒序后的数组

以下常用的数组操作都不会改变现有的数组,而是返回一个新数组。

slice() 从已有数组中截取选定的元素,并返回一个由这些元素组成的新数组。
concat() 方法用于连接两个或多个数组,返回被连接数组的一个副本。
join() 方法用于把数组中的所有元素放入一个字符串,返回一个字符串。
filter() 通过检查指定数组中符合条件的所有元素,并返回一个由这些元素组成的新数组。

值得强调的是:利用索引直接修改一个数组项中已有的的属性值,数组的值会改变,页面也会更新!

 

//一个对象数组
msg: [{id: 1,selected: true, title: 'aaa',},
      {id: 2,selected: false, title: 'bbb'},
      {id: 3,selected: true, title: 'ccc'}]
      
this.msg[0].title = "AAA";

 

二、对象

 

 

 

参考文章

vue响应式原理https://cn.vuejs.org/v2/guide/reactivity.html

 

标签:触发,Vue,title,selected,视图,数组,msg,true,id
From: https://www.cnblogs.com/caihongmin/p/17451925.html

相关文章

  • Vue3 中 ref 的优势
    1.允许使用任何值类型2. 一个包含对象类型值的ref可以响应式地替换整个对象:constobjectRef=ref({count:0})//这是响应式的替换objectRef.value={count:1}3. ref被传递给函数或是从一般对象上被解构时,不会丢失响应性:constobj={foo:ref(1),......
  • Vue3 reactive 定义一个变量时,如何具有响应式?
    错误示范:constarr=reactive([]);constload=()=>{constres=[2,3,4,5];//假设请求接口返回的数据//方法1失败,直接赋值丢失了响应性//arr=res;//方法2这样也是失败//arr.concat(res);//方法3可以,但是很麻烦res.forEach(e=>{......
  • app直播源代码,vue+Ant design a-table分页器使用
    app直播源代码,vue+Antdesigna-table分页器使用 vue+Antdesigna-table分页器使用 当前页current设置生效 <a-table:columns="columns":data-source="detail":pagination="pagination"rowKey="id"@change="tablePaginationChange"......
  • vue多行文本显示省略号加展开收起按钮
    getClientRects()获取文本的行数和宽高等信息,只能获取行内元素的 nextTick(()=>{    constlineRows=document.querySelector('.abc').getClientRects();    //如果行数超出2||行数是2&&最后一行宽度超过dom宽度-展开收起按钮的width就是多了,要显示展开......
  • Vue中的APP与js的对象字面量
    JavaScript的对象字面量是一种方便创建和初始化对象的语法。它允许您直接在代码中定义对象,而无需使用类或构造函数。对象字面量使用大括号{}括起来,并包含零个或多个键值对。以下是JavaScript对象字面量的常见用法和特点:键值对:对象字面量中的键值对由键和值组成,使用冒号:分隔。键......
  • SpringBoot Vue3 Element Plus 打造分布式存储系统
    SpringBoot+Vue3+ElementPlus打造分布式存储系统download:3w51xuebccom配置IDEA热部署-devtools开发过程中频繁修改代码,每次都需要重新编译,部署,重启服务器,这无疑极大浪费了我们的时间。解决这个问题的方法就是使用热部署技术。本篇文章将介绍如何在IDEA中使用devtools实现热部署......
  • 黑马Vue3 + ElementPlus + Pinia 小兔鲜电商项目2023版
    黑马Vue3+ElementPlus+Pinia小兔鲜电商项目2023版download:3w51xuebccom合式API-watch-基本使用和立即执行合式API是一个用于构建可靠、模块化、灵活的RESTfulAPI的框架。它提供了许多实用的功能,其中包括watch机制。在本篇文章中,我们将介绍合式API的watch机制的基本使用和立......
  • 毕业设计管理系统|基于SSM+VUE实现毕业设计管理系统
    作者主页:编程指南针作者简介:Java领域优质创作者、、多年架构师设计经验、腾讯课堂常驻讲师主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助收藏点赞不迷路 关注作者有好处文末获取源码 项目编号:BS-GX-063一,环境介绍语言环境:Java: jdk1.8数据库:Mysql:mys......
  • 蛋糕网上销售系统|基于Springboot+Vue开发实现网上蛋糕系统
    作者主页:编程指南针作者简介:Java领域优质创作者、多年架构师设计经验、腾讯课堂常驻讲师主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助文末获取源码 项目编号:BS-SC-051前言:伴随着互联网的“低门槛”和人们金钱消费的数字化转变,网络购物奕然已经成为了时代......
  • vue-router 4.1.4版本以上,打开新页面并隐式传参
    情景框架:Vue3+Vite4+VueRouter4.1.6需求:现需要实现点击打开新页面,并把一些数据传过去限制:数据量较大,有一定私密性,不适合用query传递;需要从session中获取token判断访问权限,因此需要用router.resolve携带session打开新页面使用params传参在4.1.4以上版本被抛弃了-->vu......