vue——详细页返回列表页,不刷新,保留列表页原来停留位置

经常有这样的功能,从列表页上选择一项,跳到详细页,详细页看完,返回列表页。这时,列表页的组件会重新创建,也就是要重新从接口请求一次数据,并且会回到第一行,对于数据更新要求不高的业务来说,这样会浪费资源,而且体验页不好(列表一共100条,滑动到了90条了,点进去看好明细,出来,看到的是第1条,想看91条,还得滑下去)。那么怎么能返回到列表页后不刷新呢

①路由文件:

export default new Router({
  routes: [
    {
      path: '/hello',
      name: 'HelloWorld',
      component: HelloWorld,
      meta: {
        keepAlive: true // 需要缓存
      }
    },
    {
      path: '/hello2',
      name: 'HelloWorld2',
      component: HelloWorld2,
      meta: {
        keepAlive: false // 不需要缓存
      }
    }
  ],
  mode: 'history',
  scrollBehavior (to, from, savedPosition) {
    if (savedPosition) {
      return savedPosition
    } else {
      return { x: 0, y: 0 }
    }
  }
})

②app.vue中的router-view,外面套一层keep-alive

<keep-alive>
    <router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"></router-view>

从详细页回到列表页,要用

this.$router.back()

用push()是不能保留滚动条停留位置的。

 

另外,滚动条停留位置,保留的似乎是<body>滚动条的位置。如果路由是在body内部一个div中滚动,body没有滚动条,不会保留这个div的滚动停留位置

 

vue版本在2.1.0之后,新增了include 和 exclude

以上代码可改成:

export default new Router({
  routes: [
    {
      path: '/hello',
      name: 'HelloWorld',
      component: HelloWorld
    },
    {
      path: '/hello2',
      name: 'HelloWorld2',
      component: HelloWorld2
    }
  ],
  mode: 'history',
  scrollBehavior (to, from, savedPosition) {
    if (savedPosition) {
      return savedPosition
    } else {
      return { x: 0, y: 0 }
    }
  }
})


<keep-alive :include="['HelloWorld']">
    <router-view></router-view>
</keep-alive>

include,exclude的用法

<keep-alive include="a,b">
<keep-alive :include="/a|b/">
<keep-alive :include="['a', 'b']">

具体看官方文档

 
  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Vue.js 2和Element UI中,可以使用路由导航和事件总线来实现新增后返回列表刷新面的效果。 1. 在路由导航中定义列表的路由 首先,在路由配置中定义列表的路由,例如: ```javascript const router = new VueRouter({ routes: [ { path: '/list', component: List }, { path: '/add', component: Add } ] }) ``` 其中,List为列表的组件,Add为新增的组件。 2. 在新增中提交数据并触发事件 在新增中,通过Element UI的Form组件提交新增数据,并在提交成功后触发一个自定义事件,例如: ```html <template> <el-form @submit="onSubmit"> <!-- 表单字段 --> <el-button type="primary" native-type="submit">提交</el-button> </el-form> </template> <script> export default { methods: { onSubmit() { // 提交新增数据 this.$http.post('/api/add', this.formData) .then(response => { // 触发自定义事件 this.$emit('add-success') }) } }, data() { return { formData: {} } } } </script> ``` 在提交成功后,通过`this.$emit`触发一个自定义事件`add-success`,表示新增成功。 3. 在列表中监听自定义事件并刷新数据 在列表中,监听新增触发的自定义事件,并重新加载列表数据,例如: ```html <template> <div> <el-table :data="tableData"> <!-- 表头和列 --> </el-table> <el-button type="primary" @click="add">新增</el-button> </div> </template> <script> export default { mounted() { // 监听新增成功事件 this.$bus.$on('add-success', this.loadList) // 加载列表数据 this.loadList() }, beforeDestroy() { // 移除事件监听 this.$bus.$off('add-success', this.loadList) }, methods: { add() { // 跳转到新增 this.$router.push('/add') }, loadList() { // 加载列表数据 this.$http.get('/api/list') .then(response => { this.tableData = response.data }) } }, data() { return { tableData: [] } } } </script> ``` 在列表的`mounted`钩子函数中,通过`this.$bus.$on`监听新增成功事件`add-success`,并在回调函数中调用`loadList`方法重新加载列表数据。在`beforeDestroy`钩子函数中,通过`this.$bus.$off`移除事件监听,避免内存泄漏。 在`add`方法中,使用`this.$router.push`跳转到新增。在新增中提交成功后,通过`this.$emit('add-success')`触发自定义事件,列表会收到通知并重新加载数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值