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

【Vue】Vue数据更新方法

CrazyPanda发表于:2024-03-30 17:15:39浏览:315次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】Vue常用框架介绍
现在的应用基本都是前后端分离,在国内,Vue相对来说更受欢迎一些,我们很多后端系统的前端都是Vue来开发的。那么Vue UI框架就显得尤为重要。Vue UI框架提供了一套丰富的用户界面组件及完整的前端UI解决方案,如按钮、表单、导航、布局等,使得开发者可以专注于业务逻辑开发,而不用从零构建这些常用的界面元素,帮助开发者更快速地构建高质量的用户界面。那么,都有哪些开源的UI框架呢?Element UIElement UI是一套为开发者、设计师和产品经理准备的基于Vue 2.0的组件库,提供了丰富的
发表于:2024-04-22 浏览:430 TAG:
【Vue】Antd Pro Vue的使用(十一) —— 富文本编辑器wangeditor的使用(避坑)
我承认,antd pro vue2是免费的,已经是老版本了,有多老呢,自带的wangeditor竟然是V3.1.1版本的,两年前无用wangeditor的时候已经是V5版本了,V3简直是上古的东西,官网都没有找到V3版本的资料。。。。,好在最后还是找到了一份V3版本的资料,要不然又要花时间去用新版本了。wangeditor V3参考资料:https://www.kancloud.cn/wangfupeng/wangeditor3/335782下面是框架组件的配置:问题出现的原因:做商品详情的时候
发表于:2024-05-10 浏览:273 TAG:
【Vue】Antd Pro Vue的使用(五)—— 多文件上传回显问题
需求: 多文件上传 ,上传的时候绑定fileList回显问题: 上传成功了,也拿到了后台返回的数据,但是onchang监听的时候,file的状态一直是uploading原因:onchange 只触发了一次解决: 使用单文件上传时@change事件会至少触发两次,一次file.status=uploading,最后一次要么是done或者error,handleUpload1(info)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(info
发表于:2024-05-06 浏览:341 TAG:
【Vue】Antd Pro Vue的使用(七) —— 年份选择组件配置
ant design vue组件中没有现成的年份组件可使用,不过可通过配置来实现年份选择。先看实现效果:关闭效果:展开效果:配置如下:&lt;a-date-picker &nbsp;&nbsp;&nbsp;&nbsp;mode=&quot;year&quot; &nbsp;&nbsp;&nbsp;&nbsp;format=&quot;YYYY&quot; &nbsp;&nbsp;&nbsp;&nbsp;:style=&quot;{width:&nbsp;&#39;256px&#39;}&amp;quot
发表于:2024-05-09 浏览:278 TAG:
【Vue】Vue数据更新方法
前言平时做项目时会经常对数组和对象进行数据更新操作,而有时数据并没有及时更新,这时我们会用Vue.set(),this.$set()等方法让数据及时更新。
发表于:2024-03-30 浏览:316 TAG:
【VUE】Vue3+Vite+TypeScript常用项目模块详解
&nbsp;目录1.Vue3+Vite+TypeScript 概述1.1 vue3&nbsp;1.1.1 Vue3&nbsp; 概述1.1.2&nbsp;vue3的现状与发展趋势1.2 Vite1.2.1 现实问题1.2 搭建vite项目1.3 TypeScript1.3.1 TypeScript 定义1.3.2 TypeScript 基本数据类型&nbsp;1.3.3 TypeScript语法简单介绍2. 项目配置简单概述2.1 eslint 校验代码工具配置2.1.1 eslint定义2.1
发表于:2024-02-21 浏览:446 TAG:
【Vue】vue通过class获取dom
其实就是操作 html 中的标签的一些能力  我们可以操作哪些内容  获取一个元素  移除一个元素  创建一个元素  向页面里面添加一个元素  给元素绑定一些事件  获取元素的属性给元素添加一些 css 样式  ...  DOM 的核心对象就是 docuemnt 对象  document 对象是浏览器内置的一个对象,里面存储着专门用来操作元素的各种方法  DOM: 页面中的标签,我们通过 js 获取到以后,就把这个对象叫做 DOM 对象获取一个元素通过 js 代码来获取页面中的标签获取到以后我们
发表于:2024-05-12 浏览:289 TAG:
【Vue】vue使用后端提供的接口
在 vue 中使用后端接口可通过以下步骤实现:安装 axios 库并导入。使用 axios 对象创建 http 请求,如 get 或 post。使用 data 选项传递数据。处理响应,使用 data 属性访问后端返回的数据。使用 vuex 管理从后端获取的数据,通过组件访问。在 Vue 中使用后端接口在 Vue.js 应用中使用后端提供的接口可以让你与服务器通信,获取和更新数据。本文将介绍如何在 Vue 中使用后端接口。1. 安装 Axios首先,你需要安装 Axios 库,这是一个用于发起 H
发表于:2024-04-18 浏览:291 TAG:
【Vue】Antd Pro Vue的使用(二)—— 全局配置及登录
1. 默认语言设置&nbsp;Antd Pro Vue安装好之后,默认使用的是英文,我们需要把它设置为中文简体。找到/src/core/bootstrap.js文件,把最后一行 en-US 修改为 zh-CN,然后一定要清除浏览器缓存,修改才能生效修改后修改后的页面2. 请求服务端接口Antd Pro Vue封装好的有请求方法,在/src/api/文件夹,我们把自己的接口写到这里面就可以任意调用。Antd Pro Vue安装好之后,默认使用的是mock数据,我们要使用自己的接口,要把mock去掉
发表于:2024-04-25 浏览:460 TAG:
【Vue】vue中destroy应用于什么场景
vue 中 destroy 方法用于销毁 vue 实例,释放其资源,应用场景有:组件销毁;页面路由切换;手动释放资源;避免内存泄漏。Vue 中 destroy 的应用场景Vue 中的 destroy 方法用于销毁一个 Vue 实例,释放其占用的资源。以下是一些常见的 destroy 应用场景:1. 组件销毁当一个组件不再需要时,可以使用 destroy 方法将其销毁,例如:this.$destroy();登录后复制2. 页面路由切换当页面路由切换时,旧的 Vue 实例需要被销毁,以释放其资源。可
发表于:2024-05-16 浏览:249 TAG: