Maison >interface Web >js tutoriel >Réduisez le nombre de requêtes au serveur grâce au keep-alive fourni par vue

Réduisez le nombre de requêtes au serveur grâce au keep-alive fourni par vue

亚连
亚连original
2018-05-28 09:50:351060parcourir

Cet article présente principalement l'utilisation du keep-alive fourni par vue pour réduire le nombre de requêtes adressées au serveur. L'article présente également les points à noter lors de l'activation du keep-alive dans le routage vue. it

Voyons comment réduire le nombre de requêtes adressées au serveur grâce au keep-alive fourni par vue

VUE2.0 fournit une méthode keep-alive, qui peut être utilisée pour mettre en cache les composants et éviter de charger les composants correspondants plusieurs fois. Réduisez la consommation de performances. Par exemple, les données d'une page, y compris les images, le texte, etc., ont été chargées par l'utilisateur, puis l'utilisateur passe à une autre interface en cliquant dessus. Revenez ensuite à l’interface d’origine depuis une autre interface. S'il n'est pas défini, les informations de l'interface d'origine seront à nouveau demandées au serveur. Le keep-alive fourni par vue peut enregistrer les données demandées de la page, réduire le nombre de requêtes et améliorer l'expérience utilisateur.

Les composants de mise en cache sont divisés en deux types : les composants qui mettent en cache les pages entières du site ou les composants qui mettent en cache des pages partielles.

1. Mettez en cache toutes les pages, adapté aux situations où il y a des demandes pour chaque page. La méthode est la suivante : enveloppez la vue du routeur qui doit être mise en cache avec la balise keep-alive.

 <keep-alive>
      <router-view></router-view>
     </keep-alive>

En écrivant la première demande de déclenchement dans le hook créé, la mise en cache peut être réalisée. Par exemple, si vous passez de la page de liste à la page de détails, vous serez toujours sur la page d'origine lorsque vous reviendrez.

2. La mise en cache de certains composants ou pages peut être réalisée en utilisant l'attribut router.meta par jugement. La méthode est la suivante :

<keep-alive v-if="$route.meta.keepAlive">
      <router-view></router-view>
     </keep-alive>
     <router-view v-if="! $route.meta.keepAlive"></router-view>

