【译】Vue 的小奇技(第一篇):提升大型数据列表的性能

特别声明:本文是做者 Alex Jover 发布在 VueDose 上的一个系列。前端

版权归做者全部。vue

译者在翻译前已经和做者沟通获得了翻译整个系列的受权。ios

为了避免影响你们阅读,得到受权的记录会放在本文的最后。git

嗨,你们好!欢迎来到 VueDose 的第一篇文章。我已经准备好在 VueDose 上开启这段旅程,来帮助像你同样的开发者们来学习一些厉害的技巧。github

首先,在 VueDose 上发布的文章都是很简洁明了的,由于我相信这样的行文风格对于读者来讲会更有帮助,因此咱们如今就直接开始吧。axios

正文内容

一般咱们在应用中会请求一些列表数据,好比说用户列表、商品列表、文章列表等等......api

并且有时候,咱们并不会去修改这些请求回来的列表数据,而只是单纯地去展现它们,或者是把它们保存在全局状态管理器里面(又称之为 Vuex)。请求数据列表的示意代码以下所示:数组

export default {
  data: () => ({
    users: {}
  }),
  async created() {
    const users = await axios.get("/api/users");
    this.users = users;
  }
};
复制代码

Vue 在默认状况下,会将数组 this.users 中的,全部对象的第一层属性设置为响应式数据。微信

这对于大型的对象数组来讲,性能成本很是的高。没错,的确有时候列表数据是有分页的,但总会有一些状况下,是没有进行分页,继而在前端展现的。async

一个实际的例子就是谷歌地图的标记点 markers 列表数据,这就是一个拥有不少对象的大型数组。

因此,在一些特定的状况下,若是咱们可以阻止 Vue 将这些列表数据设置为响应式的,那么咱们就能够为项目带来一些性能上的提高。实际上咱们就是能够作到的,经过用 Object.freeze 方法,将获取到的列表数据在赋值给组件以前,进行冻结:

export default {
  data: () => ({
    users: {}
  }),
  async created() {
    const users = await axios.get("/api/users");
    this.users = Object.freeze(users);
  }
};
复制代码

记住,一样地能够应用到 Vuex 实践中:

const mutations = {
  setUsers(state, users) {
    state.users = Object.freeze(users);
  }
};
复制代码

顺便说一下,若是你确实有须要去修改请求获得的列表数据,那么你仍然能够经过建立一个新的数组来实现。举个例子,给原列表数据添加一个同类型元素,能够这么操做:

state.users = Object.freeze([...state.users, user]);
复制代码

或许你会忍不住想问,这个操做到底可以带来多大的性能提高呀?具体的咱们详见下一篇文章,请继续关注!

这就是今天的全部内容,我但愿你可以喜欢 😛。

你能够在线阅读这篇 原文,里面有可复制粘贴的源代码。若是你喜欢这个系列的话,请分享给你的同事们!

结语

此系列的其余文章,会同步系列官网的发布状况,及时地翻译发布到掘金。请持续关注「程序猿何大叔」,相信我会给你们带来更多优质的内容,不要忘了点赞~

若是想要了解个人更多,请查阅以下:

请求翻译受权记录

请求翻译受权记录
相关文章
相关标签/搜索