ホームページ > ウェブフロントエンド > Vue.js > Vue の最も詳しい知識とメモ

Vue の最も詳しい知識とメモ

WBOY
リリース: 2021-12-20 11:14:59
転載
3768 人が閲覧しました

この記事は、Vue についての最も完全かつ詳細な知識を提供します。フロントエンドを理解してマスターするために、この記事が皆様のお役に立てば幸いです。

1. フロントエンドコア分析

1.1. 概要

Soc 原則: 懸念事項の分離原則

Vue コア ライブラリはビュー レイヤーのみに焦点を当てているため、サードパーティのライブラリや既存のプロジェクトと簡単に統合できます。

HTML CSS JS: ビュー: ユーザーに表示し、バックグラウンドで提供されたデータを更新します

ネットワーク通信: axios

ページジャンプ: vue-router

状態管理: vuex

Vue-UI: ICE、要素 UI

1.2、3 つのフロントエンド要素

  • HTML (構造): スーパー ハイパー テキスト マークアップ言語 (ハイパー テキスト マークアップ言語)、Web ページの構造とコンテンツを決定します。
  • CSS (パフォーマンス): カスケード スタイル シート (カスケーディング スタイル シート)、Web のプレゼンテーション スタイルを設定します。ページ。
  • JavaScript (動作): 弱い型指定のスクリプト言語です。そのソース コードはコンパイルする必要はありませんが、ブラウザによって解釈されて実行され、Web ページの動作を制御します。

1.3 ,構造層(HTML)

シンプルすぎるのでちょっと

1.4. プレゼンテーション層(CSS)

CSSカスケードスタイルシートはマークアップ言語であり、プログラミング言語ではないため、変数や参照などをカスタマイズできません。つまり、構文のサポートがありません。主な欠陥は次のとおりです:

  • ネストできないなど、構文が十分強力ではないため、モジュラー開発で多数の繰り返しセレクターを記述する必要が生じます;
  • 変数や合理的なスタイルの再利用メカニズムがないため、論理的に関連する属性が値をリテラル形式で繰り返し出力する必要があり、保守が困難です ;
    これにより、作業負荷が不当に増加しました。この問題を解決するために、フロントエンド開発者は [CSS プリプロセッサ] と呼ばれるツールを使用して、CSS にはないスタイル レイヤーの再利用メカニズムを提供し、冗長なコードを削減し、スタイル コードの保守性を向上させます。フロントエンドスタイルの開発効率が大幅に向上します。

CSS プリプロセッサとは

CSS プリプロセッサは、新しい言語を定義します。基本的な考え方は、特殊なプログラミングを使用することです。この言語は、CSS にいくつかのプログラミング機能を追加します。は CSS をターゲットとして使用してファイルを生成するため、開発者はこの言語を使用して CSS をコーディングするだけで済みます。分かりやすい言葉に直すと、「専用のプログラミング言語を使ってWebページのスタイルを設計し、それをコンパイラを通して通常のCSSファイルに変換してプロジェクトで使用する」という意味です。

一般的に使用される CSS プリプロセッサとは何ですか

  • SASS: Ruby に基づいており、サーバーを通じて処理されるため、強力です。高い分析効率。 Ruby 言語を学ぶ必要がありますが、LESS よりも始めるのが難しいです。
  • ##LESS: NodeJS に基づいており、クライアントを通じて処理され、使いやすいです。 SASSよりも機能がシンプルで、解析効率もSASSより低いですが、実際の開発では十分なので、バックエンド担当者が必要とする場合にはLESSを使用することをお勧めします。
1.5. 動作層 (JavaScript)

JavaScript は弱い型指定のスクリプト言語であり、そのソース コードはクライアントに送信して実行する前にコンパイルする必要はありません。テキスト形式に変換されます。 文字コードがブラウザに送信され、ブラウザによって解釈されて実行されます。

ネイティブ Native JS 開発

ネイティブ JS 開発とは、ES と呼ばれる [ECMAScript] の標準的な開発手法に準拠した開発を指し、すべてのブラウザがサポートしているのが特徴です。 。現時点では、ES 標準は次のバージョンをリリースしています:

    ES3
  • ES4 (内部向け、公式リリースではありません)
  • ES5 (完全なブラウザ サポート)
  • ES6 (一般的に使用されている、現在の主流バージョン: webpack パッケージが ES5 サポートになります)
  • ES7
  • ES8
  • ES9 (ドラフト段階)
違いは、新しい機能が徐々に追加されることです。


