php执行router,vue router动态路由操作子路由

这次给大家带来vue router动态路由操作子路由,的注意事项有哪些,下面就是实战案例,一起来看一下。

vue-router 之动态路由vue-router官网上面是这样说的

// 带查询参数,变成 /register?plan=private

router.push({ path: 'register', query: { plan: 'private' }})

然后,我就这样写了:

this.$router.push({path:'manage', query: {id: 'tasklist'}})1

结果很明显,失败了。然后我就默默的再次看了一下官网,结果发现了这句话

// 命名的路由

router.push({ name: 'user', params: { userId: 123 }})

// 带查询参数,变成 /register?plan=private

router.push({ path: 'register', params: { plan: 'private' }})

注意:如果提供了 path,params 会被忽略,上述例子中的 query 并不属于这种情况。取而代之的是下面例子的做法,你需要提供路由的 name 或手写完整的带有参数的 path:

const userId = 123

router.push({ name: 'user', params: { userId }}) // -> /user/123

router.push({ path: `/user/${userId}` }) // -> /user/123

// 这里的 params 不生效

router.push({ path: '/user', params: { userId }}) // -> /user

谨记啊,动态实现二级路由,需要先用变量保存二级路由名称(let router = 'tasklist'),然后调用this.$router.push({path: `/user/${router}`}).

下面看下vue router动态路由下让每个子路由都是独立组件的解决方案

因为 vue-router 对嵌套路由采用的是组件复用策略,这在大部分场景的确是高效的做法,但是如果遇到这种情况:

7ace36a8c27e996b5a12544876d7edb1.gif

就是要求多个子路由共活,并且有频繁来回切换需求的话,就很希望能让每个子路由都是独立组件了,虽然可以通过监听路由切换watch: {

'$route'(to) {

if (to.meta.path === '/page/buy-details') {

this.id = to.params.id;

this.state()

}

}

},

去实时处理更新的数据,我之前一直都是这么做的,包括上面那副动图的页面,但是这真的很麻烦,要让用户切换中准确的回到切换前页面的显示状态,要考虑的东西太多,于是想出了一个解决方案:

子路由组件不涉及实际业务代码,只维护一个打开过的id列表,路由切换到这边时,判断id,没打开过的添加,通过这个列表循环出实际的子路由组件,v-show当前id的,这样就能实现每个实例都是独立的了

我按这个思路写出一个 mixins

details-page.jsexport default {

watch: {

'$route'(to, from) {

this.detailsLeave(from);

this.detailsOpen(to);

}

},

data() {

return {

pagePath: '',

pageId: 0,

pages: {}

}

},

methods: {

/**

* 子页面打开触发

* @param route

*/

detailsOpen(route) {

if (this.detailsPathGet(route.path) === this.pagePath) {

if (!this.pages[route.params.id]) {

this.$set(this.pages, route.params.id, {

id: route.params.id,

scrollTop: 0

})

}

//路由打开 跳转滚动条

this.pageId = route.params.id;

this.$nextTick(()=>{

this.$parent.$el.firstChild.scrollTop = this.pages[route.params.id].scrollTop;

});

}

},

/**

* 路由切换触发

* 判断离开的路由是否是当前页面,如果是则记录滚动条高度

* @param route

*/

detailsLeave(route) {

if (this.detailsPathGet(route.path) === this.pagePath) {

if (this.pages[route.params.id]) {

//记录滚动条高度 此处针对ea-admin后台 不同的框架要记录的滚动条el不同

this.pages[route.params.id].scrollTop = this.$parent.$el.firstChild.scrollTop ;

}

}

},

/**

* 子页面关闭函数

* @param id

*/

detailsClose(id) {

delete this.pages[id]

},

/**

* 取路由不含最后一项参数的地址

* @param path

* @returns {string}

*/

detailsPathGet(path) {

const i = path.lastIndexOf('/');

return path.substr(0, i);

}

},

mounted() {

//通过当前路由地址创建页面识别地址 注:只对path: '/user/:id' 有效 当 path: /user/:id/profile 失效

this.pagePath = this.detailsPathGet(this.$route.path);

//执行第一次子页面打开

this.detailsOpen(this.$route);

//监听标签关闭消息 此处针对ea-admin后台 不同框架监听关闭方式不同

this.$tabs.onRemove((page, next) => {

//收到标签关闭回调,判断关闭的是否是当前页面

if (page._path === this.pagePath) {

//触发子页面删除

this.detailsClose(page.id)

}

next()

})

}

}

Details.vue

v-for="item in pages"

:id="item.id"

:key="item.id"

v-show="item.id === pageId">

import YourComponent from '';

import detailsPage from '../mixins/details-page'

export default {

name: 'DetailsPage',

components: {YourComponent},

mixins: [detailsPage],

}

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值