Vue 是一个MVVM框架

所谓mvvm就是model-->view,view-->model。 vue帮助我们实现了自动绑定。省点我们用JQUERY,zpeto 去操作dom的麻烦。

主要是Object.defineProperty 给object添加get set 访问器来实现值变化的监听。

但是由于es5的限制,有很多不能达到监听值的目点。比如:

1.数组的各个方法,来改变数组

  • push()
  • pop()
  • shift()
  • unshift()
  • splice()
  • sort()
  • reverse()

2.纯数组 [1,2,3,4,5,6] 这样的也不能监听到值的变化

3.对象:动态添加对象的属性等

这些都不能监听到,不过vue都处理过了,什么$set ,$delete,$remove等等。 es6 浏览器出现了 Object.observe ,Array.observe. 不过兼容性问题也很头疼,可能在以后的各个MVVM框架都会改版吧.

利用Object.freeze() 方法可以阻止vue 给添加get set访问器。 这样能提高性能,但同时也放弃了监听的功能

列表渲染

用v-for 进行列表渲染。这是一个最基本最重要的功能。vue 在设计时为了性能(不能每次一个list更改就要全量的创建dom),提供了track-by特性,用来复用dom和原来的作用域。

<div v-for="item in list">
{{item}}
</div>

默认情况下,只要

this.list=[,,,,]

就会全部重新渲染。

不用:track-by

不复用也是复用的一种方式

1.在不用track-by 的情况,在遍历数组的时候会给每一个对象 添加一个v-for id,这个东西是要用来在再次渲染的时候用的。所以如果数组中哪个对象,用了Object.freeze。那么它就生成不了这个对象。在第一次之后的任何一次渲染都会失败。这种情况下需要添加track-by,来通知vue 应该怎样去复用

2.在数组数据重复时,在渲染时无法决定如何复用。这时需要添加track-by="$index",来处理。

用:track-by

但是,如果每个对象都有一个唯一 ID 的属性,便可以使用 track-by 特性给 Vue.js 一个提示,Vue.js 因而能尽可能地复用已有实例。

例如,假定数据为:

{
items: [
{ _uid: '88f869d', ... },
{ _uid: '7496c10', ... }
]
}

然后可以这样给出提示:

<div v-for="item in items" track-by="_uid">
<!-- content -->
</div>

然后在替换数组 items 时,如果 Vue.js 遇到一个包含 _uid: '88f869d' 的新对象,它知道它可以复用这个已有对象的作用域与 DOM 元素。

在这个渲染过程中,在新的items的_uid在 索引 10 处。老的items此_uid 在20处,就会发生dom片段移动。

如果值发生变化就更新值,(只涉及到绑定的属性,没有绑定的属性,即使改变了也不会渲染,因为没必要。。)

track-by="$index"

如果没有唯一的键供追踪,可以使用 track-by="$index",它强制让 v-for 进入原位更新模式:片断不会被移动,而是简单地以对应索引的新值刷新。这种模式也能处理数据数组中重复的值。

这让数据替换非常高效,但是也会付出一定的代价。因为这时 DOM 节点不再映射数组元素顺序的改变,不能同步临时状态(比如 <input> 元素的值)以及组件的私有状态。因此,如果 v-for 块包含 <input> 元素或子组件,要小心使用 track-by="$index"

按照新的数组来遍历,第几个就是拿老的对应index的dom过来渲染,如果值变化就更新值.没变化就算了。 多余的dom 删除。

