Vuejs2模式与vue-router

时间:2017-06-16 21:17:44

标签: vue.js

我正在尝试使用模态创建路由,当您使用路由器访问此路由器路径时,路径会在当前页面上方显示模式,或者如果我直接从URL访问,则会显示带有模式的索引。

例如:我在http://localhost/profile/1并点击侧栏创建团队,网址更改为http://localhost/team/create,但模式后面的页面仍为http://localhost/profile/1

这是我正在尝试的代码:

路由器:

Vue.component('modal', Modal);    
export default new Router({
      mode: 'history',
      routes: [
       {
        path: '/',
        name: 'Hello',
        component: require('@/components/Hello'),
        meta: { auth: false }
      },

      {
        path: '/team',
        name: 'team',
        component: require('@/components/team/Index'),
        meta: { auth: true },
      },
      {
        path: '/team/create',
        name: 'CreateTeam',
        components: {
          b: CreateTeam
        },
        meta: { auth: true }
      },  
      ]
    })

App.vue

<template>

  <router-view></router-view>
  <!-- This is the "MODAL" router-view -->
  <router-view name="b"></router-view>              

</template>

Modal.vue

<template>
    <div class="modal">

      <slot name="body"></slot>  
        <button type="button" @click="$emit('close')">×</button>
   </div>
</template>

CreateTeam.vue

<template>
    <modal @close="vm.$router.go(-1)">

        <div slot="body" class="col-md-12">
        <!-- Form here -->
        </div>

    </modal>
</template>

一切正在发挥作用,当我去模仿后面的/创建/团队是空的

2 个答案:

答案 0 :(得分:4)

如果有人需要这个解决方案,我就这样解决了:

我创建了一个组件create-team Vue.component('create-team',CreateTeam),我将它放在App.vue中,如下所示:

<create-team v-if="CreateTeam"></create-team>  

在同一个App.vue中,我使用vuex getter创建了一个计算器:

computed: {

    CreateTeam() {
         return store.getters.createTeam
    }
  },

在补充工具栏中,我创建了一个这样的链接:

 <a @click="CreateTeam" class="user-panel-action-link" href="/create/team">
   <i class="fa fa-users" aria-hidden="true"></i> Crear Equipo
 </a>

一个方法CreateTeam

CreateTeam(e) {
      e.preventDefault()
      store.commit('setTeamModal')
      history.pushState('', 'Title of page', '/create/team');

    }

store.js vuex很简单:

const state = {

    createTeam: false,
}

const mutations = {

    setTeamModal (state) {
      state.createTeam= true
    },
    deleteTeamModal (state) {
      state.createTeam= false
    }
}

const actions = {
    setTeamModal: ({ commit }) => commit('setTeamModal')
   deleteTeamModal: ({ commit }) => commit('setTeamModal')
}

const getters = {

    createTeam: state => state.createTeam
}

export default new Vuex.Store({
    state,
    getters,
    actions,
    mutations
})

最后一件事是在CreateTeam.vue组件中,Close方法我做了这样的事情:

 Close() {
      this.$store.commit('deleteTeamModal')
      this.$router.go(-1)
    }

  }

也许有人可以做得更好,这是我的小帮助

问候

答案 1 :(得分:1)

如果其他人正在寻找解决类似问题的方法,则会提供一个不错的here。 在重定向到模式路由之前,请以编程方式更改命名路由的组成部分。使用登录/注册模式对我来说像是一种魅力。
我的笔记:
1.确保模式路由不是任何路由的子级(默认路由组件存在一些问题)。
2.考虑在模式关闭按钮上添加router.back()

router.js
    ...
    {
      path: '/',
      name: 'home',
      component: Home,
      meta: {
        twModalView: true
      }
    },
    {
      path: '/directAccess',
      name: 'directAccess',
      component: DirectAccess
    },
    ...
    {
      path: '/:userId/tweet/:id',
      name: 'userTweet',
      beforeEnter: (to, from, next) => {
        const twModalView = from.matched.some(view => view.meta && view.meta.twModalView)

        if (!twModalView) {
          //
          // For direct access
          //
          to.matched[0].components = {
            default: TweetSingle,
            modal: false
          }
        }

        if (twModalView) {
          //
          // For twModalView access
          //
          if (from.matched.length > 1) {
            const childrenView = from.matched.slice(1, from.matched.length)
            for (let view of childrenView) {
              to.matched.push(view)
            }
          }
          if (to.matched[0].components) {
            to.matched[0].components.default = from.matched[0].components.default
            to.matched[0].components.modal = TweetModal
          }
        }

        next()
      }
    },
    ...