Heim > Web-Frontend > js-Tutorial > Hauptteil

Verwenden Sie vue, um die Anzahl der Anfragen an den Server zu reduzieren

php中世界最好的语言
Freigeben: 2018-04-11 13:53:35
Original
1165 Leute haben es durchsucht

Dieses Mal werde ich Ihnen einige Vorsichtsmaßnahmen zur Verwendung von Vue vorstellen, um die Anzahl der Anfragen an den Server zu reduzieren. Das Folgende ist ein praktischer Fall, schauen wir uns das an.

VUE2.0 bietet eine Keep-Alive-Methode, mit der Komponenten zwischengespeichert werden können, um das mehrfache Laden entsprechender Komponenten zu vermeiden und den Leistungsverbrauch zu reduzieren. Zum Beispiel, Die Daten einer Seite, einschließlich Bilder, Text usw., wurden vom Benutzer geladen und dann springt der Benutzer durch Anklicken zu einer anderen Oberfläche. Kehren Sie dann von einer anderen Schnittstelle zur ursprünglichen Schnittstelle zurück. Wenn es nicht gesetzt ist, werden die Informationen der ursprünglichen Schnittstelle erneut vom Server angefordert. Das von vue bereitgestellte Keep-Alive kann die angeforderten Daten der Seite speichern, die Anzahl der Anfragen reduzieren und die Benutzererfahrung verbessern.

Caching-Komponenten werden in zwei Typen unterteilt: Komponenten, die die gesamten Seiten der Website zwischenspeichern, und Komponenten, die einige Seiten zwischenspeichern.

​ ​ 1. Alle Seiten zwischenspeichern, geeignet für Situationen, in denen jede Seite eine Anfrage hat. Die Methode lautet wie folgt: Umschließen Sie die Router-Ansicht, die zwischengespeichert werden muss, mit dem Keep-Alive-Tag.

 <keep-alive>
      <router-view></router-view>
     </keep-alive>
Nach dem Login kopieren

Caching kann erreicht werden, indem die erste Triggeranforderung in den erstellten Hook geschrieben wird. Wenn Sie beispielsweise von der Listenseite zur Detailseite wechseln, befinden Sie sich bei Ihrer Rückkehr immer noch auf der Originalseite.

​​​​​ 2. Zwischenspeichern einiger Komponenten oder Seiten, was durch die Verwendung des router.meta-Attributs durch Urteilsvermögen erreicht werden kann. Die Methode ist wie folgt:                                                                   Die Router-Einstellungen lauten wie folgt:

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

​​​ Es kann auch über das neue Attribut include/exclude festgelegt werden. Die Bedeutung ergibt sich aus dem Namen: „include“ bedeutet Einschluss, „exclude“ bedeutet „außer“. Hier müssen Sie den Namen der Komponente zum Festlegen verwenden, daher muss der Name hinzugefügt werden.​ Das Hinzufügen der Komponenten a und b erfordert Caching, während die Komponenten c und d kein Caching erfordern. Es ist wie folgt geschrieben:

 routers:[
        { path: '/home',
          name: home,
          meta:{keepAlive: true}  // 设置为true表示需要缓存,不设置或者false表示不需要缓存          }
          ]
Nach dem Login kopieren

Die Optimierung des Vue-Projekts kann auch durch das Laden von Komponenten bei Bedarf erreicht werden, genau wie das verzögerte Laden von Bildern. Wenn der Kunde diese Bilder überhaupt nicht sieht, wir sie aber beim Öffnen der Seite laden, wird dies erheblich sein Erhöhen Sie die Anfragezeit und reduzieren Sie die Benutzererfahrung. Lazy Loading wird auf vielen Websites verwendet, z. B. auf Shopping-Websites wie Taobao, JD.com usw., die viele Bildlinks haben. Wenn Sie schnell nach unten scrollen, wird möglicherweise der Bildladezustand angezeigt.

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

Hinzugefügt:

Zu beachtende Punkte bei der Aktivierung von Keep-Alive im Vue-Routing

Dies ist keine Geschäftsanforderung, aber wenn ich sehe, dass das DOM jedes Mal neu gerendert wird, wenn ich die Seite betrete, und dann die Daten zum Aktualisieren des DOM abgerufen werden, habe ich als Front-End-Ingenieur das Gefühl, dass eine Optimierung erforderlich ist die Ladelogik, die Vue bereitstellt. am Leben bleiben Funktion, also habe ich es ausprobiert. Natürlich wird nichts reibungslos verlaufen, und Unebenheiten und Unebenheiten auf der Straße sind unvermeidlich. Deshalb schreibe ich die hier aufgetretenen Probleme auf und hoffe, dass die Leute, die diesen Artikel lesen, helfen können. ps: Das ist nicht schwer.

HTML-Teil:

......1. In welchem ​​Stadium werden die Daten erhoben? Der Seiten-
<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)
 }
Nach dem Login kopieren
Lebenszyklus

-Hook ist im obigen Code dargestellt. Diese vier Teile werden am häufigsten verwendet. Auf diesen Teil müssen Sie bei der Einführung von Keep-Alive achten Beim ersten Betreten der Seite wird die Triggersequenz des Hooks erstellt-> aktiviert, deaktiviert wird beim Verlassen ausgelöst. Bei erneuter Eingabe (vorwärts oder rückwärts) wird nur aktiviert ausgelöst. Wir kennen Keep-Alive Nachdem die Seitenvorlage zum ersten Mal initialisiert und in ein HTML-Fragment analysiert wurde, führt sie keine erneute Analyse durch, sondern liest die Daten im Speicher, wenn sie erneut eingegeben wird. Das heißt, VirtualDOM wird nur für Diff verwendet Aktualisierungen. Daher sollten auch die beim Betreten der Seite erfassten Daten aktiviert werden. Nachdem die Daten heruntergeladen wurden, sollte auch die manuelle Bedienung des DOM aktiviert werden, damit sie wirksam wird.

Daher sollte eine Kopie des Datenerfassungscodes aktiviert bleiben oder der erstellte Code direkt ohne den erstellten Teil in die Aktivierung übertragen werden.

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;
  },
Nach dem Login kopieren

      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();
 }
});
Nach dem Login kopieren

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();
 },
}
Nach dem Login kopieren

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);
}
Nach dem Login kopieren

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);
}
Nach dem Login kopieren

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

推荐阅读:

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

vue计算属性详解

Das obige ist der detaillierte Inhalt vonVerwenden Sie vue, um die Anzahl der Anfragen an den Server zu reduzieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!