TypeScript Microsoft の標準 TypeScript は、Microsoft が開発した無料のオープンソース プログラミング言語です。これは JavaScript のスーパーセットであり、基本的にオプションの静的型付けとクラスベースのオブジェクト指向プログラミングを言語に追加します。 Anders Helsberg (C#、Delphi、TypeScript の父、.NET の創設者) が率いる。この言語の特徴は、ESの機能に加え、規格の範囲外の新機能も多く組み込んでいることであるため、多くのブラウザではTypeScript構文を直接サポートできず、コンパイル(JSへのコンパイル)が必要となります。ブラウザで正しく実行される前に。

JavaScript フレームワーク

  • JQuery: 有名な JavaScript ライブラリです。利点は、DOM 操作が簡素化されることです。欠点は、DOM 操作が頻繁すぎるため、フロントエンドのパフォーマンスに影響することです。フロントエンドから見ると、 IE6、7、および 8 と互換性があるためにのみ使用されます;
  • Angular: Google が買収したフロントエンド フレームワークは、Java プログラマーのグループによって開発されました。フロントエンドのバックグラウンドを継承し、モジュール開発の概念を追加します。Microsoft と協力し、TypeScript 構文開発を採用しています。バックエンド プログラマにとってはフレンドリーですが、フロントエンド プログラマにとってはフレンドリーではありません。最大の欠点は、バージョンの繰り返しが理不尽(第一世代→第二世代など、名前以外は基本的に2つ。ブログ公開時点ではAngular6が立ち上げられています)
  • React: Facebook制作、高性能 JS フロントエンド フレームワーク; 新しい概念 [仮想 DOM] を特徴としており、実際の DOM 操作を削減し、メモリ内で DOM 操作をシミュレートするために使用され、フロントエンド レンダリングの効率が効果的に向上します。追加の [JSX] 言語を学ぶ必要があるため、使用が複雑です;
  • Vue: プログレッシブ JavaScript フレームワーク、いわゆるプログレッシブとは、モジュール開発などの新機能の実装など、新しい機能を段階的に実装するための手段です。 、ルーティング、および状態管理。その特徴は、Angular (モジュール性) と React (仮想 DOM) の利点を組み合わせていることです;
  • Axios: フロントエンド通信フレームワーク; Vue の境界は非常に明確であるため、DOM を処理するため、通信機能はありません。現時点では、サーバーと対話するために追加の通信フレームワークを使用する必要があります。もちろん、jQuery が提供する AJAX 通信機能の使用を直接選択することもできます。

2. フロントエンド開発の歴史

##2.1. UI フレームワーク

    Ant-Design: Alibaba 製、React
  • ElementUI、iview をベースとした UI フレームワーク、ice: Ele.me によって作成され、Vue に基づく UI フレームワーク
  • BootStrap: Teitter
  • によって開始されたフロントエンド開発用のオープン ソース ツールキットAmazeUI: 「Meizi UI」とも呼ばれます。 HTML5 クロススクリーン フロントエンド フレームワーク
2.2、JavaScript 構築ツール

    Babel: JS コンパイル ツール。主にブラウザーでサポートされていない新しい ES 機能に使用されます。 TypeScript のコンパイルに使用されます
  • WebPack: モジュール パッケージャー、その主な機能はパッケージ化と圧縮、マージと順番のロードです
注: 上記のナレッジ ポイントは、必要なすべてのスキルを整理しています。 WebApp 開発の場合

2.3. 3 つの目的は同じです

ハイブリッド開発の主な目的(ハイブリッド アプリ)

はセットを実現することです3 つのエンドの統一コード (PC、Android: .apk、iOS: .ipa) を統合し、デバイスの基盤となるハードウェア (センサー、GPS、カメラなど) を呼び出すことができるようにするには、主に 2 つのパッケージ化方法があります。 :

    クラウド パッケージ化: HBuild -> HBuildX、DCloud によって作成; API Cloud
  • ローカル パッケージ化: Cordova (旧 PhoneGap)

WeChat ミニ プログラム

詳細については、WeChat 公式 Web サイトをご覧ください。WeChat ミニ プログラム UI 開発を容易にするフレームワークは次のとおりです: WeUI

2.4, バックエンド テクノロジー

フロントエンド担当者も、開発を容易にするために、特定のバックエンド テクノロジを習得する必要があります。ただし、当社の Java バックエンド担当者は、バックエンドの知識システムが非常に大きく複雑であることを知っています。フロントエンド担当者がバックエンド アプリケーションを開発するためには、Node JS のようなテクノロジーがあります。 Node JS の作者は、Node JS を放棄すると主張し (アーキテクチャがよくできておらず、重いノード モジュールが作者を不幸にする可能性があると述べています)、De no

の新しいアーキテクチャの開発を開始しました。バックグラウンド テクノロジを使用するには、フレームワークとプロジェクト管理ツールが必要です。Node JS フレームワークとプロジェクト管理ツールは次のとおりです:

    Express: Node JS Framework
  • Koa: Express simplifiedバージョン
  • NPM: Mavenに似たプロジェクト総合管理ツール
  • YARN: NPMの代替、MavenとGradleの関係に似ています
2.5、メインストリームフロント-end Framework

Vue.js

iView

iview は強力な Vue ベースの UI ライブラリであり、より豊富な実用的な基本コンポーネントが多数含まれていますエレメント ui よりも優れており、主に PC インターフェイスに対応しており、ミッドエンドおよびバックエンドの製品です。単一ファイルを使用する Vue コンポーネント開発モデルは、npm webpack babel に基づいて開発され、ES 2015 高品質で機能豊富で使いやすい API をサポートし、スペースを自由かつ柔軟に使用します。

    公式 Web サイトのアドレス
  • Github
  • iview-admin

注: メインストリームのフロントエンドに属します

Element UI

Element は Vue UI コンポーネントです。 Ele.me のフロントエンド オープン ソースによって維持され、完全なコンポーネントを備えたライブラリで、基本的にバックエンドに必要なすべてのコンポーネントをカバーしており、ドキュメントが詳細に説明されており、サンプルも豊富です。主に PC 側のページ開発に使用される、比較的高品質な Vue UI コンポーネント ライブラリです。

・公式Webサイトのアドレス
・Git Hub
・vue-element-admin

注: 主流のフロントエンドフレームワークに属しており、選択時に考慮することができます。デスクトップサポートが充実していること

ICE

Feibing は、React/Angular/Vue をベースとした Alibaba チームのミドルおよびバックエンド アプリケーション ソリューションです。 、ほぼすべての BU からの 270 以上のプロジェクトがすでに使用されています。 Feibing には、設計エンドから開発エンドまでの完全なリンクが含まれており、ユーザーが独自のミッドエンドおよびバックエンド アプリケーションを迅速に構築できるようにします。

  • 公式ウェブサイトのアドレス。

  • Git ハブ

注: 主要なコンポーネントは依然として React に基づいています。2019 年 2 月 17 日の時点では、ブログが更新されるまで Vue のサポートはまだ完了しておらず、まだサポートされていません。様子見段階

VantUI

Vant UI は、Youzan の統一仕様に基づいて Youzan のフロントエンド チームによって実装された Vue コンポーネント ライブラリであり、UI の基本的な完全なセットを提供します。コンポーネントとビジネスコンポーネント。 Vant を使用すると、統一されたスタイルのページを迅速に構築でき、開発効率が向上します。

  • 公式 Web サイトのアドレス
  • Github

AtUI

at-ui は Vue 2.x です。フロントエンド UI コンポーネント ライブラリ。主に PC ウェブサイト製品の迅速な開発に使用されます。 npm webpack babel フロントエンド開発ワークフローのセットを提供し、CSS スタイルは独立しており、異なるフレームワークが使用されている場合でも統一された UI スタイルを維持できます。
·公式ウェブサイトのアドレス
·Git Hub

Cube Ul

cube-ui は、Didi チーム ライブラリによって開発された Vue js に基づく優れたモバイル コンポーネントです。 。オンデマンドの導入とポストコンパイルをサポートし、軽量かつ柔軟で、強力な拡張性を備え、既存のコンポーネントに基づいた二次開発を簡単に実装できます。

    #公式 Web サイトのアドレス
  • Github

ハイブリッド開発

Flutter

Flutter は Google のモバイル UI フレームワークで、Android および iOS 上で高品質のネイティブ アプリケーションを非常に短時間で構築できます。 Flutter は既存のコードで動作し、世界中の開発者や組織によって使用されており、Flutter は無料でオープンソースです。

    公式 Web サイトのアドレス
  • Github

  • 備考: Google によって作成され、主な機能はネイティブ APP アプリケーションを迅速に構築することです。ハイブリッド アプリケーションを実行している場合は、これを使用してください。 Framework は必須のフレームワークです

lonic

lonic は CSS フレームワークと Javascript UI ライブラリの両方です。現在、Lonic が最も有望です。 HTML 5 モバイル アプリケーション開発フレームワーク。 SASS を通じてアプリケーションを構築します。SASS は、開発者が強力なアプリケーションを開発するのに役立つ多くの UI コンポーネントを提供します。 JavaScript MV VM フレームワークと Angular JS/Vue を使用してアプリケーションを強化します。データの双方向バインディングを提供し、Web 開発者やモバイル開発者にとってその使用が一般的な選択肢になります。

#公式 Web サイトのアドレス
  • ·公式 Web サイトのドキュメント
·Git ハブ


WeChat アプレット

mpvue

mpvue は、ミニ プログラムの開発に

Vue.js

を使用して Meituan によって開発されたフロントエンド フレームワークです。現在、WeChat ミニ プログラム、Baidu スマート ミニ プログラムをサポートしています。 、Toutiao ミニ プログラム、プログラム、Alipay アプレット。このフレームワークは Vue.js に基づいており、小規模なプログラム環境で実行できるように、変更されたランタイム フレームワーク runtime とコード コンパイラー compiler が実装されています。したがって、ミニ プログラム開発では Vue.js 開発経験が導入されます。 ·公式 Web サイトのアドレス ·Git ハブ

備考: 完全な Vue 開発経験があり、マルチプラットフォームの小規模プログラム開発をサポートしているため、
# を使用することをお勧めします。 ## WeUI

WeUI は、WeChat のネイティブなビジュアル エクスペリエンスと一致する基本的なスタイル ライブラリのセットであり、WeChat Web ページおよび WeChat ミニプログラム用に WeChat の公式デザイン チームによってカスタマイズされています。ユーザーの使用認識がより統一されます。ボタン、セル、ダイアログ、トースト、記事、アイコンなどのさまざまな要素が含まれています。

公式サイトアドレス

    Github
  • 3.前後分離の進化の歴史を理解する
なぜ前後分離なのか

3.1. バックエンド重視の MVC 時代

開発の複雑さを軽減するために、バックエンドが出発点となります。例: Struts、Spring の使用MVC およびその他のフレームワークはバックエンド MVC の時代です。

SpringMVC

プロセスを例にします:

  • フロントエンド コントローラーへのリクエストを開始します (Dispatcher Servlet)
  • フロントエンド コントローラー リクエストHandlerMappingFindHandler、次のことができます xml設定、注釈検索
  • プロセッサ マッパーHandlerMappingフロントエンド コントローラーに戻るHandler
  • フロント-end コントローラ 実行するプロセッサ アダプタを呼び出します Handler
  • 実行するプロセッサ アダプタHandler
  • Handlerアダプタに戻ります実行が完了するとModelAndView
  • プロセッサ アダプタは ModelAndView をフロントエンド コントローラに返します。ModelAndView は ## の基礎となるオブジェクトです。 #SpringMvc フレームワーク (Model および View
  • を含む) フロントエンド コントローラーは、ビュー パーサーにビュー解析の実行を要求し、実際のビューに解析します。論理ビュー名 (
  • JSP )
  • に従って、ビュー リゾルバーはビューのレンダリングのために
  • View
  • をフロントエンド コントローラーに返します。ビューのレンダリングにより、モデル データ (
  • ModelAndView オブジェクト Medium) が request ドメイン
  • に入力されます。フロントエンド コントローラーは結果をユーザーに応答します

  • 利点 MVC は、コードの結合を効果的に削減できる非常に優れたコラボレーション モデルであり、開発者はコードをアーキテクチャ的にどこに記述すべきかを理解できます。ビューをより純粋にするために、Thyme リーフや Free マーカーなどのテンプレート エンジンを使用して、テンプレートに Java コードが記述されるのを防ぎ、フロント エンドとバック エンドの分業を明確にすることもできます。

    デメリット
  • フロントエンド開発は開発環境への依存度が高く、開発効率が低い このアーキテクチャでは、フロントエンドとバックエンドの2つのモードが存在します。コラボレーション:
    • 最初は、フロントエンドでデモを作成し、作成した後、バックエンドにテンプレートを適用させます。利点は、デモをローカルで開発でき、非常に効率的であることです。欠点は、バックエンドでテンプレートを適用する必要があり、それが間違っている可能性があり、適用完了後にフロントエンドで確認する必要があり、往復の通信と調整のコストが比較的かかることです。 high;
    • もう 1 つのコラボレーション モデルは、フロントエンドがブラウザー側のすべての開発と開発を担当するというもので、サーバー側のビュー レイヤー テンプレートの開発です。利点は、UI 関連のコードをフロントエンドで記述でき、バックエンドにあまり注意を払う必要がないことですが、欠点は、フロントエンド開発がバックエンド環境に大きく束縛されることです。そして環境はフロントエンド開発の効率に影響を与える重要な要素となっています。
  • フロントエンドとバックエンドの責任は絡み合っています。テンプレート エンジンは強力であり、取得したコンテキスト変数を通じてさまざまなビジネス ロジックを実装できます。このように、フロントエンドが弱い限り、バックエンドはテンプレート層に多くのビジネスコードを記述する必要があることが多く、コントローラーにも大きなグレーゾーンが存在します。フロントエンドが最も懸念すべきことですが、実際にはバックエンドによって実装されます。 Controller本体とModelは絡み合っていることが多く、Controller層には歯を食いしばるような業務コードが登場することが多い。これらの問題のすべてがプログラマの品質に起因するわけではありません。そうでない場合は、JSP で十分です。
  • フロントエンドの制限: パフォーマンスの最適化がフロントエンドのみで行われる場合、スペースが非常に限られているため、多くの場合バックエンドの協力が必要になります。最後のフレームワークでは、[Comet] と [Big Pipe] ] やその他の技術的ソリューションを使用してパフォーマンスを最適化することは困難です。

  • 注: 初期の JSP と PHP を含むこの期間 (2005 年以前) は、Web 1.0 時代と呼ぶことができます。ここで言いたいのですが、もしあなたが Java 初心者なら、JSP などの古いテクノロジーを真剣に考えるのはやめてください。時代は変化し、テクノロジーは変化し、すべてが変化しているからです (ザッカーバーグの名言: 唯一不変のもの大学に実習に行くと、「有益な情報を何も話さない」と思われる学生もいるかもしれませんが、実際にはそうではなく、あなたの中にある有益な情報は「有益な情報」であるとしか言えません。コグニションは市場にとって有益です。それは長い間時代遅れだっただけです
3.2. AJAX に基づく SPA 時代

時は 2005 年に遡ります。 OAX (Asynchronous JavaScript And XML、非同期 JavaScript と XML、古い技術、新しい使い方) が正式に提案され、CDN が静的リソース ストレージとして使用され始めたため、JavaScript の王の復活が現れました (これ以前は、JS が使用されていました) Web ページに犬の皮膚絆創膏の広告を掲載) SPA (Single Page Application) シングル ページ アプリケーションの時代。



利点 このモードでは、**フロントエンドとバックエンドの間の役割分担が非常に明確であり、フロントエンドとバックエンド間の重要なコラボレーションポイントになります。 AJAXインターフェイスです。 **とても素晴らしいように見えますが、振り返ってみると、JSP の時代とあまり変わりません。複雑さはサーバー側の JSP からブラウザーの JavaScript に移り、ブラウザー側は非常に複雑になりました。 Spring MVC と同様に、
この時代、ブラウザ側の階層化されたアーキテクチャが現れ始めています:
デメリット

  • フロントエンドとバックエンドのインターフェースに関する規約: バックエンドのインターフェースが混乱していて、バックエンドのビジネス モデルが十分に安定していない場合は、フロントエンド開発は非常に骨の折れる作業となるため、多くのチームがインターフェイス ルール、インターフェイス プラットフォーム、その他の方法で同様の試みを行っています。 バックエンドと合わせてインターフェイスルールを生成することで、データのシミュレーションにも使用できるため、フロントエンドとバックエンドがインターフェイスを合意した上で効率的な並行開発を実現できます。
  • フロントエンド開発の複雑さの制御: SPA アプリケーションはほとんどが機能的で対話型であり、JavaScript コードが 100,000 行を超えるのは通常です。大量の JS コードの整理、View レイヤーへのバインドなどは簡単な作業ではありません。

