Maison >interface Web >js tutoriel >keep-alive contrôle le nombre de requêtes du serveur

keep-alive contrôle le nombre de requêtes du serveur

php中世界最好的语言
php中世界最好的语言original
2018-06-12 10:28:532131parcourir

Cette fois, je vais vous présenter le keep-alive pour contrôler le nombre de requêtes du serveur. Quelles sont les précautions à prendre pour contrôler le nombre de requêtes du serveur. Voici un cas pratique, jetons un oeil.

VUE2.0 fournit une méthode keep-alive, qui peut être utilisée pour mettre en cache les composants afin d'éviter de charger les composants correspondants plusieurs fois et de réduire 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: '/home',
          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

以前的写法是在data中将需要的 $route 数据进行赋值,便于其余方法使用,但是使用了 keep-alive 后数据需要进入页面在activated中再次获取,才能达到更新的目的。定义一个initData方法,然后在activated中启动。

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. 当页动态修改url

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

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

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

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

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

let swiperInstance = new Swiper('#swiper', {
 pagination: '.swiper-pagination',
 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: 'transferMap',
 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('换乘地图');
  _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('iframe');
  iframe.src = '/favicon.ico'; // 必须
  iframe.style.visibility = 'hidden';
  iframe.style.width = '1px';
  iframe.style.height = '1px';
  iframe.onload = function () {
   setTimeout(function () {
    document.body.removeChild(iframe);
   }, 0);
  };
  document.body.appendChild(iframe);
 }, 0);
}

jQuery/Zepto实现

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

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

webpack中如何操作dev与prd

极度简介执行vue.watch

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