我正在尝试使用模态创建路由,当您使用路由器访问此路由器路径时,路径会在当前页面上方显示模式,或者如果我直接从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>
一切正在发挥作用,当我去模仿后面的/创建/团队是空的
答案 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()
}
},
...