3.3. フロントエンドベースの MV* 時代

ここでの MV* モデルは次のとおりです:

  • MVC (主に同期通信): Model、View、Controller
  • MVP (主に非同期通信): Model、View、Presenter
  • MVVM (主に非同期通信): Model、View、View Model フロントの複雑さを軽減するため-エンド開発、Angular JSReactVue.jsEmber JS など、多数のフロントエンド フレームワークが登場しています。 など。これらのフレームワークは一般に、以下に示すように、まずテンプレート、コントローラー、モデルなどのタイプごとに階層化してから、レイヤー内をセグメント化することを原則としています。

利点

##フロントエンドとバックエンドの責任は非常に明確です: フロントエンドはブラウザ側で動作します、バックエンドはサーバー側で動作します。明確な分業により並行開発が可能になり、テストデータのシミュレーションは難しくなく、フロントエンドはローカルで開発できます。バックエンドはビジネス ロジックの処理に集中し、RESTful インターフェイスやその他のインターフェイスを出力できます。

  • フロントエンド開発の複雑さは制御可能です: フロントエンド コードは重いですが、適切な階層化によりフロントエンド コードがその役割を実行できます。これは非常に興味深いもので、テンプレート機能の選択と同じくらい簡単ですが、注意すべき詳細がたくさんあります。強力であればあるほど良い、どのような制限があるのか​​、どのような自由が残されているのか、コードはどのように編成されるべきなのか、これらすべての設計を説明するには一冊の本が必要になります。
  • デプロイメントは比較的独立しています: 製品エクスペリエンスをすぐに向上させることができます。 欠点
  • コードは再利用できません。たとえば、バックエンドは依然としてデータに対してさまざまな検証を実行する必要があり、検証ロジックはブラウザ側のコードを再利用できません。再利用できる場合、バックエンドのデータ検証は比較的簡単になります。
  • 完全に非同期なので、SEO に悪影響を及ぼします。多くの場合、サーバー側で同期レンダリングのためのダウングレード ソリューションを実装することが必要になります。
  • パフォーマンスは、特にモバイル インターネット環境では最高ではありません。
  • SPA はすべてのニーズを満たすことはできず、複数ページのアプリケーションが依然として多数存在します。 URL の設計にはバックエンドの協力が必要であり、フロントエンドで完全に制御することはできません。
  • 3.4. Node JS がもたらしたフルスタック時代
  • フロントエンドに焦点を当てた MV* モデルは非常に多くの問題を解決しましたが、上で述べたように、まだ課題が残っています。多くの欠点があります。 Node JS の台頭により、JavaScript がサーバー側で実行できるようになりました。これは、新しい R&D モデルが存在する可能性があることを意味します。

この R&D モデルでは、フロント エンドとバック エンドの責任が明確です。フロントエンドの場合、2 つの UI レイヤーがそれぞれの役割を実行します。

  • フロントエンド Ul 層は、ブラウザ層の表示ロジックを処理します。アプリケーションのシナリオに応じて、CSS を介してスタイルをレンダリングし、JavaScript を介してインタラクティブな機能を追加し、HTML 生成もこのレイヤーに配置できます。
  • バックエンド Ul レイヤーは、ルーティング、テンプレート、データ取得、Cookie などを処理します。ルーティングにより、最終的にはフロントエンドが独立して URL 設計を制御できるようになり、シングルページアプリケーションでもマルチページアプリケーションでもフロントエンドが自由に制御できるようになります。バックエンドは最終的に、プレゼンテーションへの強い重点から解放され、代わりにビジネス ロジック層の開発に集中できるようになります。
    Node を介して、WebServer レイヤーも JavaScript コードです。つまり、一部のコードは前後で再利用できます。SEO が必要なシーンは、サーバー側で同期的にレンダリングできます。非同期リクエストが多すぎることによって引き起こされるパフォーマンスの問題も発生する可能性があります。サーバー側で軽減されます。前モデルの欠点は、このモデルによってほぼ完全に解決されます。
    JSP モードと比較すると、フルスタック モードは回帰のように見え、確かに元の開発モデルへの回帰ですが、スパイラル回帰です。
    Node JS に基づくフルスタック モデルは依然として多くの課題に直面しています。
  • フロントエンドはサーバーサイド プログラミングをより深く理解する必要があります。例えば、TCP/IPなどのネットワーク知識の習得。
  • Node JS 層と Java 層間の効率的な通信。 Node JS モードでは、すべてがサーバー側にあり、RESTful HTTP 通信は効率的ではない可能性があります。SOAP などのメソッドを介した通信の方が効率的です。すべてを検証する必要があります。
  • 部門と運用および保守レベルを十分に理解するには、より多くの知識と実践的な経験が必要です。
  • 多数の歴史的問題を移行する方法。おそらくこれが最大の障害です。
    注: これを見れば、私が授業でいつも言う理由を多くの生徒が理解できると思います。「フロントエンドがバックエンドを学ぶのは難しいが、私たちバックエンドにとっては簡単です」プログラマーは何でも学ぶことができます。これは、バックエンド プログラマーが比較的完全な知識システムを持っているためです。
    フルスタック! とても簡単!

3.5. 概要

要約すると、モデルであろうとテクノロジーであろうと、良いか悪いかの区別はありません。適切かどうかだけで、フロントエンドとバックエンドの分離という開発思想は主にSoc(関心事分離の原則)に基づいています。フロントエンドとバックエンドの区別がより明確になり、分業がより合理的かつ効率的になります。

4. 最初の Vue プログラム

4.1. MVVM とは

MVVM (Model-View-ViewModel) は、Microsoft WPF によって開発されたソフトウェア デザイン パターンです (Developed by を使用)アーキテクトの Ken Cooper と Ted Peters が、過去にデスクトップ アプリケーションの開発に使用されていた WinForm と Silverlight (Java アプレットに似ており、簡単に言うとブラウザ上で WPF を実行します) を置き換えるために開発された、簡素化されたユーザー インターフェイスです。 ## イベント駆動型プログラミングのアプローチ 。 John Gossman (WPF および Silverlight のアーキテクトでもある) によって 2005 年にブログで公開されました。

MVVM は、古典的な MVC (モデル-ビュー-コントローラー) パターンから派生したものです。 MVVM の中核となるのは ViewModel レイヤーです。これは、モデル内のデータ オブジェクトを変換して、データの管理と使用を容易にする役割を果たします。その機能は次のとおりです。

    この層は、上向きのビュー層と双方向のデータ バインディングを実行します
  • 下向きのインターフェイス リクエストを通じてモデル層と対話します

MVVM は非常に成熟しており、主にネットワーク アプリケーション開発のみに使用されません。現在、人気のある MVVM フレームワークには、

Vue.jsAnfular JS

4.2 が含まれています。MVVM

を使用する理由 MVVM モードは次と同じです。 MVC モード (主な目的はビュー (View) とモデル (Model) を分離することです。いくつかの利点があります。

  • 低結合: ビュー (View) は次のことができます。モデルとは独立して変更および修正でき、ビューモデルは異なるビューにバインドでき、ビューが変更されてもモデルは変更されず、モデルが変更されてもビューは変更されません。
  • 再利用可能: ViewModel にいくつかのビュー ロジックを配置し、多くのビューでこのビュー ロジックを再利用できます。
  • 独立開発: 開発者はビジネス ロジックとデータ (ViewMode) の開発に集中でき、デザイナーはページのデザインに集中できます。
  • テスト可能: インターフェイスのテストは常に困難でしたが、現在では ViewModel のテストを作成できます。

# (1) View

View はビュー層であり、ユーザー インターフェイスです。フロントエンドは主に HTH L と csS によって構築されており、vi eu から del または hodel 層のデータをより便利に表示するために、さまざまなフロントエンドおよびバックエンドのテンプレート言語が作成されています。 FreeMarker、Thyme Leaf など、Vue.js、Angular JS、EJS などの主要な MV VM フレームワークにも、ユーザー インターフェイスを構築するための独自の組み込みテンプレート言語があります。

(2) モデル

モデルとはデータモデルのことであり、主にデータベースを中心にバックエンドで行われるさまざまなビジネスロジックの処理やデータ操作のことを指します。システム。ここでの難しさは主に、フロントエンドとの統一インターフェイス規則について合意する必要があることにあります

(3) ViewModel

ViewModel は、フロントエンド開発者組織によって生成および維持されるビュー データ レイヤーです。この層では、フロントエンド開発者がバックエンドから取得したモデル データを変換し、二次カプセル化を実行して、ビュー層の期待を満たすビュー データ モデルを生成します。
ビュー モデルによってカプセル化されたデータ モデルにはビューの状態と動作が含まれるのに対し、モデル層のデータ モデルには状態のみが含まれることに注意してください。

  • たとえば、次のようになります。ページのこの部分が表示されます。その領域に何が表示されますか。これらはすべてビュー ステート (表示) に属します。
  • ページが読み込まれたときに何が起こるか、この領域がクリックされたときに何が起こるか、いつ起こるかこの領域はスクロールされ、これらはすべてビューの動作 (インタラクション) に属します。

ビューの状態と動作はビュー モデルにカプセル化されます。この種のカプセル化により、ビュー モデルでビュー レイヤーを完全に記述することができます。双方向バインディングの実装により、ビュー モデルのコンテンツはリアルタイムでビュー レイヤーに表示されます。これは、フロントエンド開発者が DOM を操作して非効率的かつ面倒なビューを更新する必要がなくなるため、非常に興味深いことです。
MVVM フレームワークは、最も汚くて最も面倒な部分をすでに処理しています。開発者はビュー モデルを処理して保守するだけで済みます。データ ビューが更新されると、それに応じて自動的に更新されるため、本当に が実現されます。イベント駆動型プログラミング
View レイヤーは、Model レイヤーのデータではなく、ViewModel のデータを表示します。ViewModel は、 Model レイヤー。この は、ビュー レイヤーとモデル レイヤーを完全に分離します。この分離は非常に重要です。これは、フロントエンドとバックエンドの分離ソリューションの実装の重要な部分です。

4.3、Vue

Vue (/vju/ と発音、ビューに似ています) は、2014 年 2 月にリリースされた、ユーザー インターフェイスを構築するための進歩的なフレームワークです。他の大きなフレームワークとは異なり、Vue は下から上にレイヤーごとに適用されるように設計されています。 Vue のコア ライブラリはビュー レイヤーのみに焦点を当てており、開始が簡単であるだけでなく、サードパーティのライブラリ (vue-router、vue-resource、vue x など) や既存のプロジェクトとの統合も簡単です。

(1) MVVM パターンの実装者

  • Model: モデル層、ここでは JavaScript オブジェクトを表します
  • View: ビュー層、ここにありますDOM (HTML 操作の要素) を表します
  • ViewModel: ビューとデータを接続するミドルウェア Vue.js は MVVM

の View Model レイヤーの実装者ですMVVM アーキテクチャでは、データとビューは直接通信できません。それらは ViewModel を通じてのみ通信できます。View Model はオブザーバーを定義します。

  • ViewModel はデータの変更を監視し、ビューを監視できます。更新対応するコンテンツ
  • ViewModel はビューの変更を監視し、変更をデータに通知できます

この時点で、Vue.js が MV VM またはそのコアの実装であることがわかります。 DOM モニタリングとデータ バインディングを実装することです

(2) Vue.js を使用する理由

  • 軽量かつ小さいサイズは重要な指標です。 Vue.js は圧縮後 20 kb しかありません (Angular は圧縮後 56 kb、React は圧縮後 44 kb)
  • モバイルファースト。モバイル端末の Touch イベントなど、モバイル端末により適しています。
  • 使いやすく、学習曲線がスムーズで、ドキュメントが充実しています。
  • Angular (モジュール性) と React (仮想化) の長所を吸収しています。 DOM)、次のような独自のユニークな機能を備えています: 計算されたプロパティ
  • オープンソース、活発なコミュニティ活動

4.4、最初の Vue プログラム

[説明] IDEA は Vue プラグインをインストールできます!
注: Vue は、IE 8 ではエミュレートできない ECMAScript 5 機能を使用するため、IE 8 以下をサポートしません。ただし、ECMAScript 5 と互換性のあるすべてのブラウザをサポートしています。

(1) ダウンロード アドレス

  • 開発バージョン
    • 完全な警告モードとデバッグ モードが含まれています: https://yuejs.org/js /vue.js
    • 警告を削除、最小 gzip 30.96KB: https://vuejs.org/js/vue.min.js
  • CDN

(2) コードの記述##Vue.js の核心は MVVM パターンの実装であり、彼女の役割は View Model 層です。 . したがって、いわゆる最初のアプリケーションは、彼女のデータ バインディング関数を表示することです。操作プロセスは次のとおりです:

1. HTML ファイル

nbsp;html>
    <meta>
    <title>Title</title>
ログイン後にコピー

2 を作成します。 Vue .js

<!--1.导入Vue.js--><script></script>12
ログイン後にコピー

3 を導入します。Vue インスタンスを作成します

<script>
    var vm = new Vue({
        el:"#app",
        /*Model:数据*/
        data:{
            message:"hello,vue!"
        }
    });</script>
ログイン後にコピー
手順:

    #el: '# vue '
  • : バインドされた要素の ID
  • data:{message:'Hello Vue!'}
  • : データ オブジェクトには message という名前のプロパティがあり、初期値は値が設定されています Hello Vue!
  • 4. ページ要素にデータをバインドする
<!--view层,模板--><p>
    {{message}}</p>
ログイン後にコピー

手順: Vue で作成した message 属性をバインド要素内で二重中括弧で囲むだけでデータバインディング機能が実現できます。と、ビューモデル層で必要な効果が得られますが、ELの表現とよく似ていますか?

(3) HTMLの完成

nbsp;html>
    <meta>
    <title>Title</title><!--view层,模板--><p>
    {{message}}</p><script></script><script>
    var vm = new Vue({
        el:"#app",
        /*Model:数据*/
        data:{
            message:"hello,vue!"
        }
    });</script>
ログイン後にコピー

(4)テスト

为了能够更直观的体验Vue带来的数据绑定功能, 我们需要在浏览器测试一番, 操作流程如下:
  1、在浏览器上运行第一个Vue应用程序, 进入开发者工具
  2、在控制台输入vm.message=‘HelloWorld’, 然后回车, 你会发现浏览器中显示的内容会直接变成HelloWorld
  此时就可以在控制台直接输入vm.message来修改值, 中间是可以省略data的, 在这个操作中, 我并没有主动操作DOM, 就让页面的内容发生了变化, 这就是借助了Vue的数据绑定功能实现的; MV VM模式中要求View Model层就是使用观察者模式来实现数据的监听与绑定, 以做到数据与视图的快速响应。

五、基础语法指令

4.1、v-bind

我们已经成功创建了第一个Vue应用!看起来这跟渲染一个字符串模板非常类似, 但是Vue在背后做了大量工作。现在数据和DOM已经被建立了关联, 所有东西都是响应式的。我们在控制台操作对象属性,界面可以实时更新!
  我们还可以使用v-bind来绑定元素特性!
  上代码

nbsp;html>
    <meta>
    <title>Title</title>

         鼠标悬停几秒钟查看此处动态绑定的提示信息!  

