如何在 ionic 4 中创建手风琴式侧边菜单

Posted

技术标签:

【中文标题】如何在 ionic 4 中创建手风琴式侧边菜单【英文标题】:How to create Accordion type side menu in ionic 4 【发布时间】:2019-11-22 12:40:25 【问题描述】:

我有一个带有手风琴菜单的 ionic 3 项目。现在有必要更新到 ionic 4。 我已将所有代码转换为 ionic 4,但由于路由方法发生了很多变化,我无法将菜单从 Ionic 3 转换为 Ionic 4。 下面给出了 Ionic 3 Accordion 侧边菜单的主要部分代码,如何在 Ionic 4 中使用它...

// Side Menu Component
import  SideMenuContentComponent  from './../shared/side-menu-content/side-menu-content.component';
import  SideMenuSettings  from './../shared/side-menu-content/models/side-menu-settings';
import  MenuOptionModel  from './../shared/side-menu-content/models/menu-option-model';


@Component(
    templateUrl: 'app.html'
)
export class MyApp 
    @ViewChild(Nav) navCtrl: Nav;

    // Get the instance to call the public methods
    @ViewChild(SideMenuContentComponent) sideMenu: SideMenuContentComponent;

    public rootPage: any = WelcomePage;

    // Options to show in the SideMenuComponent
    public options: Array<MenuOptionModel>;

    // Settings for the SideMenuComponent
    public sideMenuSettings: SideMenuSettings = 
        accordionMode: true,
        showSelectedOption: true,
        selectedOptionClass: 'active-side-menu-option',
        subOptionIndentation: 
            md: '16px',
            ios: '64px',
            wp: '56px'
        
    ;

    private unreadCountObservable: any = new ReplaySubject<number>(0);

    constructor(private platform: Platform,
                private statusBar: StatusBar,
                private splashScreen: SplashScreen,
                private alertCtrl: AlertController,
                private menuCtrl: MenuController) 
        this.initializeApp();
    

    initializeApp() 
        this.platform.ready().then(() => 
            this.statusBar.styleLightContent();
            this.splashScreen.hide();

            // Initialize some options
            this.initializeOptions();
        );

        // Change the value for the batch every 5 seconds
        setInterval(() => 
            this.unreadCountObservable.next(Math.floor(Math.random() * 10));
        , 5000);

    

    private initializeOptions(): void 
        this.options = new Array<MenuOptionModel>();

        // Load simple menu options
        // ------------------------------------------
        this.options.push(
            iconName: 'home',
            displayName: 'முகப்பு - Home',
            component: HomePage,

            subItems: [
                
                    iconName: 'home',
                    displayName: 'முகப்பு-Home',
                    component: HomePage,
                ,
                
                    iconName: 'heart',
                    displayName: 'அறிமுகம்- Welcome',
                    component: WelcomePage,
                ,
                
                    iconName: 'information-circle',
                    displayName: 'எம்மைப் பற்றி- SVK',
                    component: AboutPage
                
            ]
        );

【问题讨论】:

【参考方案1】:

这个手风琴没有css效果,只为一个级别制作。

如果有人知道如何给这个手风琴添加一些过渡效果,请用它标记我。

第 1 步: 让我们假设您在 ioni4 应用中总共创建了 9 个页面。

第 2 步: 在 assets/data/menus.json 下将您的菜单另存为 json 用有意义的名称和在 app.routing.module.ts 中找到的 url 更改 url

