zoukankan      html  css  js  c++  java
  • 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');

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

  • 相关阅读:
    通过SecureCRT向远程Linux主机上传和下载文件
    Oracle JDK究竟从哪个版本开始收费?
    设计模式之工厂方法(FactoryMethod)模式
    设计模式之构建者(Builder)模式
    Word文档中多个编号放同一行的方法(非技术)
    局域网内客户端无法使用机器名连接SQLServer服务器
    八、springboot 简单优雅的通过docker-compose 构建
    五、docker-compose开锋(docker 三剑客)
    四、docker 仓库(让我们的镜像有处可存)
    三、DockerFile 定制属于自己的专属镜像
  • 原文地址:https://www.cnblogs.com/dangdanghepingping/p/14975942.html
Copyright © 2011-2022 走看看