Les paramètres du routeur sont les suivants :

 routers:[
        { path: &#39;/home&#39;,
          name: home,
          meta:{keepAlive: true}  // 设置为true表示需要缓存,不设置或者false表示不需要缓存          }
          ]

Vous pouvez également utiliser les nouveaux paramètres d'attribut d'inclusion/exclusion. La signification vient du nom, inclure signifie inclusion, exclure signifie sauf. Ici, vous devez utiliser le nom du composant pour le définir, le nom doit donc être ajouté. L'ajout des composants a et b nécessite une mise en cache, tandis que les composants c et d ne nécessitent pas de mise en cache. Il est écrit comme suit :

  <keep-alive include="a,b">
      <component></component>
     </keep-alive>  
     <keep-alive exclude="c,d">
      <component></component>
     </keep-alive>

L'optimisation des projets Vue peut également être obtenue grâce au chargement de composants à la demande, tout comme le chargement paresseux d'images si le client ne voit pas du tout ces images, mais. nous les ouvrons. Lorsque la page est entièrement chargée, cela augmentera considérablement le temps de requête et réduira l'expérience utilisateur. Le chargement paresseux est utilisé sur de nombreux sites Web, tels que les sites Web commerciaux tels que Taobao, JD.com, etc., qui contiennent de nombreux liens d'images. Si vous faites défiler rapidement vers le bas, vous pouvez voir la condition de chargement de l'image.

Supplément :

Points à noter lorsque le routage Vue active le maintien en vie

Ceci ce n'est pas une exigence métier, mais vu qu'à chaque fois que j'entre dans la page, le DOM est restitué puis les données sont obtenues pour mettre à jour le DOM, j'estime qu'en tant qu'ingénieur front-end, il est nécessaire d'optimiser la logique de chargement. . Vue fournit la fonction keep-alive, alors je l'ai essayée. Bien sûr, rien ne se passera sans heurts, et les bosses et les bosses sur la route sont inévitables, c'est pourquoi j'écris ici les problèmes rencontrés et j'espère que les personnes qui liront cet article pourront vous aider. ps : Ce n'est pas difficile.

Partie HTML :

<template>
 <p class="app">
 <keep-alive>
  <router-view></router-view>
 </keep-alive>
 </p>
</template>JavaScript部分:
.....
 created: function () {
  console.log(1)
 },
 mounted: function () {
  console.log(2)
 },
 activated: function () {
  console.log(3)
 },
 deactivated: function () {
  console.log(4)
 }

...1. À quelle étape les données sont-elles obtenues

Le hook du cycle de vie de la page est tel qu'illustré ? dans le code ci-dessus montre que ces quatre pièces sont les pièces les plus couramment utilisées. Il convient de noter dans cette partie que lorsque le keep-alive est introduit, lorsque la page est entrée pour la première fois, la séquence de déclenchement du hook est créée->montée->activée, et désactivée est déclenchée à la sortie. Lors d'une nouvelle saisie (en avant ou en arrière), seule l'activation est déclenchée.

Nous savons qu'après le maintien en vie, le modèle de page est initialisé et analysé pour la première fois en un fragment HTML. Lorsqu'il est saisi à nouveau, il ne réanalysera pas mais lira les données dans la mémoire. Autrement dit, il ne sera utilisé que lorsque les données changeront. VirtualDOM effectuera des mises à jour différentielles. Par conséquent, les données obtenues lors de la saisie de la page doivent également être activées. Une fois les données téléchargées, l'opération manuelle du DOM doit également être exécutée et activée pour prendre effet.

Donc, vous devez laisser une copie du code d'acquisition de données activé, ou vous devez laisser de côté la partie créée et transférer directement le code créé vers activé.

2. Les données dans $route ne peuvent pas être lues

La méthode d'écriture précédente consistait à attribuer les données $route requises dans data pour faciliter l'utilisation d'autres méthodes, mais après avoir utilisé keep-alive, les données doivent entrer dans la page et être à nouveau obtenues une fois activées pour atteindre l'objectif de mise à jour. Définissez une méthode initData puis démarrez-la en mode activé.

initData: function () {
  let _this = this;
  _this.fromLocation = JSON.parse(this.$route.query.fromLocation);
  _this.toLocation = JSON.parse(this.$route.query.toLocation);
  _this.activeIndex = parseInt(this.$route.params.activeIndex) || 0;
  _this.policyType = parseInt(this.$route.params.policyType) || 0;
  },

3. Modifier dynamiquement l'url sur la page actuelle

需求描述:当页面在进行轮播操作的时候希望能记录当前显示的轮播ID(activeIndex)。当进入下一个页面再返回的时候能记住之前的选择,将轮播打到之前的ID位置。所以我想将这部分信息固化在url中,轮播发生变化时,修改URL。这样实现比较符最小修改原则,其余页面不用变动。

之前的写法是将activeIndex放在 $route 的query中,当轮播后,将

activeIndex的值存入 $route.query.activeIndex 中,然后 $router.replace 当前路由,理论上应该能发生变化,但实际没有。

查看文档后说, $route 是只读模式。当然,对象部分是他监管不到的,我修改了并不是正统的做法。

神奇的地方来了:当我将activeIndex记在params中,轮播变动修改params中的参数,然后 $router.replace 当前路由,却能发生对应的变化。代码如下:

let swiperInstance = new Swiper(&#39;#swiper&#39;, {
 pagination: &#39;.swiper-pagination&#39;,
 paginationClickable: false,
 initialSlide: activeIndex,
 onSlideChangeEnd: function (swiper) {
  let _activeIndex = swiper.activeIndex;
  _this.$route.params.activeIndex = _activeIndex;
  // $router我放到了window上方便调用
  window.$router.replace({
   name: _this.$route.name,
   params: _this.$route.params,
   query: _this.$route.query
  });
  // 根据activeIndex,在这里初始化下面显示的数据
  _this.transferDetail = _this.allData.plans[_activeIndex].segments;
  _this.clearBusDetailFoldState();
 }
});

