vue 声明响应式属性
2024-09-23 02:50:08
声明响应式属性
由于vue不允许动态添加根级响应式属性,所以你必须在初始化实例前声明根级响应式属性,哪怕只是一个空值:
var vm = new Vue({
data: {
// 声明 message 为一个空值字符串
message: ''
},
template: '<div>{{ message }}</div>'
})
// 之后设置 `message`
vm.message = 'Hello!'
如果你在data属性中未声明message,vue将警告你渲染函数在试图访问的属性不存在
这样的限制在背后是有技术原因的,它消除了在依赖项跟踪系统中的一类边界情况,也是vue实例在类型检查系统的帮助下运行的更高效。而且在代码可维护性方面也有一点考虑:data对象就像组件状态的概要,提前声明所有的响应式属性,可以让组件代码在以后阅读或其他开发人员阅读时更易于理解。
异步更新队列
可能你还没有注意到,vue异步执行DOM更新,只要观察到数据变化,vue将开启一个队列,并缓冲在同一事件循环中发生的所有数据变化。如果同一个watcher被多次触发,只会一次推入到队列中,这种在缓冲时去除重复数据对于避免不必要的计算和DOM操作上非常重要。然后,在下一个事件循环"tick"中,vue刷新队列并执行实际(已去重)工作。
vue在内部尝试对异步队列使用原生的promise.then和MutationObserver(突变的观察者),如果执行环境不支持,会采用setTimeout(fn,0)代替。
例如,当你设置vm.somedata = 'new value',该组件不会立即重新渲染。当刷新队列时,组件会在事件循环队列清空是的下一个“tick”更新。多数情况下,我们不需要关心这个过程,但是如果你想在DOM状态更新后做点什么,这就可能有点棘手。虽然vue通常鼓励开发人员沿着“数据驱动”的方式思考,避免直接接触DOM,但有时我们确实需要这么做,为了在数据变化之后等待vue完成更新DOM,可以再数据变化之后立即使用vue.nextTick(callback)。这样回调函数在DOM更新完成后就会调用。例:
<div id="example">{{message}}</div>
var vm = new Vue({
el: '#example',
data: {
message: '123'
}
})
vm.message = 'new message' // 更改数据
vm.$el.textContent === 'new message' // false
Vue.nextTick(function () {
vm.$el.textContent === 'new message' // true
})
在组件内使用vue.$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) // => '更新完成'
})
}
}
})
最新文章
- Dynamics CRM 2015-如何修改Optionset Default Value
- hexo+next博客添加搜索
- Ansible 模块命令介绍
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.0 版新增消息管理
- 为什么要放弃使用Thread.Sleep
- The Parallel Challenge Ballgame[HDU1101]
- c++ 继承 虚函数与多态性 重载 覆盖 隐藏
- [iOS UI进阶 - 3.1] 触摸事件的传递
- Android SDK Manager国内无法更新的解决方案
- Android:自定义适配器
- 从VSS到SVN再到Git 记Git的基本操作
- javascript6
- 利用css实现页面加载时旋转动画
- IOC容器在web容器中初始化——(一)两种配置方式
- zookeeper源码 — 二、集群启动—leader选举
- python-web自动化-Js-滚动条操作
- 【vue】vue +element 搭建项目,实现实时输入效果时停止输入后发送请求
- 访问天地图WMTS服务的正确姿势
- android设备兼容性
- 忘记MySQL root密码重置MySQL root密码
热门文章
- 【博弈论】【SG函数】bzoj1777 [Usaco2010 Hol]rocks 石头木头
- 关于Hadoop_env.sh中的HADOOP_CLASSPATH
- Scala实战高手****第16课:Scala implicits编程彻底实战及Spark源码鉴赏
- ASP.NET MVC DropdownList的使用
- Java笔记9:Spring简单Demo
- Solr json,xml等文件数据导入(添加索引)linux下操作
- 【面试问题】—— 2019.3月前端面试之JS原理&;CSS基础&;Vue框架
- 解决spring boot启动报错java.lang.NoClassDefFoundError: ch/qos/logback/classic/Level
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-人机界面HMI自锁按钮和自复位按钮如何理解(Toggle variable Tap variable)
- C++ 字符串分割函数 str_split