[
    
        "name": "Menu1  ",
        "item": [
            
                "icon": "calendar",
                "name": "Item1",
                "url": "/item1"
            ,
            
                "icon": "calendar",
                "name": "Item2",
                "url": "/item2"
            ,
            
                "icon": "calendar",
                "name": "Item3",
                "url": "/item3"
            
        ]
    ,
    
        "name": "Menu2",
        "item": [
            "item": [
            
                "icon": "calendar",
                "name": "M2Item1",
                "url": "/m2item1"
            ,
            
                "icon": "calendar",
                "name": "M2Item2",
                "url": "/m2item2"
            ,
            
                "icon": "calendar",
                "name": "M2Item3",
                "url": "/m2item3"
            
        ]
    ,
    
        "name": "Menu3",
        "item": [
            "item": [
            
                "icon": "calendar",
                "name": "M3Item1",
                "url": "/m2item1"
            ,
            
                "icon": "calendar",
                "name": "M3Item2",
                "url": "/m2item2"
            ,
            
                "icon": "calendar",
                "name": "M3Item3",
                "url": "/m2item3"
            
        ]
    
]

第三步:修改 app.component.html 的内容如下:

<ion-content>
        <ion-list>
          <ion-menu-toggle auto-hide="false" class="mymenu">
            <ion-item [routerDirection]="'root'" [routerLink]="['/home']" (click)="clearLevel()">
              <ion-label><ion-icon name="home"></ion-icon>&nbsp;&nbsp;&nbsp;Home, About, Contact</ion-label>
            </ion-item>
          </ion-menu-toggle>
          <ion-item *ngFor="let p of appPages; let i=index;" [routerDirection]="'root'" (click)="toggleLevel1('idx'+i)" [ngClass]="active: isLevel1Shown('idx'+i)">
            <ion-label>
              <ion-icon [name]="isLevel1Shown('idx'+i) ? 'md-arrow-dropdown' : 'md-arrow-dropright'" slot="end" style="font-size: 20px;"></ion-icon>
              p.name
               <ul *ngIf="isLevel1Shown('idx'+i)" class="level2">

                    <li *ngFor="let i1 of p.item; let l=index;" [routerLink]="[i1.url]">
                      <ion-menu-toggle auto-hide="false" class="first-level"><ion-icon name="i1.icon"></ion-icon>&nbsp;&nbsp;&nbsp;i1.name</ion-menu-toggle>
                    </li>
                    </ul>
             </ion-label>
          </ion-item>
        </ion-list>
      </ion-content>
    </ion-menu>
    <ion-router-outlet id="main-content"></ion-router-outlet>
  </ion-split-pane>
</ion-app> 

step4:将以下scss添加到app.component.scss文件中:

.level1 
  padding: 0;
  margin: 2px 0;

  li 
      border-top: solid 1px rgb(46, 9, 177);
 //     padding: 0px 0 0 8px;


  


.level2 
  padding-left: 5px;
  --background: rgb(218, 248, 241) !important;

  color:blue;
  line-height: 2.5;



  li 
      border-top: solid 1px orange;
     background-color: rgb(230, 248, 226);
     padding: 2px 0 0 8px;
     font-size: 14px;

  


ion-split-pane 
  ion-content  
    --background: rgb(218, 248, 241) !important;
  
  ion-item
     --background: rgb(218, 248, 241) !important;
     --color: rgb(71, 3, 148);
  

第五步:在 app.component.ts 类主体的任意位置添加几行代码:

clearLevel() 
    this.showLevel1 = null;
    this.showLevel2 = null;
  //  this.showLevel3 = null;
  
  toggleLevel1(idx: string) 
    if (this.isLevel1Shown(idx)) 
      this.showLevel1 = null;
     else 
      this.showLevel1 = idx;
    
  
  isLevel1Shown(idx: string) 
    return this.showLevel1 === idx;
   

如果我遗漏了本文要提及的内容,请告诉我结果。

【讨论】:

以上是关于如何在 ionic 4 中创建手风琴式侧边菜单的主要内容,如果未能解决你的问题,请参考以下文章

jQuery手风琴菜单 跪求图面上面这种JQ手风琴效果,带排行的。。。

如何从弹出按钮点击Ionic关闭侧边菜单?

使用 jquery 或 javascript 为父子属性创建手风琴式下拉菜单

如何在Angular 4中关闭手风琴内的所有菜单

Bootstrap 4:如何创建一个带有手风琴的下拉菜单?

Slate Docs 功能可在单击侧边栏中的其他链接时保持导航手风琴打开