【Vue】Vue数据更新方法
前言
平时做项目时会经常对数组和对象进行数据更新操作,而有时数据并没有及时更新,这时我们会用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的组件库,提供了丰富的
- 【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下面是框架组件的配置:问题出现的原因:做商品详情的时候
- 【Vue】Antd Pro Vue的使用(五)—— 多文件上传回显问题
- 需求: 多文件上传 ,上传的时候绑定fileList回显问题: 上传成功了,也拿到了后台返回的数据,但是onchang监听的时候,file的状态一直是uploading原因:onchange 只触发了一次解决: 使用单文件上传时@change事件会至少触发两次,一次file.status=uploading,最后一次要么是done或者error,handleUpload1(info) { if (info
- 【Vue】Antd Pro Vue的使用(七) —— 年份选择组件配置
- ant design vue组件中没有现成的年份组件可使用,不过可通过配置来实现年份选择。先看实现效果:关闭效果:展开效果:配置如下:<a-date-picker mode="year" format="YYYY" :style="{width: '256px'}&quot
- 【VUE】Vue3+Vite+TypeScript常用项目模块详解
- 目录1.Vue3+Vite+TypeScript 概述1.1 vue3 1.1.1 Vue3 概述1.1.2 vue3的现状与发展趋势1.2 Vite1.2.1 现实问题1.2 搭建vite项目1.3 TypeScript1.3.1 TypeScript 定义1.3.2 TypeScript 基本数据类型 1.3.3 TypeScript语法简单介绍2. 项目配置简单概述2.1 eslint 校验代码工具配置2.1.1 eslint定义2.1
- 【Vue】vue通过class获取dom
- 其实就是操作 html 中的标签的一些能力 我们可以操作哪些内容 获取一个元素 移除一个元素 创建一个元素 向页面里面添加一个元素 给元素绑定一些事件 获取元素的属性给元素添加一些 css 样式 ... DOM 的核心对象就是 docuemnt 对象 document 对象是浏览器内置的一个对象,里面存储着专门用来操作元素的各种方法 DOM: 页面中的标签,我们通过 js 获取到以后,就把这个对象叫做 DOM 对象获取一个元素通过 js 代码来获取页面中的标签获取到以后我们
- 【Vue】vue使用后端提供的接口
- 在 vue 中使用后端接口可通过以下步骤实现:安装 axios 库并导入。使用 axios 对象创建 http 请求,如 get 或 post。使用 data 选项传递数据。处理响应,使用 data 属性访问后端返回的数据。使用 vuex 管理从后端获取的数据,通过组件访问。在 Vue 中使用后端接口在 Vue.js 应用中使用后端提供的接口可以让你与服务器通信,获取和更新数据。本文将介绍如何在 Vue 中使用后端接口。1. 安装 Axios首先,你需要安装 Axios 库,这是一个用于发起 H
- 【PHP】MongoDB介绍
- 【React】如何在 React 类中声明常量?
- 【Vue】Vue3 开发实战分享——打印插件 Print.js 的使用(Vue3 + Nodejs + Print.js 实战)以及 el-table 与 el-pagination 的深入使用(上)
- 【Python】使用Python实现基数排序算法原理的实例
- 【PHP】mongodb数据存储在哪
- 【Go】VSCode配置Go语言开发库
- 【PHP】thinkphp设计模式讲解
- 【Python】深入解析matplotlib安装教程:必须掌握的Python初学者指南
- 【PHP】PHP生成ICO图标的方法
- 【AntDesignPro】使用高德地图设置考勤区域