今回はキープアライブでサーバーリクエスト数を制御する方法について、実際のケースを見てみましょう。
VUE2.0 は、コンポーネントをキャッシュするために使用できるキープアライブ メソッドを提供し、対応するコンポーネントの複数回のロードを回避し、パフォーマンスの消費を削減します。たとえば、画像やテキストなどを含むページのデータがユーザーによってロードされ、ユーザーはそれをクリックすることで別のインターフェイスにジャンプします。その後、別のインターフェースから元のインターフェースに戻ります。設定されていない場合は、再度元のインターフェースの情報をサーバーに要求します。 vue が提供するキープアライブは、ページの要求されたデータを保存し、要求の数を減らし、ユーザー エクスペリエンスを向上させることができます。キャッシュ コンポーネントは、サイト全体のページのコンポーネントとキャッシュのキャッシュ部分のコンポーネントの 2 種類に分けられます。
1. 各ページにリクエストがある状況に適した、すべてのページをキャッシュします。方法は以下の通り、キャッシュが必要なrouter-viewをkeep-aliveタグでラップします。 CACHEDを使用することは、作成されたフックに最初のトリガーリクエストを書き込むことで実現できます。たとえば、一覧ページから詳細ページに移動した場合、戻ってきたときに元のページが表示されます。
2. 一部のコンポーネントまたはページをキャッシュします。これは、router.meta 属性を使用して判断することで実現できます。方法は次のとおりです。 。名前には意味が含まれており、include は含めることを意味し、exclude は除外することを意味します。ここではコンポーネントの名前を使用して設定する必要があるため、名前を追加する必要があります。コンポーネント a と b を追加するにはキャッシュが必要ですが、コンポーネント c と d にはキャッシュが必要ありません。それは次のように書かれています:
<keep-alive> <router-view></router-view> </keep-alive>
Vue プロジェクトの最適化は、画像の遅延読み込みと同様に、コンポーネントのオンデマンド読み込みによっても実現できます。顧客がそれらの画像をまったく表示しない場合でも、開くときにすべてを読み込みます。ページが完了すると、リクエスト時間が大幅に増加し、ユーザー エクスペリエンスが低下します。遅延読み込みは、淘宝網や JD.com などのショッピング サイトなど、多くの Web サイトで使用されており、スクロールをすばやく下に引くと、画像が読み込まれていることがわかります。
補足:
Vue ルーティングがキープアライブをオンにする場合の注意点これはビジネス要件ではありませんが、ページに入るたびに DOM が再レンダリングされ、その後DOMを更新するためにデータを取得するのですが、フロントエンドエンジニアにとって読み込みロジックの最適化が必要だと思いますが、たまたまVueにキープアライブ機能があったので試してみました。もちろん、すべてが順風満帆というわけではなく、道での凹凸は避けられないので、ここで遭遇した問題を記録し、この記事を読んだ人が役立つことを願っています。 ps: これは難しいことではありません。 HTML 部分:
<keep-alive> <router-view></router-view> </keep-alive> <router-view></router-view>
...1. データを取得する段階
ページのライフサイクル フック 上記のコードに示されているように、これら 4 つは最も一般的に使用される部分です。この部分では、キープアライブを導入すると、最初にページに入ったときにフックのトリガーシーケンスが作成→マウント→アクティブ化され、終了時に非アクティブ化がトリガーされることに注意してください。再度入力した場合(前方または後方)、アクティブ化のみがトリガーされます。
キープアライブ後、ページテンプレートは初期化され、HTML フラグメントに初めて解析され、再度入力されると、再解析されず、メモリ内のデータが読み取られるだけであることがわかります。データが変更されると、差分更新に 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></iframe>'); $iframe.on('load', function () { setTimeout(function () { $iframe.off('load').remove(); }, 0); }).appendTo($body); }
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
以上がキープアライブはサーバーリクエストの数を制御しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

JavaScriptは1995年に発信され、Brandon Ikeによって作成され、言語をCに実現しました。 2。JavaScriptのメモリ管理とパフォーマンスの最適化は、C言語に依存しています。 3. C言語のクロスプラットフォーム機能は、さまざまなオペレーティングシステムでJavaScriptを効率的に実行するのに役立ちます。

JavaScriptはブラウザとnode.js環境で実行され、JavaScriptエンジンに依存してコードを解析および実行します。 1)解析段階で抽象的構文ツリー(AST)を生成します。 2)ASTをコンパイル段階のバイトコードまたはマシンコードに変換します。 3)実行段階でコンパイルされたコードを実行します。

PythonとJavaScriptの将来の傾向には、1。Pythonが科学コンピューティングの分野での位置を統合し、AI、2。JavaScriptはWebテクノロジーの開発を促進します。どちらもそれぞれのフィールドでアプリケーションシナリオを拡大し続け、パフォーマンスをより多くのブレークスルーを行います。

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

はい、JavaScriptのエンジンコアはCで記述されています。1)C言語は、JavaScriptエンジンの開発に適した効率的なパフォーマンスと基礎となる制御を提供します。 2)V8エンジンを例にとると、そのコアはCで記述され、Cの効率とオブジェクト指向の特性を組み合わせて書かれています。3)JavaScriptエンジンの作業原理には、解析、コンパイル、実行が含まれ、C言語はこれらのプロセスで重要な役割を果たします。

JavaScriptは、Webページのインタラクティブ性とダイナミズムを向上させるため、現代のWebサイトの中心にあります。 1)ページを更新せずにコンテンツを変更できます。2)Domapiを介してWebページを操作する、3)アニメーションやドラッグアンドドロップなどの複雑なインタラクティブ効果、4)ユーザーエクスペリエンスを改善するためのパフォーマンスとベストプラクティスを最適化します。

CおよびJavaScriptは、WebAssemblyを介して相互運用性を実現します。 1)CコードはWebAssemblyモジュールにコンパイルされ、JavaScript環境に導入され、コンピューティングパワーが強化されます。 2)ゲーム開発では、Cは物理エンジンとグラフィックスレンダリングを処理し、JavaScriptはゲームロジックとユーザーインターフェイスを担当します。

JavaScriptは、Webサイト、モバイルアプリケーション、デスクトップアプリケーション、サーバー側のプログラミングで広く使用されています。 1)Webサイト開発では、JavaScriptはHTMLおよびCSSと一緒にDOMを運用して、JQueryやReactなどのフレームワークをサポートします。 2)ReactNativeおよびIonicを通じて、JavaScriptはクロスプラットフォームモバイルアプリケーションを開発するために使用されます。 3)電子フレームワークにより、JavaScriptはデスクトップアプリケーションを構築できます。 4)node.jsを使用すると、JavaScriptがサーバー側で実行され、高い並行リクエストをサポートします。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

SublimeText3 中国語版
中国語版、とても使いやすい

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

ホットトピック









