>웹 프론트엔드 >JS 튜토리얼 >vue를 사용하여 서버에 대한 요청 수를 줄입니다.

vue를 사용하여 서버에 대한 요청 수를 줄입니다.

php中世界最好的语言
php中世界最好的语言원래의
2018-04-11 13:53:351185검색

이번에는 vue를 사용하여 서버에 대한 요청 수를 줄이는 방법에 대한 몇 가지 노트를 가져오겠습니다. 다음은 몇 가지 실제 사례를 살펴보겠습니다.

VUE2.0은 해당 구성 요소를 여러 번 로드하는 것을 방지하고 성능 소비를 줄이기 위해 구성 요소를 캐시하는 데 사용할 수 있는 연결 유지 방법을 제공합니다. 예를 들어, 그림, 텍스트 등을 포함한 페이지의 데이터는 사용자에 의해 로드되었으며, 사용자는 이를 클릭하여 다른 인터페이스로 이동합니다. 그런 다음 다른 인터페이스에서 원래 인터페이스로 돌아갑니다. 설정하지 않으면 서버에서 원래 인터페이스의 정보를 다시 요청하게 됩니다. vue에서 제공하는 연결 유지 기능은 페이지에서 요청한 데이터를 저장하고 요청 수를 줄이며 사용자 경험을 향상시킬 수 있습니다.

캐싱 구성 요소는 전체 사이트의 페이지를 캐시하는 구성 요소와 일부 페이지를 캐시하는 구성 요소의 두 가지 유형으로 나뉩니다.

​ ​ 1. 모든 페이지를 캐시합니다. 각 페이지에 요청이 있는 상황에 적합합니다. 방법은 다음과 같습니다. 캐시해야 하는 라우터 뷰를 keep-alive 태그로 래핑합니다.

rreee

캐싱은 생성된 후크에 첫 번째 트리거 요청을 작성하여 수행할 수 있습니다. 예를 들어, 목록 페이지에서 세부정보 페이지로 이동하면 다시 돌아올 때 원래 페이지가 그대로 유지됩니다.

​​​​​ 2. router.meta 속성을 사용하여 판단하여 얻을 수 있는 일부 구성 요소 또는 페이지를 캐시합니다. 방법은 다음과 같습니다. 라우터 설정은 다음과 같습니다:

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

​​​ 새로운 속성인 include/exclude를 통해 설정할 수도 있습니다. 이름은 의미를 내포하고, include는 포함한다는 뜻, 제외한다는 의미는 제외됩니다. 여기서는 컴포넌트의 이름을 이용하여 설정해야 하므로 이름을 추가해야 합니다.​ 구성 요소 a와 b를 추가하려면 캐싱이 필요하지만 구성 요소 c와 d에는 캐싱이 필요하지 않습니다. 다음과 같이 쓰여 있습니다:

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

고객이 사진을 전혀 볼 수 없지만 페이지를 열 때 모두 로드하는 것처럼 Vue 프로젝트의 최적화는 구성 요소의 주문형 로드를 통해 달성될 수도 있습니다. 요청 시간을 늘리고 사용자 경험을 줄이세요. 지연 로딩은 Taobao, JD.com 등의 쇼핑 웹사이트 등 이미지 링크가 많은 웹사이트에서 빠르게 스크롤을 내리면 이미지 로딩 상태를 볼 수 있습니다.

추가됨:

Vue 라우팅에서 연결 유지를 활성화할 때 주의할 점

이는 비즈니스 요구 사항은 아니지만 페이지에 들어갈 때마다 DOM이 다시 렌더링되고 데이터를 얻어 DOM을 업데이트하는 것을 보면 프론트 엔드 엔지니어로서 최적화가 필요하다고 느낍니다. Vue가 제공하는 로딩 로직. 연결 유지 기능이 있어서 한번 사용해 봤습니다. 물론 순탄한 항해는 없을 것이고, 길에서 부딪히는 우여곡절은 피할 수 없기 때문에 여기에 부딪힌 문제들을 기록하고 이 글을 읽는 분들이 도움이 되기를 바랍니다. ps. 어렵지 않습니다.

HTML 부분:

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

......1. 데이터는 어느 단계에서 획득되나요

페이지

라이프 사이클

후크는 위의 코드와 같이 가장 많이 사용되는 부분입니다. Keep-Alive를 도입할 때 이 부분에 주의해야 합니다. 페이지가 처음으로 들어가면 후크의 트리거 시퀀스가 ​​생성됩니다-> 활성화, 비활성화는 종료 시 트리거됩니다. 다시 입력(앞으로 또는 뒤로)하면 활성화된 것만 발동됩니다. 우리는 연결 유지를 알고 있습니다 페이지 템플릿이 처음 초기화되어 HTML 조각으로 파싱된 후에는 다시 파싱하지 않고 다시 입력할 때 메모리에 있는 데이터를 읽습니다. 즉, 데이터가 변경될 때만 diff에 VirtualDOM을 사용합니다. 업데이트. 따라서 페이지 진입 시 얻은 데이터도 활성화에 배치해야 합니다. 데이터를 다운로드한 후 DOM의 수동 작업도 활성화되어 실행되어야 적용됩니다.

따라서 데이터 수집 코드의 사본을 활성화 상태로 남겨두거나, 생성된 부분 없이 생성된 코드를 직접 활성화로 전송해야 합니다.

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;
  },

      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中文网其它相关文章!

推荐阅读:

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

vue计算属性详解

위 내용은 vue를 사용하여 서버에 대한 요청 수를 줄입니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.