【问题标题】:Proper way to specify routes on Vue Components在 Vue 组件上指定路由的正确方法
【发布时间】:2017-10-09 14:41:39
【问题描述】:

从 Angular 2/4 开始,我们会像这样进行路由:

guide.component.ts:

@Component({
  selector: 'app-guide',
  templateUrl: './guide.component.html',
  styleUrls: ['./guide.component.scss']
})
export class GuideComponent implements OnInit, OnDestroy {

guide-routing.module.ts:

const routes: Routes = [
  {
    path: 'guide/:layout',
    component: GuideComponent
  }
];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule]
})
export class GuideRoutingModule { }

guide.module.ts:

@NgModule({
  imports: [
    CommonModule,
    // Routing comes last
    GuideRoutingModule

我认为这是一种非常好的方式,因为无论什么消耗 GuideComponent 都不必关心什么、如何或是否有路线。

在 Vue 中,我们不得不将路由一直向下传递到 app.ts:

detail.component.ts:

@Component({
  template,
  name: 'Detail',
  components: {
    Something
  }
})
export class Detail extends Vue {

detail.route.ts:

export const detailRoute: RouteConfig = {
  path: '/detail/:id',
  component: Detail,
  props: (route: Route) => ({
    state: route.query.state
  })
};

component.routes.ts:

export const componentRoutes = [
  detailRoute
];

core.route.ts:

export const coreRoute = {
  path: '/',
  component: Core,
  props: (route: Route) => ({
    showPlayer: route.query.player === 'true' || !route.query.player
  }),
  children: [
    ...componentRoutes
  ]
};

app.ts:

const router = new VueRouter({
  routes: [coreRoute]
});

// Bootstrap Vue app
export default new Vue({
  store,
  router,

有没有更好/更清洁的方法来做到这一点?也许这样组件就消耗了路由本身,并且路由不必沿着层次结构向下移动?

【问题讨论】:

    标签: typescript vue.js vuejs2 vue-component vue-router


    【解决方案1】:

    有没有更好/更清洁的方法来做到这一点?

    总是,只要给它一个月,然后回到你的代码。

    也许让组件消耗了路由本身和路由 不必沿着层级向下走?

    我不熟悉 TypeScript,但您可以从组件本身访问路由,而无需将其传递到层次结构中。这是一个 JavaScript 示例。

    app.js

    import Vue from 'vue'
    import VueRouter from 'vue-router'
    
    Vue.use(VueRouter)
    
    import store from './vuex/store'
    import {router} from './router'
    
    new Vue({
      store,
      router
    }).$mount('#app')
    

    router.js

    import VueRouter from 'vue-router'
    import Detail from './components/Detail.vue'
    
    export var router = new VueRouter({
      name: 'Router',
      linkActiveClass: 'active',
      routes: [
        {
          path: '/detail/:id',
          component: Detail
        }
      ]
    })
    

    Detail.js

    export default {
      name: 'Detail',
      components: {
        Something
      },
      data () {
        return {
          query: '',
          changed: false
        }
      },
      mounted () {
        this.query = this.$route.query 
      }
    

    如果您希望访问全局数据,我会查看 Vuex,它专为具有更复杂数据结构的应用程序而设计。

    编辑

    好的,现在我明白了。我找到了这个discussion。结帐this.$router.addRoutes() 它不会替换现有组件,但会即时添加它们。

    【讨论】:

    • 我们现在正在做类似的事情,我不太喜欢它;我想要的是在组件上定义路由,所以当我引入组件时,路由会随之而来(就像 Angular 的模块一样)。
    • 更新了我的答案。
    • 我们最终决定不再尝试像对待 Angular 一样对待 Vue。它不支持模块,因此嵌套的应用程序层次结构很难实现。我们认为 Vue 更适合扁平化架构。
    猜你喜欢
    • 2021-04-27
    • 2019-04-07
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    相关资源
    最近更新 更多