Vue项目的优化

Vue 代码层优化

1. v-if 和 v-show区分使用的场景

v-if 适用于在运行时很少改变条件,不需要频繁切换条件的场景;v-show 则适用于需要非常频繁切换条件的场景。

2. compouted 和 watch props 区分使用场景

computed: 是计算属性,依赖其它属性值,并且 computed 的值有缓存,
只有它依赖的属性值发生改变,下一次获取 computed 的值时才会重新计算 computed 的值;

watch: 更多的是「观察」的作用,类似于某些数据的监听回调 ,每当监听的数据变化时都会执行回调进行后续操作;
使用 watch 选项允许我们执行异步操作 ( 访问一个 API ),限制我们执行该操作的频率,并在我们得到最终结果前,设置中间状态。这些都是计算属性无法做到的。
注意:

  1. 如果子组件使用vuex,通过computed引入的数据,不能直接通过this.xxx=yyy修改,必须通过 commit 去修改vuex的数据。否则会报错
    [图片上传失败...(image-7cc3bf-1604993476395)]

  2. 如果一个需求,computed值发生改变,可以改变当前组件data的数据变化;data变化的值可以改变computed变化;双向绑定的。
    getter/setter实现

  3. vue 解决computed修改data数据的问题 https://www.jb51.net/article/173669.htm
    当computed的数据依赖相关的数据是异步请求过来的数据,会报错的。
    数据会先渲染初始值,然后再渲染异步请求回来的数据。渲染两次但是我只是需要最后一次变化的值。

  4. 子组件修改props时,如果是传来的值是引用类型vue不会报错,但是如果是基本类型直接修改会报错。

    子组件修改props的方法:

    1. 子组件data中拷贝一份,注意引入类型需要深拷贝,根据需求可以watch监听
        props: ["list"],
        data() {
            return {
                newList: this.list.slice()
            }
        },
        watch: {
            list(newVal) {
                this.newList = newVal
            }
    
    
    1. 通过计算属性修改
        computed: {
            nList() {
                return this.list.filter(item => {
                    return item.isChecked
                })
            }
        }
    
    1. 通过研究大佬们的写法又发现了一种修改方式: sync修饰符
      父组件 穿进去的时候加上 .sync
      子组件 通过this.$emit('update:xxx', params)
      
    // 父组件
    <todo-list :list.sync="list" />
    
    // 子组件
    methodName(index) {
       this.$emit('update:list', this.newList)
    }
    
    

3. v-for 和 v-if

  • v-for 遍历必须为 item 添加 key
  • v-for 遍历避免同时使用 v-if
    v-for 比 v-if 优先级高,如果每一次都需要遍历整个数组,将会影响速度,尤其是当之需要渲染很小一部分的时候,必要情况下应该替换成 computed 属性。
        
        <ul>
        <li
            v-for="user in activeUsers"
            :key="user.id">
            {{ user.name }}
        </li>
        </ul>
        computed: {
            activeUsers: function () {
                return this.users.filter(function (user) {
                    return user.isActive
                })
            }
        }
    

4. 长列表性能优化

Vue会通过Object.defineProperty对数据劫持,来实现视图响应数据的变化
然而有些时候长列表只是单纯的显示,不需要数据和视图绑定,所以我们禁止vue劫持我们的数据。
通过Object.freeze方法冻结对象就再也不能被修改了。
    export default {
    data: () => ({
        users: {}
    }),
    async created() {
        const users = await axios.get("/api/users");
        this.users = Object.freeze(users);
    }
    };

5. 事件销毁

Vue 组件销毁时,会自动清理它与其它实例的连接,解绑它的全部指令及事件监听器,但是仅限于组件本身的事件。

如果在 js 内使用 addEventListene 等方式是不会自动销毁的,我们需要在组件销毁时手动移除这些事件的监听,以免造成内存泄露,


    created() {
    addEventListener('click', this.click, false)
    },
    beforeDestroy() {
    removeEventListener('click', this.click, false)
    }

6. 图片懒加载

对于图片过多的页面,为了加速页面加载速度,所以很多时候我们需要将页面内未出现在可视区域内的图片先不做加载, 等到滚动到可视区域后再去加载。

这样对于页面加载性能上会有很大的提升,也提高了用户体验。

我们在项目中使用 Vue 的 vue-lazyload 插件:

安装插件

npm install vue-lazyload --save-dev

在入口文件 man.js 中引入并使用

import VueLazyload from 'vue-lazyload'

然后再 vue 中直接使用

Vue.use(VueLazyload)

或者添加自定义选项

Vue.use(VueLazyload, {
preLoad: 1.3,
error: 'dist/error.png',
loading: 'dist/loading.gif',
attempt: 1
})

在 vue 文件中将 img 标签的 src 属性直接改为 v-lazy ,从而将图片显示方式更改为懒加载显示:

<img v-lazy="/static/img/1.png">

以上为 vue-lazyload 插件的简单使用,如果要看插件的更多参数选项,可以查看 vue-lazyload 的 github 地址

7. 路由懒加载


const Foo = () => import('./Foo.vue')
const router = new VueRouter({
  routes: [
    { path: '/foo', component: Foo }
  ]
})

8. 优化无限列表性能

果你的应用存在非常长或者无限滚动的列表,那么需要采用 窗口化 的技术来优化性能,只需要渲染少部分区域的内容,减少重新渲染组件和创建 dom 节点的时间。

你可以参考以下开源项目 vue-virtual-scroll-list 和 vue-virtual-scroller 来优化这种无限列表的场景的。

webpack 配置面优化

基础Web计算层面的优化

参考文献

https://mp.weixin.qq.com/s/l8isi43gxWqNRVjLgEGHkQ

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容