vue一级、二级菜单点击导航栏切换

  • Post author:
  • Post category:vue


一.一级菜单

1.实际效果,点击标题切换内容


2.用了vertify样式,标题pname从后端传数据

 <v-tabs

        v-model="tab"

    >

        <v-tabs-slider color="yellow"></v-tabs-slider>     //标题下黄线

        <v-tab

        v-for="item in items"

        :key="item.pname"

        >

        {{ item.pname }}                                               //标题

        </v-tab>

    </v-tabs>

这里讲解一个原理,具体数据格式请看第四条的数据初始化

item是固定写法,items指取有数据的大数组,item in items指items里的一条数据第一层{},

然后取item.pname把导航栏标题显示出来

3.标题下内容

    <v-tabs-items v-model="tab">
         <v-tab-item v-for="item in items" :key="item.pname">
        <v-card 
         v-for="newss in item.news"
        :key="newss.title"
        @click="godetail()"
         elevation="2"
         outlined
         shaped
         tile
         flat>
          <v-list-item three-line>
      <v-list-item-content>

        <!-- <v-list-item-title 
            class="text-h5 mb-1"
        >
          {{newss.title}}
        </v-list-item-title> -->
        <v-list-item-subtitle>{{newss.title}}</v-list-item-subtitle>
      </v-list-item-content>

      <v-list-item-avatar
        tile
        size="80"
        color="grey"
      ><img :src="newss.url"></v-list-item-avatar>
    </v-list-item>

    <v-card-actions>
      <v-btn
        outlined
        rounded
        text
        small
      >
        {{newss.tags}}
      </v-btn>
    </v-card-actions>
        </v-card>
      </v-tab-item>
    </v-tabs-items>

v-for就像java里的二层for循环一样,要取第二层news里的内容,需要先循环第一层,于是就要把item in items先写在第一层,这样就取到了item第一个括号,接着取news里的内容,写第二个v-for,上面的v-card是一个样式,把内容放到一个卡片里,接下来 v-for=”newss in item.news”

item是第一层,包含news,news是第二层括号,简单讲也就是数组里的数组,大数组包含多个标题,小数组则是每个标题的对应内容,这里的newss是随便取得名字,指代的是news数组里的每一个数组

这里的key大概是主键的意思

有了newss之后,就可以取每一个小数组里的每一个属性的值

只要在v-card包围内,都可以用{

{newss.title}}{

{newss.tags}}取值

其中@click点击事件的作用是跳转新闻资讯的具体内容,与导航栏切换无关

4.初始化数据

在data里需要初始化tab,item

tab: null,

tab用来导航切换定位

items作为大数组,里面的数据格式是这样的

items:[
            {
            "pname":"热榜",
                "news":[{
                    "tags":"特朗普",
                    "title":"xxxxxx",
                    "url":"",
                    "src":"",
                },{
                    "tags":"解放军",
                    "title":"xxxxx",
                    "url":"https://xxxxx.jpg",
                    "src":"https://mbd.baidu.com/xxxxx",
                }
                ]
            },
            {
            "pname":"热点话题",
                "news":[{
                   "tags":"",
                    "title":"",
                    "url":"",
                    "src":"",
                },{
                  "tags":"",
                    "title":"",
                    "url":"",
                    "src":"",
                }]
            }]

二.二级菜单

二级菜单比一级菜单多了一个侧边栏,其原理是没什么区别的

这里用的依旧是vertify框架

1.一级副标题

 <v-tabs 
        v-model="tab"
        grow
        show-arrows
    >
    <v-tab v-for="item in items" :key="item.pname">
            {{ item.pname }}
    </v-tab>
    </v-tabs>

依旧是显示专项、朋友圈、收藏等功能,依旧是依靠tab来定位

2.二级菜单(侧边栏)及其内容(海报图片)

二级菜单需要一个subtab来定位,需要后端传数据的时候加上,不过赋个空值就可以了

这里没有数据格式,因为是从后端取得,我有空调一下接口再放到下面第三点了

<v-tabs-items v-model="tab">
            <v-tab-item v-for="item in items" :key="item.pname">
            <v-card flat>
                <v-tabs 
                    v-model="item.subtab"
                    vertical
                >
                <v-tab v-for="item in item.secondCategory" :key="item.cname">
                    {{ item.cname }}  
                </v-tab>
               <v-tabs-items  v-model="item.subtab"  class="mt-4">
                    <v-tab-item v-for="item in item.secondCategory" :key="item.cname">
                        <v-card flat
                        >
                            <v-row dense>
                                <v-col margin-left>
                                    <v-card 
                                    class=""
                                    >                              
                                    <v-row
                                     justify="space-around" 
                                      align="center"
                                      no-gutters>
                                        <v-col
                                        v-for="card in item.poster"
                                        :key="card.title"
                                        > 
                                        <!-- :cols="card.flex" -->
                                        <v-card 
                                       max-width="100" 
                                       flat 
                                        >
                                            <v-img
                                             max-width="100"
                                             max-height="250"
                                             class="white--text align-end"
                                             contain
                                            :src="card.sampleImgPath"
                                            @click="send(card.sampleImgPath)"
                                            >
                                            </v-img>
                                             <v-card-text
                                            >
                                            <v-row
                                                align="center"
                                                class="mx-0"
                                                max-width="50"
                                            >
                                                {{card.title}}
                                              <van-button 
                                              plain hairline
                                              icon="star-o"
                                              size="mini" 
                                              type="primary"
                                              @click="collectPoster(card.id,card.title,card.sampleImgPath,card.collectFlag)">
                                              {{ card.collectFlag == "0" ? '取消收藏': '收藏'}}
                                              </van-button>
                                            </v-row>
                                             </v-card-text>
                                        </v-card>
                                        </v-col>
                                    </v-row>
                                </v-card>
                                </v-col>
                            </v-row >
                        </v-card>
                    </v-tab-item>
                </v-tabs-items>
                </v-tabs>
            </v-card>
            </v-tab-item>
        </v-tabs-items>

整个数据放在一个大数组里,第一级是标题,第二级是标题下的各个二级标题,第三级是二级标题下的各个海报内容,所以要取到各个海报,像三层for循环一样,用v-for一级一级的取值

(1)第一级标题

v-model=tab定位第一级

v-for=item in items :key=item.pname

item代指第一层

(2)第二级标题

v-model=item.subtab 定位第二级

<v-tab v-for=”item in item.secondCategory” :key=”item.cname”>

{

{ item.cname }}

</v-tab>

取第二级所有二级标题在侧边栏展示

item in 第一层的item,此时item指代第二层

(3)循环第二级里的内容

v-model=item.subtab

v-for=item in  item.secondCategory :key=item.cname

定位第二级

v-for=card in item.poster

循环取第二级标题里的各个内容

图片属性:src=card.url

取名称{

{card.title}}

3.数据格式

tab: null,

items: [],



版权声明:本文为weixin_46871290原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。