摘要:注意重点是获取更新后的就是在开发过程中有个需求是需要在阶段操作数据更新后的节点这时候就需要用到就是用来知道什么时候更新完成原因在钩子函数执行的时候其实并未进行任何渲染,而此时进行操作无异于徒劳,所以在中一定要将操作的代码放进的回调函数中。
1. 最简单的vue
el: dom节点
data: 数据
2. Vue 数据里的数组对象更新,但是视图不更新 2.1 问题Vue 测试实例 - 菜鸟教程(runoob.com) {{ message }}
由于js的限制,Vue 不能检测以上数组的变动,以及对象的添加/删除,很多人会因为像上面这样操作,出现视图没有更新的问题。
2.2 解决办法
this.$set(你要改变的数组/对象,你要改变的位置/key,你要改成什么value)
this.$set(this.arr, 0, "aa"); // 改变数组 this.$set(this.obj, "c", "cc"); // 改变对象
数组原生方法触发视图更新:
Vue可以监测到数组变化的,数组原生方法:
splice()、 push()、pop()、shift()、unshift()、sort()、reverse()2.3实例
3. filter过滤器的作用Vue 测试实例 - 菜鸟教程(runoob.com) arr:{{arr}}
obj:{{obj}}
4. v-for与v-if优先级Vue 测试实例 - 菜鸟教程(runoob.com) {{message | filterTest}}
v-if尽量不要与v-for在同一节点使用,因为v-for 的优先级比 v-if 更高,如果它们处于同一节点的话,那么每一个循环都会运行一遍v-if
如果你想根据循环中的每一项的数据来判断是否渲染,那么你这样做是对的:
如果你想要根据某些条件跳过循环,而又跟将要渲染的每一项数据没有关系的话,你可以将v-if放在v-for的父节点:
// 数组是否有数据 跟每个元素没有关系
No todos left!
正确使用v-for与v-if优先级的关系,可以为你节省大量的性能。
5.vue生命周期 5.1 实例5.2 create和mounted{{ message }}
beforecreated:el 和 data 并未初始化
created:完成了 data 数据的初始化,el没有
beforeMount:完成了 el 和 data 初始化
mounted :完成挂载
另外在标绿处,我们能发现el还是 {{message}},这里就是应用的 Virtual DOM(虚拟Dom)技术,先把坑占住了。到后面mounted挂载的时候再把值渲染进去。
5.3update 相关 5.4destroy有关于销毁,暂时还不是很清楚。我们在console里执行下命令对 vue实例进行销毁。销毁完成后,我们再重新改变message的值,vue不再对此动作进行响应了。但是原先生成的dom元素还存在,可以这么理解,执行了destroy操作,后续就不再受vue控制了。
5.5 总结beforecreate : 举个栗子:可以在这加个loading事件
created :在这结束loading,还做一些初始化,实现函数自执行
mounted : 在这发起后端请求,拿回数据,配合路由钩子做一些事情
beforeDestroy: 你确认删除XX吗? destroyed :当前组件已被删除,清空相关内容
5.6 参考https://segmentfault.com/a/11...
6.vue 为什么采用Virtual DOM创建真实DOM的代价高:真实的 DOM 节点 node 实现的属性很多,而 vnode 仅仅实现一些必要的属性,相比起来,创建一个 vnode 的成本比较低。
2.触发多次浏览器重绘及回流:使用 vnode ,相当于加了一个缓冲,让一次数据变动所带来的所有 node 变化,先在 vnode 中进行修改,然后 diff 之后对所有产生差异的节点集中一次对 DOM tree 进行修改,以减少浏览器的重绘及回流
虚拟dom由于本质是一个js对象,因此天生具备跨平台的能力,可以实现在不同平台的准确显示。
Virtual DOM 在性能上的收益并不是最主要的,更重要的是它使得 Vue 具备了现代框架应有的高级特性。
例子
{ tag: "div", /*说明这是一个div标签*/ children: [ /*存放该标签的子节点*/ { tag: "a", /*说明这是一个a标签*/ text: "click me" /*标签的内容*/ } ] }
渲染后可以得到
7. 组件data为什么必须是函数
因为不使用return包裹的数据会在项目的全局可见,会造成变量污染
使用return包裹后数据中变量只在当前组件中生效,不会影响其他组件
当一个组件被定义, data 必须声明为返回一个初始数据对象的函数,因为组件可能被用来创建多个实例。如果 data 仍然是一个纯粹的对象,则所有的实例将共享引用同一个数据对象!通过提供 data 函数,每次创建一个新实例后,我们能够调用 data 函数,从而返回初始数据的一个全新副本数据对象。
8. 组件style的scoped为什么在组件中用js动态创建的dom,添加样式不生效
结果
// test生效 testAdd 不生效.test[data-v-1b971ada]{ // 注意data-v-1b971ada background:blue; height:100px; width:100px; }
原因
当