vue优化

------------恢复内容开始------------

1.用key:key的作用主要是为了高效的更新虚拟DOM。另外vue中在使用相同标签名元素的过渡切换时,也会使用到key属性,其目的也是为了让vue可以区分它们

diff算法判断一个元素是否相等的依据有两个:元素类型和key值。

我们希望可以在B和C之间加一个F,Diff算法默认执行起来是这样的:

 要使用key来给每个节点做一个唯一标识,Diff算法就可以正确的识别此节点,找到正确的位置区插入新的节点。

2.使用冻结对象

Object.freeze(xx);冻结后的属性是不能改变的,vue不会对冻结对象做响应式处理;

像不会改变的仅仅用来显示的数据,比如新闻列表,评论列表,文章列表,这些不会改变的对象,可以冻结。

通常对于单个对象不会优化,而对于多个对象才冻结优化;

<template>
  <div class="container">
    <button @click="generateFreeze">freezenBtn</button>
    <button @click="generateData">Btn</button>
    <p>{{freezeData.length}}</p>
    <p>{{data.length}}</p>

  </div>
</template>

<script>
export default {
  data() {
    return {
      freezeData: [],
      data: [],
    };
  },
  methods: {
    generateFreeze(){
     this.freezeData =  Object.freeze(this.getData()); //冻结
    },
    generateData(){
      this.data = this.getData();//不冻结
    },
    getData(){
      const result = []
      for (let i = 0; i < 1000000; i++) {//生成百万个数据
        result.push({
          index:i
        })
      }
      return result;
    }
  },
};

 

 很明显的可以看出来,对于百万数据,freeze数据用时182ms,而对于普通响应式数据,勇士1882ms,差不多是10倍的耗时。

 3.使用计算属性:

当多次使用同一个函数时候,因为计算属性对数据暂时存储,依赖条件不变化不会更新,所以性能更好。

4.函数式组件:没有data和生命周期

没有管理任何状态,也没有监听任何传递给它的状态,也没有生命周期方法。实际上,它只是一个接受一些 prop 的函数。在这样的场景下,我们可以将组件标记为 functional,这意味它无状态 (没有响应式数据),也没有实例 (没有 this 上下文)。

使用:1.在template标签上标注functional属性,表示这是个函数组件

  2.在引用数据时候,一定要带props.xx;因为没有this,props没法直接挂载在this上。

<template functional>
<div class="fun-container">
  <ul>
    <li v-for='item in props.demo' :key='item'>
      {{item}}
    </li>
  </ul>
</div>
</template>

<script>
export default {
  props:['demo']

}
</script>

效率上,函数式组件是vue生命周期组件的两倍左右。

5.  保持对象引用的稳定性

  vue触发重新渲染的时机是依赖的数据变化;vue判断数据变化的依据是 if(!newVal === val ){ return };发现data里的值是一样的,就不渲染;

  例如,app页中有评论数据是一个数组,并将每个评论数据传个comment组件,comment组件的作用是显示一条评论;当提交新评论,有两种方法可以操作用来显示更新:

    1.提交完数据后,重新获取全部评论的数据,将全部评论重新赋值;

    2.提交完数据后,将返回值添加到全部评论的数组中;

  方法1会导致评论数据全部不一样,虽然评论数据仅仅是几条更新,但这些一样的数据是通过字符串转换来的,每次都会生成新数据,也就是会造成每一个comment组件的重新渲染。而方法2不会。

  方法2的缺点是:不是实时更新,别人的评论不会立刻传给你。大部分时候,没有必要实时,因为一旦刷新就会获取到实时数据;如果有实时的需求,可以用websocket技术。

  组件细分,比如每条评论的组件,可以避免很多情况下的重新渲染。

6.v-show代替v-if

  频繁切换状态,内部包含大量子组件。

7. 解决白屏问题

  1. <div id='#app'>插入一个载入动画</app>

  2. 优化打包,减少提交。

 

  4. 延迟加载,

   某页面需要渲染的内容太多,即该页面中组件非常多。页面全部渲染完毕才能显示内容,否则是空白。

 8.按需加载,在路由中用()=> import('xxxx');

------------恢复内容结束------------

原文地址:https://www.cnblogs.com/dangdanghepingping/p/14975942.html