开发那些事儿:vue this.$router.go(-1);怎么带参数

320 阅读1分钟

问题:

B页面为多个页面可以进入,

B进行删除操作后this.$router.go(-1)返回上一个页面。

此时A页面列表页使用keepalive,进入B页面删除操作后返回A页面列表不刷新 (不使用vuex)

环境:

vue2.0

解决方法:

通过申明一个vue空模块,利用$emit发送通知

创建eventbus.js文件

import Vue from 'vue'

/**
 * 定义空的vue实例,作为 eventbus实现非父子组件之间的通信(vue2.x中去掉了broadcast)
 */
var eventBus = new Vue({});
export default eventBus;

删除操作后$emit触发事件

import EventBus from '../components/eventBus';

EventBus.$emit('info', 'delete');
this.$router.go(-1);

A列表页面中$on监听事件

import EventBus from '../components/eventBus';

 activated(){
      //根据key名获取传递回来的参数,data就是map
      EventBus.$on('addressInfo', function(data){
        console.log(data,"data");
      }.bind(this));
    },

出现问题:

第一次进入$on并没有监听到事件

原因: emit先于emit 先于on 执行了,Vue并没有储存监听事件,所以无法监听到数据

解决:利用eventBus来解决,而且组件不直接通过$on来存储数据,而是利用eventBus实例来存储数据,然后组件只负责来获取数据。

eventbus.js文件

// 创建vue实例,作为中间件进行数据传递
import Vue from 'vue'
export const EventBus = new Vue({
  data () {
    return {
      // 定义数据
      data: {}
    }
  },
  created () {
    // 绑定监听
    this.$on('info', (value)=>{
      this.data = value;
    })
  }
})

删除操作后$emit触发事件

import {EventBus} from '../components/eventBus';

EventBus.$emit('info', 'delete');
this.$router.go(-1);

A列表页面中$on监听事件

import {EventBus} from '../components/eventBus';

activated() {
    if(EventBus.data == 'delete') { // 直接获取传送的数据
      this.finished = false;
      this.page = 0;
      this.loadmore();
    }
  }