4. 事件如何处理

估计你也能猜到,发生的问题是事件绑定了很多次,比如上传点击input监听change事件,突然显示了多张相同图片的问题。

也就是说,DOM在编译后就缓存在内容中了,如果再次进入还再进行事件绑定初始化则就会发生这个问题。

解决办法:在mounted中绑定事件,因为这个只执行一次,并且DOM已准备好。如果插件绑定后还要再执行一下事件的handler函数的话,那就提取出来,放在activated中执行。比如:根据输入内容自动增长textarea的高度,这部分需要监听textarea的input和change事件,并且页面进入后还要再次执行一次handler函数,更新textarea高度(避免上次输入的影响)。

5. 地图组件处理

想必这是使用 keep-alive 最直接的性能表现。之前是进入地图页面后进行地图渲染+线路标记;现在是清除以前的线路标记绘制新的线路,性能优化可想而知!

我这里使用的是高德地图,在mounted中初始化map,代码示例如下:

export default {
 name: &#39;transferMap&#39;,
 data: function () {
  return {
   map: null,
  }
 },
 methods: {
  initData: function () {},
  searchTransfer: function (type) {},
  // 地图渲染 这个在transfer-map.html中使用
  renderTransferMap: function (transferMap) {}
 },
 mounted: function () {
  this.map = new AMap.Map("container", {
   showBuildingBlock: true,
   animateEnable: true,
   resizeEnable: true,
   zoom: 12 //地图显示的缩放级别
  });
 },
 activated: function () {
  let _this = this;
  _this.initData();
  // 设置title
  setDocumentTitle(&#39;换乘地图&#39;);
  _this.searchTransfer(_this.policyType).then(function (result) {
   // 数据加载完成
   // 换乘地图页面
   let transferMap = result.plans[_this.activeIndex];
   transferMap.origin = result.origin;
   transferMap.destination = result.destination;
   // 填数据
   _this.transferMap = transferMap;
   // 地图渲染
   _this.renderTransferMap(transferMap);
  });
 },
 deactivated: function () {
  // 清理地图之前的标记
  this.map.clearMap();
 },
}

6. document.title修改

这个不是 keep-alive 的问题,不过我也在这里分享下。

问题是,使用下面这段方法,可以修改Title,但是页面来回切换多次后就不生效了,我也不知道为啥,放到setTimeout中就直接不执行。

document.title = '页面名称';下面是使用2种环境的修复方法:

纯js实现

function setDocumentTitle(title) {
 "use strict";
 //以下代码可以解决以上问题,不依赖jq
 setTimeout(function () {
  //利用iframe的onload事件刷新页面
  document.title = title;
  var iframe = document.createElement(&#39;iframe&#39;);
  iframe.src = &#39;/favicon.ico&#39;; // 必须
  iframe.style.visibility = &#39;hidden&#39;;
  iframe.style.width = &#39;1px&#39;;
  iframe.style.height = &#39;1px&#39;;
  iframe.onload = function () {
   setTimeout(function () {
    document.body.removeChild(iframe);
   }, 0);
  };
  document.body.appendChild(iframe);
 }, 0);
}

jQuery/Zepto实现

function setDocumentTitle(title) {
 //需要jQuery
 var $body = $(&#39;body&#39;);
 document.title = title;
 // hack在微信等webview中无法修改document.title的情况
 var $iframe = $(&#39;<iframe src="/favicon.ico"></iframe>&#39;);
 $iframe.on(&#39;load&#39;, function () {
  setTimeout(function () {
   $iframe.off(&#39;load&#39;).remove();
  }, 0);
 }).appendTo($body);
}

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

vue 指定组件缓存实例详解

使用JSON格式提交数据到服务端的实例代码

JavaScript动态加载重复绑定问题

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn