1. ホーム
  2. アンギュラー

ツリーメニュー(多階層メニュー)機能モジュールのAngular実装

2022-02-24 23:17:12

前置き

この記事では、伝説のツリー構造メニューであるマルチレベルメニューの効果を共有することです、理論的には無限レベルメニュー、もちろん、特定の要件にデータ構造をサポートしていますが、我々は必要な構造にデータを組み立てることができるので、これも困難な作業ではありません。次の例では、完全に良いではありませんが、見積もりは十分です。このマルチレベルメニューは、行うには、公式のAngularの左メニューの効果を模倣している、類似性の効果は99%に達する必要があります、私はすべてのコードを投稿したいので、この記事では、もう少しコンテンツ(主にコード)であり、あなたが不足しているコードについて空想させないようにしてみてください。さて、このメニュー機能の旅を始めましょう

このマルチレベルメニューは、以下の機能を実装しています。

  • 1、マルチレベルメニューを表示することができ、理論的には無限レベルメニューを表示することができます。
  • 2、現在のメニューのハイライト機能
  • 3、更新後、最後にクリックしたメニューがサブメニューであっても、自動的に位置を特定し、親メニューは自動的に展開されます。
  • 4、サブメニューの表示非表示は、格納、展開、フェードイン、フェードアウトの効果付き

アンギュラー多階層メニュー

いつものように、さっそくコードを見てみましょう。コードを始める前に、コードのファイル構造の概要図を見てみましょう。

レンダリングの後、その効果を見てみましょう。結局のところ、これが次のコードの山を読み通す勇気を与えてくれるのです。

チュートリアル]メニューを展開し、[Hero Editor Menu]をクリックし、[Core Knowledge] - [Modules and Data Binding] - [Lifecycle Hooks] をクリックして、ページを更新すると、[Lifecycle Hooks] メニューが自動的に見つかりハイライトされ、 [Core Knowledge] - [Modules and Data Binding] メニューも自動的に展開しハイライトされるようになりました。

上記の各メニューは、クリックすると空白の詳細ページにジャンプしますが、この詳細ページは、メニューが正しくジャンプしているかどうかを確認するためのものであり、メニューが正しくジャンプしたかどうかは、ナビゲーションバーのURLの変化を見て判断することができます。

まず、一番目立つコードを掲載します。

navItem.component.html

  1. <div
    class
    =
    "level-1"
    >
    <ng-template
     [
    ngIf
    ]
    =
    "menu.type === 'link'"
    >
    <div>
    <a
    class
    =
    "link level-1"
    routerLink
    =
    "{
    {menu.url}}"
    routerLinkActive
    =
    "selected"
     (
    click
    )
    =
    "toggleSubMenu(menu)"
    >
    {
    { menu.name }}
    </a>
    </div>
    </ng-template>
    <ng-template
     [
    ngIf
    ]
    =
    "menu.type === 'button'"
    >
    <div>
    <div
    class
    =
    "button heading"
     [
    ngClass
    ]
    =
    "{expand:menu.expand,selected:menu.isSelected}"
     (
    click
    )
    =
    "toggleSubMenu(menu)"
    >
     {
    {menu.name}}
    <div
    class
    =
    "icon"
    >
    <svg
    xmlns
    =
    "http://www.w3.org/2000/svg"
    focusable
    =
    "false"
    viewBox
    =
    "0 0 24 24"
    >
    <path
    d
    =
    "M8.59 16.34l4.58-4.59-4.58-4.59L10 5.75l6 6-6 6z"
    ></path>
    </svg>
    </div>
    </div>
    <ng-template
     [
    ngIf
    ]
    =
    "menu.expand"
    >
    <div
    class
    =
    "heading-children"
     [@
    inOut
    ]
    =
    "out"
    >
    <nav-item
     [
    menu
    ]
    =
    "menu"
     *
    
    ngFor
    =
    "let menu of menu.subMenu"
    ></nav-item>
    </div>
    </ng-template>
    </div>
    </ng-template>
    </div>
    

上の routerLinkActive は、現在のメニューのハイライトを設定します。[inOut]はバインドアニメーション効果で、詳細は公式ドキュメントを参照してください。

このhtmlはAngularタグの <ng-template> を使用しています。このタグの使用方法はウェブで検索してください。

navItem.component.css

  1. a 
    {
     text
    - -
    decoration
    :
     none
    ;
     color
    :
    #333;
    }
    .
    link
    ,
    .
    button 
    {
     display
    :
     block
    ;
     padding
    :
    10px
    15px
    ;
     transition
    :
     background
    -
    color 
    0.2s
     ease
    -
    in
    - -
    out
    0s
    ,
     color 
    0.3s
     ease
    -
    in
    - -
    out
    0.1s
    ;
    - -
    moz
    -
    user
    -
    select
    :
     none
    ;
    - -
    webkit
    - -
    user
    -
    select
    :
     none
    ;
    - -
    ms
    -
    user
    -
    select
    :
     none
    ;
    - -
    khtml
    -
    user
    -
    select
    :
     none
    ;
     user
    - -
    select
    :
     none
    ;
    }
    .
    button 
    {
     position
    :
     relative
    ;
    }
    .
    link
    :
    hover
    ,
    .
    button
    :
    hover 
    {
     color
    :
    #1976d2;
     background
    -
    color
    :
    #eee;
     cursor
    :
     pointer
    ;
    }
    .
    icon 
    {
     position
    :
     absolute
    ;
     right
    :
    0
    ;
     display
    :
    inline
    - -
    block
    ;
     height
    :
    24px
    ;
     width
    :
    
    24px
    ;
     fill
    :
     currentColor
    ;
     transition
    :
    -
    webkit
    - -
    transform 
    .
    15s
    ;
     transition
    :
     transform 
    .
    15s
    ;
     transition
    :
     transform 
    .
    15s
    ,
    - -
    webkit
    - -
    transform 
    .
    15s
    ;
     transition
    - -
    timing
    - -
    function
    :
     ease
    -
    in
    - -
    out
    ;
    }
    .
    heading
    -
    children 
    {
     padding
    - -
    left
    :
    14px
    ;
     overflow
    :
     hidden
    ;
    }
    .
    expand 
    {
     display
    :
     block
    ;
    }
    .
    collapsed 
    {
     display
    :
     none
    ;
    }
    .
    expand 
    .
    icon 
    {
    - -
    webkit
    - -
    transform
    :
     rotate
    (
    90deg
    );
     transform
    :
     rotate
    (
    90deg
    );
    }
    .
    selected 
    {
     color
    :
    #1976d2;
    }
    
navItem.component.ts

  1. import
    {
    Component
    ,
    Input
    ,
    OnInit
    }
    from
    '@angular/core'
    ;
    import
    {
    ActivatedRoute
    ,
    Router