Vue 性能优化track-by的更多相关文章

  1. Vue性能优化

    今天来谈一谈Vue中一些性能优化的问题,仅仅是个人使用中的一些小心得,来,今天我一句废话不多说,直接上内容好吧 1.v-if和v-show的使用, 我们都知道这两个都可以控制显隐,那我们用哪个呢,个人 ...

  2. Vue性能优化之组件按需加载(以及一些常见的性能优化方法)

    关于Vue中的按需加载我就简单介绍一下:大概就是我们所有的东西都会在app.js里面,但是我们并不需要把所有的组件都一次性加载进来,我们可以在需要它的时候再将它加载进来,话不多说,开车! 1.webp ...

  3. 前端vue性能优化

    一:代码层次优化 1.1.v-if 和 v-show 区分使用场景 v-if 是 真正 的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建:也是惰性的:如果在初始渲染时 ...

  4. 浅谈vue性能优化

    基础优化 所谓的基础优化是任何 web 项目都要做的,并且是问题的根源.HTML,CSS,JS 是第一步要优化的点 分别对应到 .vue 文件内的,<template>,<style ...

  5. VUE性能优化总结

    1.v-show,v-if 用哪个? 在我来看要分两个维度去思考问题: 第一个维度是权限问题,只要涉及到权限相关的展示无疑要用 v-if, 第二个维度在没有权限限制下根据用户点击的频次选择,频繁切换的 ...

  6. vue nextTick深入理解-vue性能优化、DOM更新时机、事件循环机制

    一.定义[nextTick.事件循环] nextTick的由来: 由于VUE的数据驱动视图更新,是异步的,即修改数据的当下,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成之后,再统一进行视图 ...

  7. 对vue nextTick深入理解-vue性能优化、DOM更新时机、事件循环机制

    一.定义[nextTick.事件循环] nextTick的由来: 由于VUE的数据驱动视图更新,是异步的,即修改数据的当下,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成之后,再统一进行视图 ...

  8. vue性能优化1--懒加载

    懒加载也叫延迟加载,即在需要的时候进行加载.随用随载.为什么需要懒加载?像vue这种单页面应用,如果没有应用懒加载,运用webpack打包后的文件将会异常的大,造成进入首页时,需要加载的内容过多,时间 ...

  9. vue性能优化2--引入cdn

    当我们加载页面时,需要将我们所需要的一些依赖加载到当前会话中然后再开始执行,如果我们首屏,模块比较多是,需要等待的时间会比较长,而且.浏览器内存最多执行四十个进程,需要等到加载完前面的才能执行后面的代 ...

随机推荐

  1. FileUpload组件

    package com.itheima.servlet; import java.io.File; import java.io.FileOutputStream; import java.io.IO ...

  2. TortoiseGit上传项目到GitHub////////////////////////////z

    1.安装msysgit和TortoiseGit : 2.TortoiseGit 设置: (1).确保安装成功: (2).设置用户名和邮箱: 3.登陆github并进入设置页面: 4.添加 SSH Ke ...

  3. GetKeyboardType获取键盘类型(通过键盘可初步判断用户使用的是台式电脑还是笔记本电脑)

    函数功能:该函数获取系统当前键盘的信息. int WINAPI GetKeyboardType( __in int nTypeFlag ); 参数说明:nTypeFlag:指定要获取的键盘信息的类型, ...

  4. 浅谈在静态页面上使用动态参数,会造成spider多次和重复抓取的解决方案

    原因: 早期由于搜索引擎蜘蛛的不完善,蜘蛛在爬行动态的url的时候很容易由于网站程序的不合理等原因造成蜘蛛迷路死循环. 所以蜘蛛为了避免之前现象就不读取动态的url,特别是带?的url 解决方案: 1 ...

  5. Hdu 1214 圆桌会议

    圆桌会议 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  6. js 一个自写的 监测类

    自从认识了jQuery后,很多页面加载入口,都放在document.ready里面.但是有时候这个觉得ready加载太慢, 这个[监测类 ]就开始产生了 效果类似这个. 每10毫秒检查一次,直到加载了 ...

  7. 详解学习C#的方法和步骤

    如果你已经有较多的面向对象开发经验,跳过以下这两步: 第一步 掌握一门.NET面向对象语言,C#或VB.NET. 强烈反对在没系统学过一门面向对象语言的前提下去学ASP.NET. ASP.NET是一个 ...

  8. MKRCVCD-MKRCVCDSER.exe can't start in service

    Logfile contents: 2016/11/23 02:15:09 NamePipeSer Log Start.2016/11/23 02:15:09 Start C:\Program Fil ...

  9. Java使用DatagramSocket

    转自:http://book.51cto.com/art/201203/322540.htm Java使用DatagramSocket代表UDP协议的Socket,DatagramSocket本身只是 ...

  10. 浅析Java.lang.Process类

    一.概述      Process类是一个抽象类(所有的方法均是抽象的),封装了一个进程(即一个执行程序).      Process 类提供了执行从进程输入.执行输出到进程.等待进程完成.检查进程的 ...