Nuxt tabs嵌套路由组件

2,582 阅读1分钟

前言

记录一下nuxt嵌套路由组件的使用

Nuxt嵌套路由

通过vue-router的子路由创建Nuxt.js应用的嵌套路由。

创建内嵌子路由,需要添加一个Vue文件,同时添加一个与该文件同名的目录用来存放子视图组件

Warning: 别忘了在父组件(.vue文件) 内增加 用于显示子视图内容。

文档地址:嵌套路由-NuxtJS

个人测试demo

vuetify v-tabs组件+传值

//pages/parent.vue  形式更好看点可以把n修改为(n, content)放到data里
<v-tabs
          v-model="tabs"
          background-color="grey darken-4"
          dark
          style="border-radius: 5px"
        >
          <v-tab
            v-for="n in 3"
            :key="n">
            <nuxt-link to="/parent/child1" v-if="n===1" >
              全部
            </nuxt-link>
            <nuxt-link to="/parent/child2" v-if="n===2" >
              精品
            </nuxt-link>
            <nuxt-link to="/parent/child3" v-if="n===3">
              求职
            </nuxt-link>
            
          </v-tab>
        </v-tabs>
        <v-tabs-items v-model="tabs" keep-alive>
          <v-tab-item>
            <nuxt-child keep-alive :foobar="111"/>
          </v-tab-item>
          <v-tab-item>
            <nuxt-child keep-alive :foobar="222"/>
          </v-tab-item>
          <v-tab-item>
            <nuxt-child keep-alive :foobar="333"/>
          </v-tab-item>
        </v-tabs-items>
        

说一下这里会出现只有点击字才能跳转的问题

有两种解决方法:

  1. 将CSS中a标签设置为width:100%.这样就能响应整个标签点击了,坏处是不符合解耦合思想,改变了原本的页面布局
  2. 如果想要解耦合可改写为
<v-tabs>
<v-tab v-for="tab of tabs" :key="tab.id" :to="tab.route" ripple>
        {{tab.name}}
      </v-tab>
      
 <!--    如果想要保存tabs切换的效果-->
      <!--      <v-tab-item id="/articles">-->
      <!--        <router-view v-if="active === '/articles'" />-->
      <!--      </v-tab-item>-->
      <!--      <v-tab-item id="/essence">-->
      <!--        <router-view v-if="active === '/essence'" />-->
      <!--      </v-tab-item>-->
      <!--      <v-tab-item id="/school">-->
      <!--        <router-view v-if="active === '/school'" />-->
      <!--      </v-tab-item>-->
    </v-tabs>
    <router-view/>    
    

子组件

//pages/parent/child1.vue 其他情况类似

<template>
  <v-card>
    <v-card-text>
      全部
      foobar:{{foobar}}
    </v-card-text>
  </v-card>
</template>
<script>
  export default {
    props: ['foobar']
  }
</script>

实现效果

对应页面url也会做相应的改变

参考资料

bbs.huaweicloud.com/blogs/13870…

www.jeepxie.net/article/145…

zh.nuxtjs.org/examples/ne…

diamondfsd.com/nuxt.js-nux…