首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >路由器中断广告选项卡

问路由器中断广告选项卡
EN

Stack Overflow用户
提问于 2020-08-24 19:50:51
回答 2查看 284关注 0票数 0

我有一些vuetify选项卡,在我添加路由之前,它们可以按预期工作。我希望当活动选项卡更改时,路由也会更改。

当我将:to指令添加到v-tab时,路由可以正常工作(当选项卡更改时,路由也会更改),但是选项卡项不会显示。显示v-tab-item的区域现在为空。

代码语言:javascript
复制
<v-tabs v-model='activeTab'>
  <v-tab
    v-for='cc in cost_centres'
    :key='cc.id'
    :to="{ name: 'Element', params: {id: cc.id}}"
    >
    {{ cc.name }}
  </v-tab>
  <v-tabs-items v-model='activeTab'>
    <v-tab-item 
      v-for='cc in cost_centres' 
      :key='cc.id'>
      <!-- Content -->
    </v-tab-item>
  </v-tabs-items>
</v-tabs>

vuetify文档引用了vue-router文档,我认为我把它连接起来是正确的,但我就是不能让它工作。我遗漏了什么?

EN

回答 2

Stack Overflow用户

发布于 2020-09-07 20:21:24

:to正在将v-tab的value以及v-tabs的v-model设置为路径,而不是id (或数组的索引)。

因此,我删除了:to指令并对v-model执行watched操作。当v-model发生变化时,我提取了值(数组的索引),并使用它来获取成本中心id,然后使用router.push设置路由

在页面加载(挂载)中,我使用路由参数(成本中心id)来查找模型索引并设置activeTab v- cost_centre。

票数 1
EN

Stack Overflow用户

发布于 2020-08-25 02:58:30

您可以使用<router-view>而不是<v-tabs-items>

​

代码语言:javascript
复制
const Foo = {
  computed: {
    id() {
      return this.$route.params.id || ''
    }
  },
  template: '<v-card flat>foo {{ id }}</v-card>'
}
const Bar = {
  computed: {
    id() {
      return this.$route.params.id || ''
    }
  },
  template: '<v-card flat>bar {{ id }}</v-card>'
}

const routes = [{
    path: "/",
    redirect: {
      name: "foo"
    }
  },
  {
    path: "/foo",
    name: "foo",
    component: Foo
  },
  {
    path: "/bar",
    name: "bar",
    component: Bar
  }
]

const router = new VueRouter({
  routes
})

new Vue({
  el: '#app',
  router,
  vuetify: new Vuetify(),
  data() {
    return {
      activeTab: "foo",
      cost_centres: [{
          id: 1,
          name: "foo"
        },
        {
          id: 2,
          name: "bar"
        },
      ]
    }
  },
  watch: {
    $route: function(val) {
      console.log(val)
    }
  },
  mounted() {
    console.log(this.$route)
  }
})
代码语言:javascript
复制
<link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/@mdi/font@5.x/css/materialdesignicons.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/vue@2.x/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.js"></script>
<div id="app">
  <v-app>
    <v-container>
      <v-row>
        <v-col>
          <v-tabs v-model="activeTab">
            <v-tab v-for="cc in cost_centres" :key="cc.id" :to="{ name: cc.name, params: { id: cc.id }}">
              {{ cc.name }}
            </v-tab>
          </v-tabs>
          <router-view></router-view>
        </v-col>
      </v-row>
    </v-container>
  </v-app>
</div>

​

这样,内容不是由v-model同步的,而是由:to & routes同步的。

编辑:新解决方案

如果仅使用路由的查询部分,则可以控制选项卡:

​

代码语言:javascript
复制
const routes = [{
    path: "/",
    redirect: {
      path: "/0"
    }
  },
  {
    path: "/:idx",
    name: "foo"
  }
]

const router = new VueRouter({
  routes
})

new Vue({
  el: '#app',
  router,
  vuetify: new Vuetify(),
  data() {
    return {
      activeTabRoute: 0,
      activeTab: 0,
      cost_centres: [{
          id: 0,
          name: "foo"
        },
        {
          id: 1,
          name: "bar"
        },
      ]
    }
  },
  watch: {
    $route: function(val) {
      this.activeTab = val.params.idx
    }
  }
})
代码语言:javascript
复制
<link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/@mdi/font@5.x/css/materialdesignicons.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/vue@2.x/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.js"></script>
<div id="app">
  <v-app>
    <v-container>
      <v-row>
        <v-col>
          <v-tabs v-model="activeTabRoute">
            <v-tab v-for="(cc, i) in cost_centres" :key="cc.id" :to="{ name: 'foo', params: { idx: i } }">
              {{ cc.name }} {{ cc.id }} {{ activeTab }}
            </v-tab>
          </v-tabs>
          <v-tabs-items v-model="activeTab">
            <v-tab-item v-for="cc in cost_centres" :key="cc.id">
              <v-card flat>
                Name: {{ cc.name }}<br /> ID: {{ cc.id }}<br /> IDx: {{ $route.params.idx }}
              </v-card>
            </v-tab-item>
          </v-tabs-items>
        </v-col>
      </v-row>
      <v-row>
        <v-col>$route: {{ $route }}</v-col>
      </v-row>
    </v-container>
  </v-app>
</div>

​

我创建了上面的代码片段来使用for...in的index,因为它反映了选项卡的顺序,而不会弄乱项的I。

这样,您就可以将此组件与vue-router一起使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63560482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档