Maison > interface Web > js tutoriel > le corps du texte

Utilisez vue pour réduire le nombre de requêtes au serveur

php中世界最好的语言
Libérer: 2018-04-11 13:53:35
original
1177 Les gens l'ont consulté

Cette fois, je vais vous apporter quelques précautions sur la façon d'utiliser vue pour réduire le nombre de requêtes au serveur Ce qui suit est un cas pratique, jetons un coup d'œil.

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 certaines pages.

​ ​ 1. Mettre en cache toutes les pages, adapté aux situations où chaque page a une requête. 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>
Copier après la connexion

La mise en cache peut être réalisée en écrivant la première demande de déclenchement dans le hook créé. 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. Mettez en cache certains composants ou pages, ce qui peut être réalisé en utilisant l'attribut router.meta par jugement. La méthode est la suivante :                                                                      Les paramètres du routeur sont les suivants :

<keep-alive v-if="$route.meta.keepAlive">
      <router-view></router-view>
     </keep-alive>
     <router-view v-if="! $route.meta.keepAlive"></router-view>
Copier après la connexion

​​​ Il peut également être défini via le nouvel attribut include/exclude. Le nom implique la signification, inclure signifie inclure et exclure signifie exclure. 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 ainsi :

 routers:[
        { path: '/home',
          name: home,
          meta:{keepAlive: true}  // 设置为true表示需要缓存,不设置或者false表示不需要缓存          }
          ]
Copier après la connexion

L'optimisation du projet Vue peut également être obtenue grâce au chargement de composants à la demande, tout comme le chargement paresseux des images. Si le client ne voit pas du tout ces images, mais que nous les chargeons toutes lors de l'ouverture de la page, cela sera grandement utile. Augmentez le temps de requête et réduisez l’expérience utilisateur. Le chargement paresseux est utilisé sur de nombreux sites Web, tels que les sites Web commerciaux tels que Taobao et JD.com. Si vous faites défiler rapidement vers le bas, vous pouvez voir l'état de chargement des images.

  <keep-alive include="a,b">
      <component></component>
     </keep-alive>  
     <keep-alive exclude="c,d">
      <component></component>
     </keep-alive>
Copier après la connexion

Ajouté :

Points à noter lors de l'activation du maintien en vie dans le routage Vue

Ce n'est pas une exigence métier, mais quand je vois que le DOM est restitué à chaque fois que j'entre dans la page et que les données sont ensuite obtenues pour mettre à jour le DOM, je pense qu'en tant qu'ingénieur front-end, il est nécessaire d'optimiser la logique de chargement fournie par Vue. rester en vie fonction, alors je l'ai essayé. 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 :

......1. A quel stade sont obtenues les données
<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)
 }
Copier après la connexion

Le hook de la page cycle de vie

est tel qu'indiqué dans le code ci-dessus. Ces quatre parties sont les plus couramment utilisées. Vous devez faire attention à cette partie lors de l’introduction du keep-alive. Lorsque la page est saisie pour la première fois, la séquence de déclenchement du hook est créée-> activé, désactivé se déclenche à la sortie. Lors d'une nouvelle saisie (en avant ou en arrière), seule l'activation est déclenchée.

Nous savons rester en vie Une fois que le modèle de page est initialisé et analysé pour la première fois en un fragment HTML, il ne réanalyse pas mais lit les données dans la mémoire lorsqu'elles sont à nouveau saisies. Autrement dit, uniquement lorsque les données changent, VirtualDOM est utilisé pour la comparaison. mises à jour. 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.

Par conséquent, vous devez laisser une copie du code d'acquisition de données activé, ou transférer directement le code créé vers activé sans la partie créée.

2. $route 中的数据读不到

以前的写法是在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;
  },
Copier après la connexion

      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();
 }
});
Copier après la connexion

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();
 },
}
Copier après la connexion

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);
}
Copier après la connexion

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);
}
Copier après la connexion

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

推荐阅读:

Vue.js提升必知的几点总结

vue计算属性详解

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal