声明响应式属性

由于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) // => '更新完成'
})
}
}
})

最新文章

  1. Dynamics CRM 2015-如何修改Optionset Default Value
  2. hexo+next博客添加搜索
  3. Ansible 模块命令介绍
  4. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.0 版新增消息管理
  5. 为什么要放弃使用Thread.Sleep
  6. The Parallel Challenge Ballgame[HDU1101]
  7. c++ 继承 虚函数与多态性 重载 覆盖 隐藏
  8. [iOS UI进阶 - 3.1] 触摸事件的传递
  9. Android SDK Manager国内无法更新的解决方案
  10. Android:自定义适配器
  11. 从VSS到SVN再到Git 记Git的基本操作
  12. javascript6
  13. 利用css实现页面加载时旋转动画
  14. IOC容器在web容器中初始化——(一)两种配置方式
  15. zookeeper源码 — 二、集群启动—leader选举
  16. python-web自动化-Js-滚动条操作
  17. 【vue】vue +element 搭建项目,实现实时输入效果时停止输入后发送请求
  18. 访问天地图WMTS服务的正确姿势
  19. android设备兼容性
  20. 忘记MySQL root密码重置MySQL root密码

热门文章

  1. 【博弈论】【SG函数】bzoj1777 [Usaco2010 Hol]rocks 石头木头
  2. 关于Hadoop_env.sh中的HADOOP_CLASSPATH
  3. Scala实战高手****第16课:Scala implicits编程彻底实战及Spark源码鉴赏
  4. ASP.NET MVC DropdownList的使用
  5. Java笔记9:Spring简单Demo
  6. Solr json,xml等文件数据导入(添加索引)linux下操作
  7. 【面试问题】—— 2019.3月前端面试之JS原理&amp;CSS基础&amp;Vue框架
  8. 解决spring boot启动报错java.lang.NoClassDefFoundError: ch/qos/logback/classic/Level
  9. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-人机界面HMI自锁按钮和自复位按钮如何理解(Toggle variable Tap variable)
  10. C++ 字符串分割函数 str_split