<script></script><script> var vm = new Vue({ el:"#app", /*Model:数据*/ data:{ message: &#39;页面加载于 &#39; + new Date().toLocaleString() } });</script>
ログイン後にコピー

你看到的v-bind等被称为指令。指令带有前缀v以表示它们是Vue提供的特殊特性。可能你已经猜到了, 它们会在渲染的DOM上应用特殊的响应式行为在这里,该指令的意思是:“将这个元素节点的title特性和Vue实例的message属性保持一致”。
  如果你再次打开浏览器的JavaScript控制台, 输入app, message=‘新消息’,就会再一次看到这个绑定了title特性的HTML已经进行了更新。

4.2、v-if, v-else

什么是条件判断语句,就不需要我说明了吧,以下两个属性!

  • v-if
  • v-else

上代码

nbsp;html>
    <meta>
    <title>Title</title><p>
    </p>

Yes

    

No

   
ログイン後にコピー

<script></script><script> var vm = new Vue({ el:"#app", /*Model:数据*/ data:{ type: true } });</script>

测试:
1.在浏览器上运行,打开控制台!
2.在控制台输入vm.ok=false然后回车,你会发现浏览器中显示的内容会直接变成NO
  注:使用v-*属性绑定数据是不需要双花括号包裹的

v-else-if

  • v-if
  • v-else-if
  • v-else
    注:===三个等号在JS中表示绝对等于(就是数据与类型都要相等)上代码:
nbsp;html>
    <meta>
    <title>Title</title><p>
    </p>

A

    

B

    

D

    

C

ログイン後にコピー

<script></script><script> var vm = new Vue({ el:"#app", /*Model:数据*/ data:{ type: &#39;A&#39; } });</script>

4.3、v-for

  • v-for

格式说明

<p>
    </p>
ログイン後にコピー
  •         {{item.message}}---{{index}}    
  • 123456

    注:items是数组,item是数组元素迭代的别名。我们之后学习的Thymeleaf模板引擎的语法和这个十分的相似!
      上代码:

    nbsp;html>
        <meta>
        <title>Title</title><p>
        </p>
    ログイン後にコピー
  •         {{item.message}}---{{index}}    
  • <script></script><script> var vm = new Vue({ el:"#app", /*Model:数据*/ data:{ items:[ {message:&#39;狂神说Java&#39;}, {message:&#39;狂神说前端&#39;}, {message:&#39;狂神说运维&#39;} ] } });</script>

    测试:在控制台输入vm.items.push({message:'狂神说运维'}),尝试追加一条数据,你会发现浏览器中显示的内容会增加一条狂神说运维.

    4.4、v-on

    v-on监听事件
     emsp;事件有Vue的事件、和前端页面本身的一些事件!我们这里的click是vue的事件, 可以绑定到Vue中的methods中的方法事件!
      上代码

    nbsp;html>
        <meta>
        <title>Title</title>

        

    <script></script><script> var vm = new Vue({ el:"#app", data:{ message:&#39;Hello World&#39; }, methods:{ sayHi:function(event){ //&#39;this&#39;在方法里面指向当前Vue实例 alert(this.message); } } });</script>
    ログイン後にコピー

    点击测试
      Vue还有一些基本的使用方式, 大家有需要的可以再跟着官方文档看看, 因为这些基本的指令几乎我们都见过了,一通百通!掌握学习的方式!

    六、表单双绑、组件

    6.1、什么是双向数据绑定

    Vue.js是一个MV VM框架, 即数据双向绑定, 即当数据发生变化的时候, 视图也就发生变化, 当视图发生变化的时候,数据也会跟着同步变化。这也算是Vue.js的精髓之处了。
      值得注意的是,我们所说的数据双向绑定,一定是对于UI控件来说的非UI控件不会涉及到数据双向绑定。单向数据绑定是使用状态管理工具的前提。如果我们使用vue x那么数据流也是单项的,这时就会和双向数据绑定有冲突。

    (1)为什么要实现数据的双向绑定

    Vue.js中,如果使用vuex, 实际上数据还是单向的, 之所以说是数据双向绑定,这是用的UI控件来说, 对于我们处理表单, Vue.js的双向数据绑定用起来就特别舒服了。即两者并不互斥,在全局性数据流使用单项,方便跟踪;局部性数据流使用双向,简单易操作。

    6.2、在表单中使用双向数据绑定

    你可以用v-model指令在表单、及元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。尽管有些神奇, 但v-model本质上不过是语法糖。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。
      注意:v-model会忽略所有表单元素的valuecheckedselected特性的初始值而总是将Vue实例的数据作为数据来源。你应该通过JavaScript在组件的data选项中声明初始值!

    (1)单行文本

    nbsp;html>
        <meta>
        <title>Title</title>

        输入的文本:{{message}}

    <script></script><script> var vm = new Vue({ el:"#app", data:{ message:"" } });</script>
    ログイン後にコピー

    (2)多行文本

    nbsp;html>
        <meta>
        <title>Title</title>

       多行文本:  多行文本是:{{pan}}

    <script></script><script> var vm = new Vue({ el:"#app", data:{ message:"Hello hello!" } });</script>
    ログイン後にコピー

    (3)单复选框

    nbsp;html>
        <meta>
        <title>Title</title>

        单复选框:                

    <script></script><script> var vm = new Vue({ el:"#app", data:{ checked:false } });</script>
    ログイン後にコピー

    4多复选框

    nbsp;html>
        <meta>
        <title>Title</title>

        多复选框:                                                       选中的值:{{checkedNames}}

    <script></script><script> var vm = new Vue({ el:"#app", data:{ checkedNames:[] } });</script>
    ログイン後にコピー

    (6)单选按钮

    nbsp;html>
        <meta>
        <title>Title</title>

        单选框按钮                        选中的值:{{picked}}

    <script></script><script> var vm = new Vue({ el:"#app", data:{ picked:&#39;Two&#39; } });</script>
    ログイン後にコピー

    (7)下拉框

    nbsp;html>
        <meta>
        <title>Title</title>

        下拉框:         value:{{pan}}

    <script></script><script> var vm = new Vue({ el:"#app", data:{ pan:"A" } });</script>
    ログイン後にコピー

    注意:v-model表达式的初始值未能匹配任何选项,元系将被渲染为“未选中”状态。 在iOS中, 这会使用户无法选择第一个选项,因为这样的情况下,iOS不会触发change事件。因此,更推荐像上面这样提供一个值为空的禁用选项。

    6.3、什么是组件

    组件是可复用的Vue实例, 说白了就是一组可以重复使用的模板, 跟JSTL的自定义标签、Thymelealth:fragment等框架有着异曲同工之妙,通常一个应用会以一棵嵌套的组件树的形式来组织:

    例如,你可能会有页头、侧边栏、内容区等组件,每个组件又包含了其它的像导航链接、博文之类的组件。

    (1)第一个Vue组件

    注意:在实际开发中,我们并不会用以下方式开发组件,而是采用vue-cli创建,vue模板文件的方式开发,以下方法只是为了让大家理解什么是组件。
      使用Vue.component()方法注册组件,格式如下:

    <p>
      <pan></pan></p><script></script><script>
        //先注册组件
        Vue.component("pan",{
            
            template:&#39;<li>Hello&#39;
    
        });
        //再实例化Vue
        var vm = new Vue({
            el:"#app",
        });</script>
    ログイン後にコピー

    说明:

    • Vue.component():注册组件
    • pan:自定义组件的名字
    • template:组件的模板

    (2)使用props属性传递参数

    像上面那样用组件没有任何意义,所以我们是需要传递参数到组件的,此时就需要使用props属性了!
      注意:默认规则下props属性里的值不能为大写;

    nbsp;html>
        <meta>
        <title>Title</title>

           

    <script></script><script> //定义组件 Vue.component("pan",{ props:[&#39;panh&#39;], template:&#39;<li>{{panh}}&#39; }); var vm = new Vue({ el:"#app", data:{ items:["java","Linux","前端"] } });</script>
    ログイン後にコピー

    说明

    • v-for="item in items":遍历Vue实例中定义的名为items的数组,并创建同等数量的组件
    • v-bind:panh="item":将遍历的item项绑定到组件中props定义名为item属性上;= 号左边的panhprops定义的属性名,右边的为item in items 中遍历的item项的值

    七、Axios异步通信

    7.1、什么是Axios

    Axios是一个开源的可以用在浏览器端和Node JS的异步通信框架, 她的主要作用就是实现AJAX异步通信,其功能特点如下:

    • 从浏览器中创建XMLHttpRequests
    • 从node.js创建http请求
    • 支持Promise API[JS中链式编程]
    • 拦截请求和响应
    • 转换请求数据和响应数据
    • 取消请求
    • 自动转换JSON数据
    • 客户端支持防御XSRF(跨站请求伪造)

    GitHub:https://github.com/axios/axios
      中文文档:http://www.axios-js.com/

    7.2、为什么要使用Axios

    由于Vue.js是一个视图层框架并且作者(尤雨溪) 严格准守SoC(关注度分离原则)所以Vue.js并不包含AJAX的通信功能, 为了解决通信问题, 作者单独开发了一个名为vue-resource的插件, 不过在进入2.0版本以后停止了对该插件的维护并推荐了Axios框架。少用jQuery, 因为它操作Dom太频繁!

    7.3、第一个Axios应用程序

    咱们开发的接口大部分都是采用JSON格式, 可以先在项目里模拟一段JSON数据, 数据内容如下:创建一个名为data.json的文件并填入上面的内容, 放在项目的根目录下

    {
      "name": "狂神说Java",
      "url": "https://blog.kuangstudy.com",
      "page": 1,
      "isNonProfit": true,
      "address": {
        "street": "含光门",
        "city": "陕西西安",
        "country": "中国"
      },
      "links": [
        {
          "name": "bilibili",
          "url": "https://space.bilibili.com/95256449"
        },
        {
          "name": "狂神说Java",
          "url": "https://blog.kuangstudy.com"
        },
        {
          "name": "百度",
          "url": "https://www.baidu.com/"
        }
      ]}
    ログイン後にコピー

    测试代码

    nbsp;html>
        <meta>
        <title>Title</title>
        
        <p>
        </p>

    地名:{{info.name}}

        

    地址:{{info.address.country}}--{{info.address.city}}--{{info.address.street}}

        

    链接:{{info.url}} 

    <script></script><script></script><script> var vm = new Vue({ el:"#vue", //data:属性:vm data(){ return{ info:{ name:null, address:{ country:null, city:null, street:null }, url:null } } }, mounted(){//钩子函数 axios .get(&#39;data.json&#39;) .then(response=>(this.info=response.data)); } });</script>
    ログイン後にコピー

    说明:

    1. 在这里使用了v-bind将a:href的属性值与Vue实例中的数据进行绑定
    2. 使用axios框架的get方法请求AJAX并自动将数据封装进了Vue实例的数据对象中
    3. 我们在data中的数据结构必须和Ajax响应回来的数据格式匹配!

    7.4、Vue的生命周期

    官方文档:https://cn.vuejs.org/v2/guide/instance.html#生命周期图示
      Vue实例有一个完整的生命周期,也就是从开始创建初女台化数据、编译模板、挂载DOM、渲染一更新一渲染、卸载等一系列过程,我们称这是Vue的生命周期。通俗说就是Vue实例从创建到销毁的过程,就是生命周期。
      在Vue的整个生命周期中,它提供了一系列的事件,可以让我们在事件触发时注册JS方法,可以让我们用自己注册的JS方法控制整个大局,在这些事件响应方法中的this直接指向的是Vue的实例。

    八、计算属性、内容分发、自定义事件

    1、什么是计算属性

    计算属性的重点突出在属性两个字上(属性是名词),首先它是个属性其次这个属性有计算的能力(计算是动词),这里的计算就是个函数:简单点说,它就是一个能够将计算结果缓存起来的属性(将行为转化成了静态的属性),仅此而已;可以想象为缓存!
      上代码

    nbsp;html>
        <meta>
        <title>Title</title><p>
        </p>

    currentTime1:{{currentTime1()}}

        

    currentTime2:{{currentTime2}}

    <script></script><script> var vm = new Vue({ el:"#app", data:{ message:"pan" }, methods:{ currentTime1:function(){ return Date.now();//返回一个时间戳 } }, computed:{ currentTime2:function(){//计算属性:methods,computed方法名不能重名,重名之后,只会调用methods的方法 this.message; return Date.now();//返回一个时间戳 } } });</script>
    ログイン後にコピー

    注意:methods和computed里的东西不能重名
    说明:

    • methods:定义方法, 调用方法使用currentTime1(), 需要带括号

    • computed:定义计算属性, 调用属性使用currentTime2, 不需要带括号:this.message是为了能够让currentTime2观察到数据变化而变化

    • 如何在方法中的值发生了变化,则缓存就会刷新!可以在控制台使用vm.message=”q in jiang", 改变下数据的值,再次测试观察效果!

      结论:
        调用方法时,每次都需要讲行计算,既然有计算过程则必定产生系统开销,那如果这个结果是不经常变化的呢?此时就可以考虑将这个结果缓存起来,采用计算属性可以很方便的做到这点,计算属性的主要特性就是为了将不经常变化的计算结果进行缓存,以节约我们的系统开销;

    8.2、内容分发

    Vue.js中我们使用<slot></slot>元素作为承载分发内容的出口,作者称其为插槽,可以应用在组合组件的场景中;

    测试

    比如准备制作一个待办事项组件(todo) , 该组件由待办标题(todo-title) 和待办内容(todo-items)组成,但这三个组件又是相互独立的,该如何操作呢?
      第一步定义一个待办事项的组件

    <p>
        <todo></todo></p><!--1.导入Vue.js--><script></script><script>
        Vue.component(&#39;todo&#39;,{
            template:&#39;<p>\
                    <p>代办事项\
                    <ul>\
                        <li>学习狂神说Java\
                    \
                &#39;
        })</script>
    ログイン後にコピー

    第二步 我们需要让,代办事项的标题和值实现动态绑定,怎么做呢?我们可以留一个插槽!
      1-将上面的代码留出一个插槽,即slot

     Vue.component('todo',{
            template:'<p>\                <slot></slot>\                </p>
    ログイン後にコピー
      \                    <slot></slot>\                
    \            '     });

    2-定义一个名为todo-title的待办标题组件 和 todo-items的待办内容组件

    Vue.component('todo-title',{
            props:['title'],
            template:'<p>{{title}}</p>'
        });
       12345//这里的index,就是数组的下标,使用for循环遍历的时候,可以循环出来!
        Vue.component("todo-items",{
            props:["item","index"],
            template:"
    ログイン後にコピー
  • {{index+1}},{{item}}
  • "     });

    3-实例化Vue并初始化数据

     var vm = new Vue({
            el:"#vue",
            data:{
                todoItems:['test1','test2','test3']
            }
        });
    ログイン後にコピー

    4-将这些值,通过插槽插入

    <p>
        <todo>
            <todo-title></todo-title>
            <!--<todo-items slot="todo-items" v-for="{item,index} in todoItems" v-bind:item="item"></todo-items>-->
            <!--如下为简写-->
            <todo-items></todo-items>    </todo></p>
    ログイン後にコピー

    说明:我们的todo-title和todo-items组件分别被分发到了todo组件的todo-title和todo-items插槽中
      完整代码如下:

    nbsp;html>
        <meta>
        <title>Title</title><p>
        <todo>
            <todo-title></todo-title>
            <!--<todo-items slot="todo-items" v-for="{item,index} in todoItems" v-bind:item="item"></todo-items>-->
            <!--如下为简写-->
            <todo-items></todo-items>    </todo></p><script></script><script>
        Vue.component(&#39;todo&#39;,{
            template:&#39;<p>\
                    <slot name="todo-title">\
                    <ul>\
                        <slot name="todo-items">\
                    \
                &#39;
        });
        Vue.component(&#39;todo-title&#39;,{
            props:[&#39;title&#39;],
            template:&#39;<p>{{title}}&#39;
        });
        //这里的index,就是数组的下标,使用for循环遍历的时候,可以循环出来!
        Vue.component("todo-items",{
            props:["item","index"],
            template:"<li>{{index+1}},{{item}}"
        });
    
        var vm = new Vue({
            el:"#vue",
            data:{
                title:"秦老师系列课程",
                todoItems:[&#39;test1&#39;,&#39;test2&#39;,&#39;test3&#39;]
            }
        });</script>
    ログイン後にコピー

    8.3、自定义事件

    通以上代码不难发现,数据项在Vue的实例中, 但删除操作要在组件中完成, 那么组件如何才能删除Vue实例中的数据呢?此时就涉及到参数传递与事件分发了, Vue为我们提供了自定义事件的功能很好的帮助我们解决了这个问题; 使用this.$emit(‘自定义事件名’, 参数) , 操作过程如下:
      1-在vue的实例中增加了methods对象并定义了一个名为removeTodoltems的方法

    var vm = new Vue({
            el:"#vue",
            data:{
                title_text:"秦老师系列课程",
                todoItems:['test1','test2','test3']
            },
            methods:{
                removeItems:function(index){
                    console.log("删除了"+this.todoItems[index]+"OK");
                    //splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目,其中index
                    this.todoItems.splice(index,1);
                }
            }
        });
    ログイン後にコピー

    2-修改todo-items待办内容组件的代码,增加一个删除按钮,并且绑定事件!

     Vue.component("todo-items",{
            props:["item_p","index_p"],
            template:"
    ログイン後にコピー
  • {{index_p+1}},{{item_p}} 
  • ",         methods:{             remove:function (index) {             //这里的remove是自定义事件名称,需要在HTML中使用v-on:remove的方式                 //this.$emit 自定义事件分发                 this.$emit('remove',index);             }         }     });

    3-修改todo-items待办内容组件的HTML代码,增加一个自定义事件,比如叫remove,可以和组件的方法绑定,然后绑定到vue的方法!

    <!--增加了v-on:remove="removeTodoItems(index)"自定义事件,该组件会调用Vue实例中定义的--><todo-items></todo-items>
    ログイン後にコピー

    对上一个代码进行修改,实现删除功能

    nbsp;html>
        <meta>
        <title>Title</title>

                                                 

    <script></script><script> Vue.component(&#39;todo&#39;,{ template:&#39;<p>\ <slot name="todo-title">\ <ul>\ <slot name="todo-items">\ \ &#39; }); Vue.component(&#39;todo-title&#39;,{ props:[&#39;title&#39;], template:&#39;<p>{{title}}&#39; }); //这里的index,就是数组的下标,使用for循环遍历的时候,可以循环出来! Vue.component("todo-items",{ props:["item_p","index_p"], template:"<li>{{index_p+1}},{{item_p}} <button @click=&#39;remove_methods&#39;>删除", methods:{ remove_methods:function (index) { //this.$emit 自定义事件分发 this.$emit(&#39;remove&#39;,index); } } }); var vm = new Vue({ el:"#vue", data:{ title_text:"秦老师系列课程", todoItems:[&#39;test1&#39;,&#39;test2&#39;,&#39;test3&#39;] }, methods:{ removeItems:function(index){ console.log("删除了"+this.todoItems[index]+"OK"); this.todoItems.splice(index,1); } } });</script>
    ログイン後にコピー

    逻辑理解

    8.4、Vue入门小结

    核心:数据驱动,组件化

    优点:借鉴了AngularJS的模块化开发和React的虚拟Dom,虚拟Dom就是把Demo操作放到内存中执行;

    常用的属性:

    • v-if
    • v-else-if
    • v-else
    • v-for
    • v-on绑定事件,简写@
    • v-model数据双向绑定
    • v-bind给组件绑定参数,简写:

    组件化:

    • 组合组件slot插槽
    • 组件内部绑定事件需要使用到this.$emit("事件名",参数);
    • 计算属性的特色,缓存计算数据

    遵循SoC关注度分离原则,Vue是纯粹的视图框架,并不包含,比如Ajax之类的通信功能,为了解决通信问题,我们需要使用Axios框架做异步通信;

    说明

    Vue的开发都是要基于NodeJS,实际开发采用Vue-cli脚手架开发,vue-router路由,vuex做状态管理;Vue UI,界面我们一般使用ElementUI(饿了么出品),或者ICE(阿里巴巴出品)来快速搭建前端项目~~

    官网:

    • https://element.eleme.cn/#/zh-CN
    • https://ice.work/

    九、第一个vue-cli项目

    9.1、什么是vue-cli

    vue-cli官方提供的一个脚手架,用于快速生成一个vue的项目模板;
      预先定义好的目录结构及基础代码,就好比咱们在创建Maven项目时可以选择创建一个骨架项目,这个估计项目就是脚手架,我们的开发更加的快速;
      项目的功能

    • 统一的目录结构
    • 本地调试
    • 热部署
    • 单元测试
    • 集成打包上线

    9.2、需要的环境

    • Node.js:http://nodejs.cn/download/
      安装就是无脑的下一步就好,安装在自己的环境目录下
    • Git:https://git-scm.com/doenloads
      镜像:https://npm.taobao.org/mirrors/git-for-windows/

    确认nodejs安装成功:

    • cmd下输入node -v,查看是否能够正确打印出版本号即可!
    • cmd下输入npm -v,查看是否能够正确打印出版本号即可!
      这个npm,就是一个软件包管理工具,就和linux下的apt软件安装差不多!
        安装Node.js淘宝镜像加速器(cnpm)
        这样的话,下载会快很多~
    # -g 就是全局安装
    npm install cnpm -g
    
    # 或使用如下语句解决npm速度慢的问题
    npm install --registry=https://registry.npm.taobao.org
    ログイン後にコピー

    安装的过程可能有点慢~,耐心等待!虽然安装了cnpm,但是尽量少用!
      安装的位置:C:\Users\administrator\AppData\Roaming\npm


      安装vue-cli

    cnpm instal1 vue-cli-g#测试是否安装成功#查看可以基于哪些模板创建vue应用程序,通常我们选择webpackvue list
    ログイン後にコピー

    9.3、第一个vue-cli应用程序

    1.创建一个Vue项目,我们随便建立一个空的文件夹在电脑上,我这里在D盘下新建一个目录

    D:\Project\vue-study;
    ログイン後にコピー

    2.创建一个基于webpack模板的vue应用程序

    #1、首先需要进入到对应的目录 cd D:\Project\vue-study#2、这里的myvue是顶日名称,可以根据自己的需求起名vue init webpack myvue
    ログイン後にコピー

    一路都选择no即可;
      说明:

    • Project name:项目名称,默认回车即可
    • Project description:项目描述,默认回车即可
    • Author:项目作者,默认回车即可
    • Install vue-router:是否安装vue-router,选择n不安装(后期需要再手动添加)
    • Use ESLint to lint your code:是否使用ESLint做代码检查,选择n不安装(后期需要再手动添加)
    • Set up unit tests:单元测试相关,选择n不安装(后期需要再手动添加)
    • Setupe2etests with Nightwatch:单元测试相关,选择n不安装(后期需要再手动添加)
    • Should we run npm install for you after the,project has been created:创建完成后直接初始化,选择n,我们手动执行;运行结果!

    (1)初始化并运行

    cd myvue
    npm install
    npm run dev
    ログイン後にコピー

    执行完成后,目录多了很多依赖

    当出现问题时,可以查看提示进行处理如下

    十、webpack使用

    10.1、什么是Webpack

    本质上, webpack是一个现代JavaScript应用程序的静态模块打包器(module bundler) 。当webpack处理应用程序时, 它会递归地构建一个依赖关系图(dependency graph) , 其中包含应用程序需要的每个模块, 然后将所有这些模块打包成一个或多个bundle.
      Webpack是当下最热门的前端资源模块化管理和打包工具, 它可以将许多松散耦合的模块按照依赖和规则打包成符合生产环境部署的前端资源。还可以将按需加载的模块进行代码分离,等到实际需要时再异步加载。通过loader转换, 任何形式的资源都可以当做模块, 比如Commons JS、AMD、ES 6、CSS、JSON、Coffee Script、LESS等;
      伴随着移动互联网的大潮, 当今越来越多的网站已经从网页模式进化到了WebApp模式。它们运行在现代浏览器里, 使用HTML 5、CSS 3、ES 6等新的技术来开发丰富的功能, 网页已经不仅仅是完成浏览器的基本需求; WebApp通常是一个SPA(单页面应用) , 每一个视图通过异步的方式加载,这导致页面初始化和使用过程中会加载越来越多的JS代码,这给前端的开发流程和资源组织带来了巨大挑战。
      前端开发和其他开发工作的主要区别,首先是前端基于多语言、多层次的编码和组织工作,其次前端产品的交付是基于浏览器的,这些资源是通过增量加载的方式运行到浏览器端,如何在开发环境组织好这些碎片化的代码和资源,并且保证他们在浏览器端快速、优雅的加载和更新,就需要一个模块化系统,这个理想中的模块化系统是前端工程师多年来一直探索的难题。

    10.2、模块化的演进

    Script标签

    	<script></script>
    	<script></script>
    	<script></script>
    ログイン後にコピー

    这是最原始的JavaScript文件加载方式,如果把每一个文件看做是一个模块,那么他们的接口通常是暴露在全局作用域下,也就是定义在window对象中,不同模块的调用都是一个作用域。
      这种原始的加载方式暴露了一些显而易见的弊端:

    • 全局作用域下容易造成变量冲突
    • 文件只能按照<script></script>的书写顺序进行加载
    • 开发人员必须主观解决模块和代码库的依赖关系
    • 在大型项目中各种资源难以管理,长期积累的问题导致代码库混乱不堪

    CommonsJS


    服务器端的NodeJS遵循CommonsJS规范,该规范核心思想是允许模块通过require方法来同步加载所需依赖的其它模块,然后通过exports或module.exports来导出需要暴露的接口。

    require("module");require("../module.js");export.doStuff = function(){};module.exports = someValue;1234
    ログイン後にコピー

    优点:

    • 服务器端模块便于重用
    • NPM中已经有超过45万个可以使用的模块包
    • 简单易用

    缺点:

    • 同步的模块加载方式不适合在浏览器环境中,同步意味着阻塞加载,浏览器资源是异步加载的
    • 不能非阻塞的并行加载多个模块

    实现:

    • 服务端的NodeJS
    • •Browserify,浏览器端的CommonsJS实现,可以使用NPM的模块,但是编译打包后的文件体积较大
    • modules-webmake,类似Browserify,但不如Browserify灵活
    • wreq,Browserify的前身

    AMD


    Asynchronous Module Definition规范其实主要一个主要接口define(id?,dependencies?,factory);它要在声明模块的时候指定所有的依赖dependencies,并且还要当做形参传到factory中,对于依赖的模块提前执行。

    define("module",["dep1","dep2"],functian(d1,d2){
    	return someExportedValue;});require(["module","../file.js"],function(module,file){});1234
    ログイン後にコピー

    优点

    • 适合在浏览器环境中异步加载模块
    • 可以并行加载多个模块

    缺点

    • 提高了开发成本,代码的阅读和书写比较困难,模块定义方式的语义不畅
    • 不符合通用的模块化思维方式,是一种妥协的实现

    实现

    • RequireJS
    • curl

    CMD


    Commons Module Definition规范和AMD很相似,尽保持简单,并与CommonsJS和NodeJS的Modules规范保持了很大的兼容性。

    define(function(require,exports,module){
    	var $=require("jquery");
    	var Spinning = require("./spinning");
    	exports.doSomething = ...;
    	module.exports=...;});
    ログイン後にコピー

    优点:

    • 依赖就近,延迟执行
    • 可以很容易在NodeJS中运行缺点
    • 依赖SPM打包,模块的加载逻辑偏重

    实现

    • Sea.js
    • coolie

    ES6模块


    EcmaScript 6标准增加了JavaScript语言层面的模块体系定义。ES 6模块的设计思想, 是尽量静态化, 使编译时就能确定模块的依赖关系, 以及输入和输出的变量。Commons JS和AMD模块,都只能在运行时确定这些东西。

    import "jquery"export function doStuff(){}module "localModule"{}
    ログイン後にコピー

    优点

    • 容易进行静态分析
    • 面向未来的Ecma Script标准

    缺点

    • 原生浏览器端还没有实现该标准
    • 全新的命令,新版的Node JS才支持

    实现

    • Babel

    大家期望的模块
      系统可以兼容多种模块风格, 尽量可以利用已有的代码, 不仅仅只是JavaScript模块化, 还有CSS、图片、字体等资源也需要模块化。

    10.3、安装Webpack

    WebPack是一款模块加载器兼打包工具, 它能把各种资源, 如JS、JSX、ES 6、SASS、LESS、图片等都作为模块来处理和使用。
      安装:

    npm install webpack -g
    npm install webpack-cli -g
    ログイン後にコピー

    测试安装成功

    • webpack -v
    • webpack-cli -v

    配置

    创建 webpack.config.js配置文件

    • entry:入口文件, 指定Web Pack用哪个文件作为项目的入口
    • output:输出, 指定WebPack把处理完成的文件放置到指定路径
    • module:模块, 用于处理各种类型的文件
    • plugins:插件, 如:热更新、代码重用等
    • resolve:设置路径指向
    • watch:监听, 用于设置文件改动后直接打包
    module.exports = {
    	entry:"",
    	output:{
    		path:"",
    		filename:""
    	},
    	module:{
    		loaders:[
    			{test:/\.js$/,;\loade:""}
    		]
    	},
    	plugins:{},
    	resolve:{},
    	watch:true}
    ログイン後にコピー

    直接运行webpack命令打包

    10.4、使用webpack

    1. 创建项目
    2. 创建一个名为modules的目录,用于放置JS模块等资源文件
    3. 在modules下创建模块文件,如hello.js,用于编写JS模块相关代码
    	//暴露一个方法:sayHi
    	exports.sayHi = function(){
    		document.write("<p>Hello Webpack</p>");
    	}
    ログイン後にコピー
    1. 在modules下创建一个名为main.js的入口文件,用于打包时设置entry属性
    //require 导入一个模块,就可以调用这个模块中的方法了var hello = require("./hello");hello.sayHi();
    ログイン後にコピー
    1. 在项目目录下创建webpack.config.js配置文件,使用webpack命令打包
    module.exports = {
    	entry:"./modules/main.js",
    	output:{
    		filename:"./js/bundle.js"
    	}}
    ログイン後にコピー
    1. 在项目目录下创建HTML页面,如index.html,导入webpack打包后的JS文件
    	nbsp;html>
    	
    		
    			<meta>
    			<title>狂神说Java</title>
    		
    		
    			<script></script>
    		
    	
    ログイン後にコピー
    1. 在IDEA控制台中直接执行webpack;如果失败的话,就使用管理员权限运行即可!
    2. 运行HTML看效果

    说明

    # 参数--watch 用于监听变化webpack --watch
    ログイン後にコピー

    十一、vue-router路由

    11.1、说明


    学习的时候,尽量的打开官方的文档

    Vue Router是Vue.js官方的路由管理器。它和Vue.js的核心深度集成, 让构建单页面应用变得易如反掌。包含的功能有:

    • 嵌套的路由/视图表
    • 模块化的、基于组件的路由配置
    • 路由参数、查询、通配符
    • 基于Vue js过渡系统的视图过渡效果
    • 细粒度的导航控制
    • 带有自动激活的CSS class的链接
    • HTML5 历史模式或hash模式, 在IE 9中自动降级
    • 自定义的滚动行为

    11.2、安装

    基于第一个vue-cli进行测试学习; 先查看node modules中是否存在vue-router
      vue-router是一个插件包, 所以我们还是需要用n pm/cn pm来进行安装的。打开命令行工具,进入你的项目目录,输入下面命令。

    npm install vue-router --save-dev
    ログイン後にコピー

    如果在一个模块化工程中使用它,必须要通过Vue.use()明确地安装路由功能:

    import Vue from 'vue'import VueRouter from 'vue-router'Vue.use(VueRouter);
    ログイン後にコピー

    11.3、测试

    1、先删除没有用的东西
    2、components 目录下存放我们自己编写的组件
    3、定义一个Content.vue 的组件

    <template>
    	<p>
    		</p>
    <h1>内容页</h1>
    	</template><script>
    	export default {
    		name:"Content"
    	}</script>
    ログイン後にコピー

    Main.vue组件

    	<template>
    	<p>
    		</p>
    <h1>首页</h1>
    	</template><script>
    	export default {
    		name:"Main"
    	}</script>
    ログイン後にコピー

    4、安装路由,在src目录下,新建一个文件夹:router,专门存放路由,配置路由index.js,如下

    import Vue from'vue'//导入路由插件import Router from 'vue-router'//导入上面定义的组件import Content from '../components/Content'import Main from '../components/Main'//安装路由Vue.use(Router) ;//配置路由export default new Router({
    	routes:[
    		{
    			//路由路径
    			path:'/content',
    			//路由名称
    			name:'content',
    			//跳转到组件
    			component:Content			},{
    			//路由路径
    			path:'/main',
    			//路由名称
    			name:'main',
    			//跳转到组件
    			component:Main			}
    		]
    	});
    ログイン後にコピー

    5、在main.js中配置路由

    import Vue from 'vue'import App from './App'//导入上面创建的路由配置目录import router from './router'//自动扫描里面的路由配置//来关闭生产模式下给出的提示Vue.config.productionTip = false;new Vue({
    	el:"#app",
    	//配置路由
    	router,
    	components:{App},
    	template:'<app></app>'});
    ログイン後にコピー

    6、在App.vue中使用路由

    <template>
    	<p>
    		<!--
    			router-link:默认会被渲染成一个<a>标签,to属性为指定链接
    			router-view:用于渲染路由匹配到的组件
    		-->
    		<router-link>首页</router-link>
    		<router-link>内容</router-link>
    		<router-view></router-view>
    	</p></template><script>
    	export default{
    		name:&#39;App&#39;
    	}</script><style></style>
    ログイン後にコピー

    十二、实战快速上手

    我们采用实战教学模式并结合ElementUI组件库,将所需知识点应用到实际中,以最快速度带领大家掌握Vue的使用;

    12.1、创建工程

    注意:命令行都要使用管理员模式运行
    1、创建一个名为hello-vue的工程vue init webpack hello-vue
    2、安装依赖, 我们需要安装vue-router、element-ui、sass-loader和node-sass四个插件

    #进入工程目录cd hello-vue#安装vue-routern npm install vue-router --save-dev#安装element-uinpm i element-ui -S#安装依赖npm install# 安装SASS加载器cnpm install sass-loader node-sass --save-dev#启功测试npm run dev
    ログイン後にコピー

    3、Npm命令解释:

    • npm install moduleName:安装模块到项目目录下
    • npm install -g moduleName:-g的意思是将模块安装到全局,具体安装到磁盘哪个位置要看npm config prefix的位置
    • npm install -save moduleName:–save的意思是将模块安装到项目目录下, 并在package文件的dependencies节点写入依赖,-S为该命令的缩写
    • npm install -save-dev moduleName:–save-dev的意思是将模块安装到项目目录下,并在package文件的devDependencies节点写入依赖,-D为该命令的缩写

    12.2、创建登录页面

    把没有用的初始化东西删掉!
      在源码目录中创建如下结构:

    • assets:用于存放资源文件
    • components:用于存放Vue功能组件
    • views:用于存放Vue视图组件
    • router:用于存放vue-router配置

    创建首页视图,在views目录下创建一个名为Main.vue的视图组件:

    <template>
    	<p>首页</p></template><script>
    	export default {
    			name:"Main"
    	}</script><style></style>
    ログイン後にコピー

    创建登录页视图在views目录下创建名为Login.vue的视图组件,其中el-*的元素为ElementUI组件;

    <template>
      <p>
        <el-form>
          <h3>欢迎登录</h3>
          <el-form-item>
            <el-input></el-input>
          </el-form-item>
          <el-form-item>
            <el-input></el-input>
          </el-form-item>
          <el-form-item>
            <el-button>登录</el-button>
          </el-form-item>
        </el-form>
    
        <el-dialog>
          <span>请输入账号和密码</span>
          <span>
              <el-button>确定</el-button>
            </span>
        </el-dialog>
      </p></template><script>
        export default {
            name: "Login",
          data(){
              return{
                form:{
                  username:&#39;&#39;,
                  password:&#39;&#39;
                },
                //表单验证,需要在 el-form-item 元素中增加prop属性
                rules:{
                  username:[
                    {required:true,message:"账号不可为空",trigger:"blur"}
                  ],
                  password:[
                    {required:true,message:"密码不可为空",tigger:"blur"}
                  ]
                },
    
                //对话框显示和隐藏
                dialogVisible:false
              }
          },
          methods:{
              onSubmit(formName){
                //为表单绑定验证功能
                this.$refs[formName].validate((valid)=>{
                  if(valid){
                    //使用vue-router路由到指定界面,该方式称为编程式导航
                    this.$router.push(&#39;/main&#39;);
                  }else{
                    this.dialogVisible=true;
                    return false;
                  }
                });
              }
          }
        }</script><style>
      .login-box{
        border:1px solid #DCDFE6;
        width: 350px;
        margin:180px auto;
        padding: 35px 35px 15px 35px;
        border-radius: 5px;
        -webkit-border-radius: 5px;
        -moz-border-radius: 5px;
        box-shadow: 0 0 25px #909399;
      }
      .login-title{
        text-align:center;
        margin: 0 auto 40px auto;
        color: #303133;
      }</style>
    ログイン後にコピー

    创建路由,在router目录下创建一个名为index.js的vue-router路由配置文件

    //导入vueimport Vue from 'vue';import VueRouter from 'vue-router';//导入组件import Main from "../views/Main";import Login from "../views/Login";//使用Vue.use(VueRouter);//导出export default new VueRouter({
      routes: [
        {
          //登录页
          path: '/main',
          component: Main    },
        //首页
        {
          path: '/login',
          component: Login    },
      ]})
    ログイン後にコピー

    APP.vue

    <template>
      <p>
        <router-view></router-view>
      </p></template><script>export default {
      name: &#39;App&#39;,}</script><style>#app {
      font-family: &#39;Avenir&#39;, Helvetica, Arial, sans-serif;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
      text-align: center;
      color: #2c3e50;
      margin-top: 60px;}</style>
    ログイン後にコピー

    main.js

    // The Vue build version to load with the `import` command// (runtime-only or standalone) has been set in webpack.base.conf with an alias.import Vue from 'vue'import App from './App'import router from "./router"import ElementUI from 'element-ui'import 'element-ui/lib/theme-chalk/index.css'Vue.use(router)Vue.use(ElementUI)/* eslint-disable no-new */new Vue({
      el: '#app',
      router,
      render:h=>h(App)})
    ログイン後にコピー

    测试:在浏览器打开 http://localhost:8080/#/login
    如果出现错误: 可能是因为sass-loader的版本过高导致的编译错误,当前最高版本是8.0.2,需要退回到7.3.1 ;
    去package.json文件里面的 "sass-loader"的版本更换成7.3.1,然后重新cnpm install就可以了;

    12.3、路由嵌套

    嵌套路由又称子路由,在实际应用中,通常由多层嵌套的组件组合而成。
    demo
    1、 创建用户信息组件,在 views/user 目录下创建一个名为 Profile.vue 的视图组件;
    Profile.vue

    <template>
      <h1>个人信息</h1></template><script>
      export default {
        name: "UserProfile"
      }</script><style></style>
    ログイン後にコピー

    2、在用户列表组件在 views/user 目录下创建一个名为 List.vue 的视图组件;
    List.vue

    <template>
      <h1>用户列表</h1></template><script>
      export default {
        name: "UserList"
      }</script><style></style>
    ログイン後にコピー

    3、 修改首页视图,我们修改 Main.vue 视图组件,此处使用了 ElementUI 布局容器组件,代码如下:
    Main.vue

    <template>
        <p>
          <el-container>
            <el-aside>
              <el-menu>
                <el-submenu>
                  <template><i></i>用户管理</template>
                  <el-menu-item-group>
                    <el-menu-item>
                    <!--插入的地方-->
                      <router-link>个人信息</router-link>
                    </el-menu-item>
                    <el-menu-item>
                    <!--插入的地方-->
                      <router-link>用户列表</router-link>
                    </el-menu-item>
                  </el-menu-item-group>
                </el-submenu>
                <el-submenu>
                  <template><i></i>内容管理</template>
                  <el-menu-item-group>
                    <el-menu-item>分类管理</el-menu-item>
                    <el-menu-item>内容列表</el-menu-item>
                  </el-menu-item-group>
                </el-submenu>
              </el-menu>
            </el-aside>
    
            <el-container>
              <el-header>
                <el-dropdown>
                  <i></i>
                  <el-dropdown-menu>
                    <el-dropdown-item>个人信息</el-dropdown-item>
                    <el-dropdown-item>退出登录</el-dropdown-item>
                  </el-dropdown-menu>
                </el-dropdown>
              </el-header>
              <el-main>
              <!--在这里展示视图-->
                <router-view></router-view>
              </el-main>
            </el-container>
          </el-container>
        </p></template><script>
        export default {
            name: "Main"
        }</script><style>
      .el-header {
        background-color: #B3C0D1;
        color: #333;
        line-height: 60px;
      }
      .el-aside {
        color: #333;
      }</style>
    ログイン後にコピー

    4、 配置嵌套路由修改 router 目录下的 index.js 路由配置文件,使用children放入main中写入子模块,代码如下
    index.js

    //导入vueimport Vue from 'vue';import VueRouter from 'vue-router';//导入组件import Main from "../views/Main";import Login from "../views/Login";//导入子模块import UserList from "../views/user/List";import UserProfile from "../views/user/Profile";//使用Vue.use(VueRouter);//导出export default new VueRouter({
      routes: [
        {
          //登录页
          path: '/main',
          component: Main,
          //  写入子模块
          children: [
            {
              path: '/user/profile',
              component: UserProfile,
            }, {
              path: '/user/list',
              component: UserList,
            },
          ]
        },
        //首页
        {
          path: '/login',
          component: Login    },
      ]})
    ログイン後にコピー

    5、 路由嵌套实战效果图

    图 路由嵌套效果图

    12.4、参数传递

    这里演示如果请求带有参数该怎么传递
    demo
     用的还是上述例子的代码 修改一些代码 这里不放重复的代码了
    第一种取值方式
    1、 修改路由配置, 主要是router下的index.js中的 path 属性中增加了 :id 这样的占位符

    {
    	path: '/user/profile/:id', 
    	name:'UserProfile', 
    	component: UserProfile}
    ログイン後にコピー

    2、传递参数
     此时我们在Main.vue中的route-link位置处 to 改为了 :to,是为了将这一属性当成对象使用,注意 router-link 中的 name 属性名称 一定要和 路由中的 name 属性名称 匹配,因为这样 Vue 才能找到对应的路由路径;

    <!--name是组件的名字 params是传的参数 如果要传参数的话就需要用v:bind:来绑定--><router-link>个人信息</router-link>
    ログイン後にコピー
    ログイン後にコピー

    3、在要展示的组件Profile.vue中接收参数 使用 {{$route.params.id}}来接收
    Profile.vue 部分代码

    ログイン後にコピー

    第二种取值方式 使用props 减少耦合
    1、修改路由配置 , 主要在router下的index.js中的路由属性中增加了 props: true 属性

    {
    	path: '/user/profile/:id', 
    	name:'UserProfile', 
    	component: UserProfile, 
    	props: true}
    ログイン後にコピー

    2、传递参数和之前一样 在Main.vue中修改route-link地址

    <!--name是组件的名字 params是传的参数 如果要传参数的话就需要用v:bind:来绑定--><router-link>个人信息</router-link>
    ログイン後にコピー
    ログイン後にコピー

    3、在Profile.vue接收参数为目标组件增加 props 属性
    Profile.vue

    <template>
      <p>
        个人信息
        {{ id }}  </p></template><script>
        export default {
          props: [&#39;id&#39;],
          name: "UserProfile"
        }</script><style></style>
    ログイン後にコピー

    图 传参效果图

    12.5、组件重定向

    重定向的意思大家都明白,但 Vue 中的重定向是作用在路径不同但组件相同的情况下,比如:
    在router下面index.js的配置

    {
      path: '/main',
      name: 'Main',
      component: Main},{
      path: '/goHome',
      redirect: '/main'}
    ログイン後にコピー

    说明:这里定义了两个路径,一个是 /main ,一个是 /goHome,其中 /goHome 重定向到了 /main 路径,由此可以看出重定向不需要定义组件;

    使用的话,只需要在Main.vue设置对应路径即可;

    <el-menu-item>
        <router-link>回到首页</router-link></el-menu-item>
    ログイン後にコピー

    12.6、路由模式与 404

    路由模式有两种

    • hash:路径带 # 符号,如 http://localhost/#/login
    • history:路径不带 # 符号,如 http://localhost/login

    修改路由配置,代码如下:

    export default new Router({
      mode: 'history',
      routes: [
      ]});
    ログイン後にコピー

    404 demo
    1.创建一个NotFound.vue视图组件
    NotFound.vue

    <template>
        <p>
          </p>
    <h1>404,你的页面走丢了</h1>
        </template><script>
        export default {
            name: "NotFound"
        }</script><style></style>
    ログイン後にコピー

    2.修改路由配置index.js

    import NotFound from '../views/NotFound'{
       path: '*',
       component: NotFound}
    ログイン後にコピー

    3.效果图

    图 404效果图

    路由钩子与异步请求

    beforeRouteEnter:在进入路由前执行
    beforeRouteLeave:在离开路由前执行

    在Profile.vue中写

      export default {
        name: "UserProfile",
        beforeRouteEnter: (to, from, next) => {
          console.log("准备进入个人信息页");
          next();
        },
        beforeRouteLeave: (to, from, next) => {
          console.log("准备离开个人信息页");
          next();
        }
      }
    ログイン後にコピー

    参数说明:
    to:路由将要跳转的路径信息
    from:路径跳转前的路径信息
    next:路由的控制参数
    next() 跳入下一个页面
    next(’/path’) 改变路由的跳转方向,使其跳到另一个路由
    next(false) 返回原来的页面
    next((vm)=>{}) 仅在 beforeRouteEnter 中可用,vm 是组件实例

    在钩子函数中使用异步请求

    1、安装 Axios

    cnpm install --save vue-axios
    ログイン後にコピー

    2、main.js引用 Axios

    import axios from 'axios'import VueAxios from 'vue-axios'Vue.use(VueAxios, axios)
    ログイン後にコピー

    3、准备数据 : 只有我们的 static 目录下的文件是可以被访问到的,所以我们就把静态文件放入该目录下。
    数据和之前用的json数据一样 需要的去上述axios例子里

    // 静态数据存放的位置static/mock/data.json
    ログイン後にコピー

    4.在 beforeRouteEnter 中进行异步请求
    Profile.vue

      export default {
        //第二种取值方式
        // props:['id'],
        name: "UserProfile",
        //钩子函数 过滤器
        beforeRouteEnter: (to, from, next) => {
          //加载数据
          console.log("进入路由之前")
          next(vm => {
            //进入路由之前执行getData方法
            vm.getData()
          });
        },
        beforeRouteLeave: (to, from, next) => {
          console.log("离开路由之前")
          next();
        },
        //axios
        methods: {
          getData: function () {
            this.axios({
              method: 'get',
              url: 'http://localhost:8080/static/mock/data.json'
            }).then(function (response) {
              console.log(response)
            })
          }
        }
      }
    ログイン後にコピー

    5.路由钩子和axios结合图

    更多编程相关知识,请访问:编程入门!!

    以上がVue の最も詳しい知識とメモの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    関連ラベル:
    vue
    ソース:csdn.net
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    最新の問題
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート