您的当前位置:首页>全部文章>文章详情

【Vue】Vue数据更新方法

CrazyPanda发表于:2024-03-30 17:15:39浏览:326次TAG:

前言

平时做项目时会经常对数组和对象进行数据更新操作,而有时数据并没有及时更新,这时我们会用Vue.set(),this.$set()等方法让数据及时更新。

Vue.set(),this.$set()

<body>
    <div id="app">
        obj:{{obj}}
        <ul>
	        <li v-for="(item,index) in arr" v-bind:key="item">
	            arr[{{index}}]:{{item}}
	        </li>
        </ul>
   </div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>    
<script>
    var vm = new Vue({
        el:"#app",
        data:{
            arr:[1,2],
            obj:{
                a:3
            }
        }
    })
</script>

此时页面显示的数据如下:

arr[0]:1

arr[1]:2

添加以下代码,发现数据并没有改变:

vm.$data.arr[0] = 10; //页面不会重新渲染
vm.$data.obj.b = 15; //页面不会重新渲染

而添加以下代码,数据可以改变:

vm.$data.obj.a = 20;  //页面可以重新渲染

这是因为受现代 JavaScript 的限制,Vue 无法检测到对象属性的添加或删除。
由于 Vue 会在初始化实例时对属性执行 getter/setter 转化,所以属性必须在 data 对象上存在才能让 Vue 将它转换为响应式的。
而vm.$data.arr[0] = 10之所以不会重新渲染,是因为vue2在处理数组响应式变化时,采用覆盖 push、pop、shift、unshift、splice、reverse、sort 这七个数组方法,并将其处理为可以发送更新通知的函数实现的,故不能直接修改对应下标的值。

//vm.$data.obj.a 是响应式的
//vm.$data.obj.b 是非响应式的

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

Vue.set(vm.$data.arr,0,10)   //页面可以重新渲染
Vue.set(vm.$data.obj,'b',15) //页面可以重新渲染

还可以使用 vm.$set 实例方法,这也是全局 Vue.set 方法的别名

vm.$set(vm.$data.arr,0,10)   //页面可以重新渲染
vm.$set(vm.$data.obj,'b',15) //页面可以重新渲染

页面重新渲染后的效果:

arr[0]:10

arr[1]:2

Vue.nextTick()

Vue 在更新 DOM 时是异步执行的。
Vue.nextTick()是基于更新后的DOM状态进行操作。
例如:

<body>
    <div id="app">{{message}}</div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            message: '123'
        }
    })
</script>

页面显示为:123。
添加以下代码,更改数据:

vm.message = 'new message' // 更改数据

页面显示为:new message。但该组件不会立即重新渲染。

为了在数据变化之后等待 Vue 完成更新 DOM,可以在数据变化之后立即使用 Vue.nextTick(callback)。这样回调函数将在 DOM 更新完成后被调用
将打印结果进行对比:

console.log(vm.$el.textContent === 'new message') // false

此时DOM更新还未完成,vm.$el.textContent===‘123’。

Vue.nextTick(function () {
	console.log(vm.$el.textContent === 'new message') // true
})

使用Vue.nextTick(callback),回调函数在 DOM 更新完成后被调用,即此时DOM更新已完成,vm.$el.textContent === ‘new message’。

在组件内使用 vm.$nextTick() 实例方法特别方便,因为它不需要全局 Vue,并且回调函数中的 this 将自动绑定到当前的 Vue 实例上

Vue.component('example', {
  template: '<span>{{ message }}</span>',
  data: function () {
    return {
      message: '未更新'
    }
  },
  methods: {
    updateMessage: function () {
      this.message = '已更新'
      console.log(this.$el.textContent) // => '未更新'
      this.$nextTick(function () {
        console.log(this.$el.textContent) // => '已更新'
      })
    }
  }
})

2.1.0 起新增:如果没有提供回调且在支持 Promise 的环境中,则返回一个 Promise。请注意 Vue 不自带 Promise 的 polyfill,所以如果你的目标浏览器不原生支持 Promise (IE:你们都看我干嘛),你得自己提供 polyfill。

// 修改数据
vm.msg = 'Hello'
// DOM 还没有更新
Vue.nextTick(function () {
  // DOM 更新了
})

// 作为一个 Promise 使用 
Vue.nextTick()
  .then(function () {
    // DOM 更新了
  })

原文链接https://blog.csdn.net/lovezhuer1/article/details/103147493/

猜你喜欢

【Vue】Antd Pro Vue的使用(三)—— table列表的使用
用了几天ant design pro vue,发现vue2真的不是很好用,各种写法好麻烦。还有研究组件时,一定要看低版本的组件,高版本都是vue3的,并不适用。vue2版本组件位置:https://1x.antdv.com/components/alert-cn/ 作为后台管理端,用到最多的就是table列表,官网给的有预览但是自己上手的时候有事另外一回事了,首先就是接口请求的数据结果,官网并没有介绍接口应该返回什么样的数据结构,导致接口成功请求到数据,但table就是无法正常显示,最终参考de
发表于:2024-04-26 浏览:385 TAG:
【Vue】深入剖析:Vue核心之虚拟DOM
转载:https://www.cnblogs.com/caihongmin/p/17510878.html前言使用 Vue 做项目也有两年时间了,对 Vue 的 api也用的比较得心应手了,虽然对 Vue 的一些实现原理也耳有所闻,例如 虚拟DOM、flow、数据驱动、路由原理等等,但是自己并没有特意去探究这些原理的基础以及 Vue 源码是如何利用这些原理进行框架实现的,所以利用空闲时间,进行 Vue 框架相关技术原理和 Vue 框架的具体实现的整理。如果你对 Vue 的实现原理很感兴趣,那么就
发表于:2024-05-25 浏览:289 TAG:
【Vue】Vue中如何使用v-for指令循环输出对象
在vue中,v-for是一种指令,在模板中使用它可以对数组或对象进行循环操作。v-for指令用于循环渲染数据,它是vue中非常有用的指令之一。在vue中,使用v-for指令循环输出对象的方式和循环输出数组的方式类似,只需要稍作区别即可。如何使用v-for指令循环输出对象呢?下面我们将分以下几个部分进行讲解。一、v-for指令的基本使用v-for指令的基本语法如下:&lt;div&nbsp;v-for=&quot;(item,index)&nbsp;in&nbsp;items&quot;&gt;{
发表于:2024-04-30 浏览:381 TAG:
【Vue】Vue中字符串数组和对象常用方法介绍
在Vue中,数组和字符串是我们最常处理的数据类型。Vue提供了响应式系统,可以自动跟踪数组和对象的变化,并响应式地更新DOM。在Vue中,您可以像在任何JavaScript应用程序中一样操作这些数据类型。下面时整理的Vue中字符串 数组 以及对象的常用操作方法。一.数组方法1.增删改: unshift、push、splice、shift、pop、splice、slice&nbsp;1.1.unshift:在数组的头部添加内容//&nbsp;数组.unshift(&quot;添加的值&quot;)
发表于:2024-05-08 浏览:287 TAG:
【Vue】Vue中的组件生命周期以及应用场景介绍
vue是一款流行的javascript框架,它以其简化开发过程和高度可扩展性而闻名。vue的核心理念之一就是组件化,使得我们可以将应用程序拆解成一系列独立、可复用的组件。每个组件都有一个生命周期,它定义了组件被创建、被使用、被销毁的各个阶段。这个生命周期可以帮助我们更好地理解组件的工作原理,并在应用程序中使用不同的生命周期钩子完成特定的任务。在本文中,我们将详细介绍vue中的组件生命周期,以及如何应用生命周期钩子函数。组件生命周期在Vue中,组件有三个周期阶段:初始化阶段、运行阶段和销毁阶段。每
发表于:2024-04-29 浏览:316 TAG:
【Vue】Vue的生命周期
Vue的生命周期指的是 Vue 实例从创建到销毁的整个过程。这个过程可以分为以下几个阶段:1. 创建前阶段 (beforeCreate):在实例初始化后执行,此时的数据监听和事件绑定机制都未完成,因此无法访问DOM节点。2. 创建后阶段 (created):Vue实例已经创建,数据侦听、计算属性、方法、事件/侦听器的回调函数已配置完毕,但挂载阶段还没开始,仍然无法获取到DOM元素。适合进行异步请求等操作。3. 挂载前阶段 (beforeMount):完成了DOM的初始化,但仍然无法获取到具体的D
发表于:2024-04-22 浏览:299 TAG:
【Vue】vue2应用与vue3的不同之处
上一篇,我使用了vue2创建了一个应用,这次我使用vue3创建一个应用,看一下两者有什么不同。如下,是我用cue3创建的应用目录发现和vue2应用的目录一模一样,然后我用对比工具对比了两者的文件。1. 文件区别下面是package.json文件的区别,首先vue版本不同,对应的扩展组件也不同。下面是main.js的不同然后是APP.vue的不同2. 全局实例改变2.x 全局 API3.x 实例 API (app)Vue.configapp.configVue.config.productionT
发表于:2024-04-23 浏览:349 TAG:
【Vue】vue是什么模式的前端框架
vue 中的 mvvm 架构将应用程序分为 model、view 和 viewmodel:model:包含数据和业务逻辑,独立于视图。view:显示 model 中的数据,使用模板语法进行数据绑定。viewmodel:model 和 view 之间的桥梁,包含与 view 交互的数据和方法,并更新 view。mvvm 在 vue 中的优势包括响应式数据绑定、代码可重用性、提高生产力、易于调试。Vue:MVVM 架构什么是 MVVM?MVVM(Model-View-ViewModel)是一种软件设
发表于:2024-04-28 浏览:306 TAG:
【VUE】Vue3 实现文件预览 Word Excel pdf 图片 视频等格式 大全!!!!
先上效果图&nbsp;&nbsp;插件安装先说 word 文件是docx-preview插件&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; excel文件是用&nbsp;xlsx 插件&nbsp; &nbsp;&nbsp;介绍后端返回的数据因为在拦截器处 做了对数据的处理 最后你调接口拿到的数据是 一个对象 里面包含:url :&nbsp;blob对象转换的用于访问Blob数据的临时链接。这个链接可以被用于在网页中展示二进制数据,比如显示图像或者播放音视频文件blobs:&amp;
发表于:2023-12-28 浏览:314 TAG:
【Vue】前端框架 Vue3框架 使用总结(一) Vue框架的基础使用
目录一、Vue3框架基础1、创建项目2、项目结构3、Vue基础语法4、组件之间通信5、组合式api二、VueRouter的基础使用1、安装2、使用案例3、完整案例步骤4、调优-路由懒加载三、Vuex数据管理1、实现案例&nbsp;2、更改store状态,同步操作3、store中的计算属性4、redux里的异步操作Action5、模块化管理四、网络请求Vue3官方文档:Vue.js - 渐进式 JavaScript 框架 | Vue.js基础部分见官方文档一、Vue3框架基础1、创建项目安装yar
发表于:2023-12-05 浏览:807 TAG: